比較運算子

代幣 名稱 描述
= 等於 如果左側和右側運算元相等,則返回 True。請注意,這是賦值運算子的過載。
<> 不等於 如果左側和右側運算元不相等,則返回 True
> 比…更棒 如果左側運算元大於右側運算元,則返回 True
< 少於 如果左側運算元小於右側運算元,則返回 True
>= 大於或等於 如果左側運算元大於或等於右側運算元,則返回 True
<= 小於等於 如果左側運算元小於或等於右側運算元,則返回 True
Is 參考權益 如果左側物件引用與右側物件引用的例項相同,則返回 True。它也可以與 Nothing(空物件引用)一起使用。注意: 在執行比較之前,Is 運算子將嘗試將兩個運算元強制轉換為 Object。如果任一方是基本型別不包含物件的 Variant(非物件子型別或 vtEmpty),則比較將導致執行時錯誤 424 - 需要物件。如果任一運算元屬於同一物件的不同介面,則比較將返回 True。如果你需要測試例項介面的權益,請改用 ObjPtr(left) = ObjPtr(right)

筆記

VBA 語法允許比較運算子的,但通常應避免使用這些結構。總是一次只在 2 個運算元上從左到右執行比較,並且每個比較產生一個 Boolean。例如,表示式……

a = 2: b = 1: c = 0
expr = a > b > c

……可以在某些情況下閱讀,作為對 b 是否在 ac 之間的測試。在 VBA 中,評估如下:

a = 2: b = 1: c = 0
expr = a > b > c
expr = (2 > 1) > 0
expr = True > 0
expr = -1 > 0 'CInt(True) = -1
expr = False

除了使用 Object 作為運算元的 Is 之外的任何比較運算子都將在 Object預設成員的返回值上執行。如果物件沒有預設成員,則比較將導致執行時錯誤 438 - 物件不支援其屬性或方法

如果 Object 未初始化,則比較將導致執行時錯誤 91 - 物件變數或未設定塊變數

如果文字 NothingIs 以外的任何比較運算子一起使用,則會導致編譯錯誤 - 物件的無效使用

如果 Object 的預設成員是另一個 Object ,則 VBA 將不斷呼叫每個連續返回值的預設成員,直到返回基本型別或引發錯誤。例如,假設 SomeClass 有一個預設成員 Value,它是 ChildClass 的一個例項,預設成員為 ChildValue。比較……

Set x = New SomeClass
Debug.Print x > 42

……將被評估為:

Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42

如果任一運算元是數字型別而另一個運算元是子型別 StringStringVariant,則將執行數字比較。在這種情況下,如果 String 無法轉換為數字,則比較將產生執行時錯誤 13 - 型別不匹配

如果兩個運算元都是 StringVariant 的子型別 String,則將根據程式碼模組的 Option Compare 設定執行字串比較。這些比較是逐個字元地進行的。注意,字元表示包含數字的 String 的是一樣的數值的比較:

Public Sub Example()
    Dim left As Variant
    Dim right As Variant
    
    left = "42"
    right = "5"
    Debug.Print left > right              'Prints False
    Debug.Print Val(left) > Val(right)    'Prints True
End Sub

因此,在對它們執行數值不等式比較之前,請確保將 StringVariant 變數強制轉換為數字。

如果一個運算元是 Date,如果另一個運算元是數字或者可以轉換為數字型別,則將執行基礎 Double 值的數字比較。

如果另一個運算元是 StringVariant 的子型別 String,可以使用當前語言環境轉換為 Date,則 String 將被轉換為 Date。如果無法將其轉換為當前語言環境中的 Date,則比較將產生執行時錯誤 13 - 型別不匹配

在對 DoubleSingle 值與布林值進行比較時應該小心。與其他數字型別不同,由於 VBA 將涉及浮點數的比較的資料型別提升為 Double,因此不能將非零值假設為 True

Public Sub Example()
    Dim Test As Double
    
    Test = 42        Debug.Print CBool(Test)             'Prints True.
    'True is promoted to Double - Test is not cast to Boolean
    Debug.Print Test = True             'Prints False
    
    'With explicit casts:
    Debug.Print CBool(Test) = True      'Prints True
    Debug.Print CDbl(-1) = CDbl(True)   'Prints True
End Sub