比较运算符
代币 | 名称 | 描述 |
---|---|---|
= |
等于 | 如果左侧和右侧操作数相等,则返回 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