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 = 0vbTextCompare = 1vbDatabaseCompare = 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 Explicitset结果的模块中使用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 BinaryCompare未传递参数StrComp,则Access结果与Excel不一致,正如我们所期望的那样,仅当Access' Option Compare设置为Option Compare Text或者Option Compare DatabaseCompare参数传递给StrComp,当结果是整个Access和Excel一致,错误的异常vbDatabaseCompare与Excel中使用.Compare的参数值Empty传递给StrComp,结果是有一个隐含的默认一致的vbBinaryCompare.使用Option Explicit传递未声明/未分配变量的另一个论点可能会产生意外结果.Option Compare语句的模块中执行的代码之间是不同的.Compare调用中的参数时StrComp将默认为文本比较.Compare调用中的参数的模块内执行的代码StrComp将默认为该模块中的Option Compare设置.如果语句不存在,模块将默认为二进制,就像Excel一样.Option CompareCompare都将默认为二进制比较.| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |