vbCompareMethod的Enum成员中缺少vbUseCompareOption

时间:2018-07-22 00:53:46

标签: vba ms-access access-vba string-comparison collation

许多在线(包括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的特殊性,或者只是帮助中出现了广泛分布的错误?

3 个答案:

答案 0 :(得分:3)

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

vbComapreMethod

那么,当您尝试使用它时会发生什么?如您所见,使用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参数

enter image description here

答案 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 语句(如果存在)控制,否则默认值为二进制比较