默认的InStr for Access似乎是vbTextCompare,而Excel似乎是vbBinaryCompare。
任何人都可以确认和/或阐明为什么两个不同的Microsoft产品以不同的方式处理相同的代码。
答案 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
vbDatabaseCompare
区域设置ID
但是不清楚默认值是什么,所以你是正确的,当省略Compare
参数时,Excel和Access在立即窗口中表现出不同的行为:
'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不一致,正如我们所期望的那样,只有 才能访问{{1} }设置为Option Compare
或Option Compare Text
Option Compare Database
参数传递给Compare
时,Access和Excel之间的结果是一致的,但StrComp
与Excel一起使用时的错误除外。vbDatabaseCompare
参数值Compare
传递给Empty
时,结果与隐式默认值StrComp
一致。 使用vbBinaryCompare
的另一个论点是,传递未声明/未分配的变量可能会产生意外结果。Option Explicit
语句的模块中执行的代码之间的Access结果不同。Option Compare
调用中忽略了Compare
参数,默认为文本比较。StrComp
调用中忽略Compare
参数的模块内执行的代码将默认为中的StrComp
设置模块。如果没有Option Compare
语句,模块将默认为 Binary ,就像Excel一样。Option Compare
参数的所有代码将默认为二进制比较。答案 1 :(得分:3)
InStr
函数是一个Variant
- 返回函数,它位于VBA标准库Strings
的{{1}}模块中,该模块包含在每个VBA项目中,无论主持人。
如果未指定可选参数,则采用其默认值VBE7.DLL
:
现在,这是在Excel中,我没有MS-Access进行测试,但除非MS-Access附带自定义编译的VBA7.DLL标准库(略微不太可能),函数的签名是相同的,这意味着函数在所有VBA主机应用程序中的行为完全相同。
除此之外,字符串比较由模块选项vbBinaryCompare
驱动,在MS-Access中默认为Option Compare
,在其他主机中默认为Option Compare Database
。有关该模块选项的所有信息均可在MSDN上找到。