Sch*_*ton 2 excel ms-access vba
默认的InStr for Access似乎是vbTextCompare,而Excel似乎是vbBinaryCompare.
任何人都可以确认和/或阐明为什么两个不同的Microsoft产品以不同的方式处理相同的代码.
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 Explicit
set结果的模块中使用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数据库具有可以读取的collation属性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
传递未声明/未分配变量的另一个论点可能会产生意外结果.Option Compare
语句的模块中执行的代码之间是不同的.Compare
调用中的参数时StrComp
将默认为文本比较.Compare
调用中的参数的模块内执行的代码StrComp
将默认为该模块中的Option Compare
设置.如果语句不存在,模块将默认为二进制,就像Excel一样.Option Compare
Compare
都将默认为二进制比较.