VBA InStr Excel与Access

Access的默认InStr似乎是vbTextCompare和Excel似乎是vbBinaryCompare。

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

TL; DR – 在Access中,即时窗口没有模块级别的Option Compare语句,但缺省情况下默认为不同于Excel的缺省值,而对于不包含Option Compare语句。 。 跳到结论为具体。

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

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

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

 ?IsEmpty(vbUseCompareOption) True 

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

并试图使用Option Explicit模块中的vbUseCompareOption结果Compile Error: Variable not defined ,所以放宽Option Explicit规则,允许以下两行是等价的:

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

该文件还说,您可以提供一个区域设置ID,例如: 1033美国英语,或1036法国法国。 我不知道英语和法语之间的任何sorting规则差异来testing,但可能有一些对于各种代码页,值得注意的是,SQL Serversorting规则不是Windowssorting规则相同,所以看起来有可能是sorting规则是与Windows位置不一样。 请参阅整理types 。

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

隐式比较

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

 '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不一致,正如我们所期望的那样, 只有当Access的Option Compare设置为Option Compare Text或者Option Compare Database
  • Compareparameter passing给StrComp ,结果在Access和Excel中保持一致,但在Excel中使用vbDatabaseComparevbDatabaseCompare错误。
  • EmptyCompare参数值传递给StrComp ,结果与vbBinaryCompare的隐式默认值一致。 另一个使用Option Explicit作为传递未声明/未分配variables的参数可能会产生意想不到的结果。
  • Access中的结果在立即窗口中执行的代码与具有Option Compare语句的模块中执行的代码之间是不同的。

结论

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

InStr函数是一个Variant返回函数,位于每个VBA项目中包含的VBA标准库VBE7.DLLStrings模块中,而不pipe主机。

Excel中的InStr

当可选参数没有被指定时,它的默认值是vbBinaryCompare

智能感知

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

在对象浏览器中


除此之外,string比较由模块选项“ Option Compare驱动,该选项在MS-Access中默认为Option Compare Database ,而在其他主机中则默认为Option Compare Binary 。 有关该模块选项的所有信息在MSDN上可用。