比较运算符

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