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
参数的值为vbBinaryCompare
或vbTextCompare
时,它们会共享相同的结果
'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
- 将
Compare
parameter passing给StrComp
,结果在Access和Excel中保持一致,但在Excel中使用vbDatabaseCompare
时vbDatabaseCompare
错误。 - 将
Empty
的Compare
参数值传递给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.DLL
的Strings
模块中,而不pipe主机。
当可选参数没有被指定时,它的默认值是vbBinaryCompare
:
现在,这是在Excel中,我没有MS-Accesstesting,但除非MS-Access附带一个自定义编译的VBA7.DLL标准库( 稍不可能),函数的签名将是相同的,这意味着函数在所有VBA主机应用程序中的行为完全相同。
除此之外,string比较由模块选项“ Option Compare
驱动,该选项在MS-Access中默认为Option Compare Database
,而在其他主机中则默认为Option Compare Binary
。 有关该模块选项的所有信息在MSDN上可用。