许多在线(包括Microsoft的在线帮助资源)(用于example)用于接受vbCompareMethod状态的功能,其中有4种可能的值:


vbUseCompareOption = -1'似乎不存在
vbBinaryCompare = 0
vbTextCompare = 1
vbDatabaseCompare = 2


但是我刚刚检查了Access 2000、2007和2016,它们似乎都没有在对象浏览器中列出vbUseCompareOption。如果设置了Option Explicit,则会出现编译错误,指出vbUseCompareOption是未定义的变量。

这是否意味着使用常量vbUseCompareOption而不使用Option Explicit的任何VBA都可能获得意外结果?

这是回溯到VBA的早期版本,还是Access的特殊性,或者仅仅是帮助中出现了广泛分布的错误?

最佳答案

看来您是对的,因为vbUseCompareOption不会作为枚举vbCompareMethod的成员而退出

vba - vbCompareMethod的Enum成员中缺少vbUseCompareOption-LMLPHP

那么,当您尝试使用它时会发生什么呢?如您所见,使用Option Explicit时会出现编译错误,因为未定义该名称的变量。

如果不使用Option Explicit(通常是个坏主意),则会在运行时创建一个变量,其类型为Variant,值为Empty。我进行了一项实验,看看会发生什么:

TL:DR-是的,您可能会得到意外的结果(始终使用二进制比较)

我创建了两个模块,一个使用Option Compare Binary,另一个使用Option Compare text。我将StrComp用作使用Compare参数的测试函数。

模块一

'Option Explicit
Option Compare Text

Sub DemoText()
    Dim a As String, b As String
    a = "AAA"
    b = "aaa"
    Debug.Print "Option Comapre Text"
    Debug.Print "Text", "Binary", "Omitted", "vbUseCompareOption"
    Debug.Print StrComp(a, b, vbTextCompare), StrComp(a, b, vbBinaryCompare), StrComp(a, b), StrComp(a, b, vbUseCompareOption)
End Sub


模块二

'Option Explicit
Option Compare Binary

Sub DemoBinary()
    Dim a As String, b As String
    a = "AAA"
    b = "aaa"
    Debug.Print "Option Comapre Binary"
    Debug.Print "Text", "Binary", "Omitted", "vbUseCompareOption"
    Debug.Print StrComp(a, b, vbTextCompare), StrComp(a, b, vbBinaryCompare), StrComp(a, b), StrComp(a, b, vbUseCompareOption)
End Sub


考试

Sub Demo()
    DemoText
    DemoBinary
End Sub


结果

Option Comapre Text
Text          Binary        Omitted       vbUseCompareOption
 0            -1             0            -1
Option Comapre Binary
Text          Binary        Omitted       vbUseCompareOption
 0            -1            -1            -1


并且,如果给它分配-1的值,则会出现运行时错误5“无效的过程调用或参数”

因此,vbUseCompareOption不存在,根据帮助提示,使用-1值创建它(或仅使用Compare:=-1调用函数)失败。

让VBA将其创建为变量(值为Empty)无效。始终使用二进制比较。

AFAICT,使用Option Compare设置的唯一方法是在函数调用中忽略Compare参数。

vba - vbCompareMethod的Enum成员中缺少vbUseCompareOption-LMLPHP

09-27 06:33