比較運算子
| 代幣 | 名稱 | 描述 |
|---|---|---|
= |
等於 | 如果左側和右側運算元相等,則返回 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