VBA InStr Excel与Access

Sch*_*ton 2 excel ms-access vba

默认的InStr for Access似乎是vbTextCompare,而Excel似乎是vbBinaryCompare.

任何人都可以确认和/或阐明为什么两个不同的Microsoft产品以不同的方式处理相同的代码.

Thu*_*ame 7

TL; DR - 在Access中,即时窗口没有要Option Compare声明的模块级语句,但默认为不同于Excel的默认值,以及与不包含Option Compare语句的Access模块​​不同的默认值..跳转到具体细节的结论.

Option Compare语句具有Intellisense,表明该值必须是以下成员VbCompareMethod:

  • vbBinaryCompare = 0
  • vbTextCompare = 1
  • vbDatabaseCompare = 2 '如果在非Access VBA中使用,则为运行时错误5

但是,Microsoft文档InStr更进一步,并指定值Compare也可能是vbUseCompareOption = -1,但vbUseCompareOption不在对象浏览器中,并Empty在Excel和Access中立即窗口中解析为未声明:

?IsEmpty(vbUseCompareOption)
True
Run Code Online (Sandbox Code Playgroud)

此外,尝试使用文字值-1作为Compare参数导致Runtime error 5: Invalid procedure call or argument,因此文档显然不是为了信任.

并尝试vbUseCompareOption在具有Option Explicitset结果的模块中使用Compile Error: Variable not defined,从而放宽Option Explicit规则,允许以下2行相同:

strcomp("A", "a", vbUseCompareOption)
strcomp("A", "a", Empty)
Run Code Online (Sandbox Code Playgroud)

文档还说明您可以提供区域设置ID,例如:1033美国英语或1036法语 - 法语.我不知道要测试的英语和法语之间的任何排序规则差异,但是可能有一些用于各种代码页,并且值得注意的是SQL Server排序规则与Windows排序规则不同,因此似乎Access排序规则是也与Windows位置不同.请参阅排序规则类型.

VBA似乎可能vbTextCompare使用Windows(或VBA风格)排序规则,并且vbDatabaseCompare(并且可能提供区域设置ID)执行Access-flavored SQL排序规则.您的Access数据库具有可以读取的collat​​ion属性CurrentDb.CollatingOrder,并且仅在用作参数时设置DBEngine.CompactDatabase.VBA似乎可能CollatingOrder在执行时使用该区域设置IDvbDatabaseCompare

隐含比较

但是不清楚默认值是什么,所以你是正确的,当省略Compare参数时,Excel和Access在立即窗口中表现出不同的行为:

'Excel
?strcomp("A","a")
-1 

'Access
?strcomp("A","a")
0 
Run Code Online (Sandbox Code Playgroud)

明确比较

但是当Compare参数提供值为vbBinaryCompare或时,它们共享相同的结果vbTextCompare

'Excel
?strcomp("A","a",vbBinaryCompare)
-1 
?strcomp("A","a",vbTextCompare)
0 

'Access
?strcomp("A","a",vbBinaryCompare)
-1 
?strcomp("A","a",vbTextCompare)
0 
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看具有Access Option Compare模块的各种设置的模块中的每个Access 设置会发生什么Option Compare.

                                       Compare Not | Compare  | Compare | Compare
Statement                            | specified   | Database | Binary  | Text   | Excel
StrComp("A", "a")                    |     -1      |     0    |   -1    |   0    |  -1
StrComp("A", "a", Empty)             |     -1      |    -1    |   -1    |  -1    |  -1
StrComp("A", "a", vbDatabaseCompare) |      0      |     0    |    0    |   0    | Error
StrComp("A", "a", vbBinaryCompare)   |     -1      |    -1    |   -1    |  -1    |  -1
StrComp("A", "a", vbTextCompare)     |      0      |     0    |    0    |   0    |   0
Run Code Online (Sandbox Code Playgroud)

意见

  • 如果Compare未传递参数StrComp,则Access结果与Excel一致,Option Compare未指定任何一个或指定为Option Compare Binary
  • 如果Compare未传递参数StrComp,则Access结果与Excel不一致,正如我们所期望的那样,当Access' Option Compare设置为Option Compare Text或者Option Compare Database
  • 当一个Compare参数传递给StrComp,当结果是整个Access和Excel一致,错误的异常vbDatabaseCompare与Excel中使用.
  • Compare的参数值Empty传递给StrComp,结果是有一个隐含的默认一致的vbBinaryCompare.使用Option Explicit传递未声明/未分配变量的另一个论点可能会产生意外结果.
  • Access中的结果在立即窗口中执行的代码与带有Option Compare语句的模块中执行的代码之间是不同的.

结论

  • 在Access中,在立即窗口中评估的代码在省略Compare调用中的参数时StrComp将默认为文本比较.
  • 在Access中,从省略Compare调用中的参数的模块内执行的代码StrComp将默认为该模块中的Option Compare设置.如果语句不存在,模块将默认为二进制,就像Excel一样.Option Compare
  • 在非Access VBA主机(例如Excel)中,省略可选参数的所有代码Compare都将默认为二进制比较.