许多在线(包括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的特殊性,或者只是帮助中出现了广泛分布的错误?
答案 0 :(得分:3)
您似乎是对的,因为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参数。
答案 1 :(得分:1)
这是一个很好的问题。我在Access团队中做了演讲。
该枚举成员似乎是who-knows-where的遗留对象,从未实现,现在可能会从文档中删除-优先级不是很高。
因此,总而言之,应该完全忽略对vbUseCompareOption
的所有提及。
答案 2 :(得分:0)
在 chris neilsen 的帖子中进行扩展:如果未指定 Option Compare 语句:
第三模块
'Option Explicit
Sub DemoNoOptionCompare()
Dim a As String, b As String
a = "AAA"
b = "aaa"
Debug.Print "No 'Option Compare'"
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 Demo2()
DemoText
DemoBinary
DemoNoOptionCompare
End Sub
结果
Option Compare Text
Text Binary Omitted vbUseCompareOption
0 -1 0 -1
Option Compare Binary
Text Binary Omitted vbUseCompareOption
0 -1 -1 -1
No 'Option Compare'
Text Binary Omitted vbUseCompareOption
0 -1 -1 -1
因此,省略 compare 参数时的默认值由 Option Compare 语句(如果存在)控制,否则默认值为二进制比较