比較運算子
代幣 | 名稱 | 描述 |
---|---|---|
= |
等於 | 如果左側和右側運算元相等,則返回 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
是否在 a
和 c
之間的測試。在 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 - 物件變數或未設定塊變數。
如果文字 Nothing
與 Is
以外的任何比較運算子一起使用,則會導致編譯錯誤 - 物件的無效使用。
如果 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
如果任一運算元是數字型別而另一個運算元是子型別 String
的 String
或 Variant
,則將執行數字比較。在這種情況下,如果 String
無法轉換為數字,則比較將產生執行時錯誤 13 - 型別不匹配。
如果兩個運算元都是 String
或 Variant
的子型別 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
因此,在對它們執行數值不等式比較之前,請確保將 String
或 Variant
變數強制轉換為數字。
如果一個運算元是 Date
,如果另一個運算元是數字或者可以轉換為數字型別,則將執行基礎 Double 值的數字比較。
如果另一個運算元是 String
或 Variant
的子型別 String
,可以使用當前語言環境轉換為 Date
,則 String
將被轉換為 Date
。如果無法將其轉換為當前語言環境中的 Date
,則比較將產生執行時錯誤 13 - 型別不匹配。
在對 Double
或 Single
值與布林值進行比較時應該小心。與其他數字型別不同,由於 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