许多在线(包括Microsoft的在线帮助资源)(用于example)用于接受vbCompareMethod
状态的功能,其中有4种可能的值:vbUseCompareOption = -1
'似乎不存在vbBinaryCompare
= 0vbTextCompare = 1
vbDatabaseCompare = 2
但是我刚刚检查了Access 2000、2007和2016,它们似乎都没有在对象浏览器中列出vbUseCompareOption
。如果设置了Option Explicit
,则会出现编译错误,指出vbUseCompareOption
是未定义的变量。
这是否意味着使用常量vbUseCompareOption
而不使用Option Explicit
的任何VBA都可能获得意外结果?
这是回溯到VBA的早期版本,还是Access的特殊性,或者仅仅是帮助中出现了广泛分布的错误?
最佳答案
看来您是对的,因为vbUseCompareOption
不会作为枚举vbCompareMethod
的成员而退出
那么,当您尝试使用它时会发生什么呢?如您所见,使用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参数。