VBA InStr Excel与Access

时间:2017-02-07 19:03:40

标签: excel vba ms-access

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

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

2 个答案:

答案 0 :(得分:7)

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

Option Compare语句具有建议的Intellisense,该值必须是VbCompareMethod的成员:

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

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

?IsEmpty(vbUseCompareOption)
True

此外,尝试使用-1的字面值作为Compare参数会产生Runtime error 5: Invalid procedure call or argument,因此很明显文档不是用于信任

尝试在vbUseCompareOption设置的模块中使用Option Explicit会导致Compile Error: Variable not defined,因此放宽Option Explicit规则,允许以下两行相等:< / p>

strcomp("A", "a", vbUseCompareOption)
strcomp("A", "a", Empty)

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

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

时,VBA似乎可能会使用vbDatabaseCompare区域设置ID

隐式比较

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

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

'Access
?strcomp("A","a")
0 

显式比较

但是当Compare参数的值为vbBinaryComparevbTextCompare

时,它们会共享相同的结果
'Excel
?strcomp("A","a",vbBinaryCompare)
-1 
?strcomp("A","a",vbTextCompare)
0 

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

现在,让我们看看模块中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

观察

  • Compare参数未传递给StrComp时,Access结果与Excel一致,时未指定Option Compare,或者被指定为Option Compare Binary
  • Compare参数未传递给StrComp时,Access结果与Excel不一致,正如我们所期望的那样,只有 才能访问{{1} }设置为Option CompareOption Compare Text
  • Option Compare Database参数传递给Compare时,Access和Excel之间的结果是一致的,但StrComp与Excel一起使用时的错误除外。
  • vbDatabaseCompare参数值Compare传递给Empty时,结果与隐式默认值StrComp一致。 使用vbBinaryCompare 的另一个论点是,传递未声明/未分配的变量可能会产生意外结果。
  • 立即窗口中执行的代码与带有Option Explicit语句的模块中执行的代码之间的Access结果不同。

结论

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

答案 1 :(得分:3)

InStr函数是一个Variant - 返回函数,它位于VBA标准库Strings的{​​{1}}模块中,该模块包含在每个VBA项目中,无论主持人。

InStr in Excel

如果未指定可选参数,则采用其默认值VBE7.DLL

IntelliSense

现在,这是在Excel中,我没有MS-Access进行测试,但除非MS-Access附带自定义编译的VBA7.DLL标准库(略微不太可能),函数的签名是相同的,这意味着函数在所有VBA主机应用程序中的行为完全相同。

in object browser

除此之外,字符串比较由模块选项vbBinaryCompare驱动,在MS-Access中默认为Option Compare,在其他主机中默认为Option Compare Database。有关该模块选项的所有信息均可在MSDN上找到。