在VBA中比较字符串的最佳方法是什么?

12

我过去一个月一直在使用VBA(工作需要),自从开始使用这种语言/脚本以来,有几次出现了比较字符串时出现问题的情况。到目前为止,我尝试过以下比较字符串的方法:

  • str1 = str2str1 <> str2
  • StrComp(str1, str2, comparisonMethod)
  • InStr(str1, str2)

有时在使用这些比较方法之前,我会先应用UCase(str1),甚至是UCase(Trim(str1))。但是从我的经验来看,VBA中比较字符串似乎是一件非常棘手的事情,因为我觉得结果不够一致。

问题:在VBA中,比较两个字符串最好的方法是什么

例如:假设有两个列表.. 一个列表包含笔记本型号,另一个包含零件号码。目标是将所有零件号与一个型号关联起来。我的结果只能部分成功地实现关联,也就是说,如果我有10个零件号码应该与一个型号相关联,只有5或6个实际上与之相关联。然后,我会在另一个代码中再次比较无法正确比较的字符串,并得到正确的结果。这种行为在我使用VBA时有些一致性,也是产生“感觉”的地方。


1
我觉得我的结果不一致 - 你怎么会有这种“二元”的感觉呢?请举一个例子说明你的方法没有返回预期的结果。 - Jonathan Applebaum
如果A和B在相同的情况下,并且具有相同(如果有的话)的前导/尾随空格,则A = B是100%可靠的 - 记住始终确保这两个条件为真,您将不会遇到任何问题。 - Alex K.
@Charles 也许你正在处理类似这样的情况:https://stackoverflow.com/questions/45120678/classic-asp-trying-to-search-a-string-in-another-string-variable-alternative/45121235#45121235 - Jonathan Applebaum
是的,我们需要一个例子。 - Hao Zhang
1个回答

22

首先要问的是,您想进行区分大小写的比较还是不区分大小写的比较——也就是说:"ABC" = "abc" 是否成立。

=运算符的行为由Option Compare来定义,默认值为binary

Option Compare text
sub foo1
    Debug.print "ABC" = "abc"    ' Prints "True"
end sub

Option Compare binary    ' <-- This is the default!
sub foo2
    Debug.print "ABC" = "abc"    ' Prints "False"
end sub

StrComp函数可以获得相同的结果,但不需要在模块顶部设置比较选项。相反,您可以将所需的比较方式作为参数给出:

StrComp函数可以获得相同的结果,但不需要在模块顶部设置比较选项。相反,您可以将所需的比较方式作为参数给出:

sub foo3
    Debug.Print StrComp("ABC", "abc", vbBinaryCompare) = 0     ' <-- Prints "False"
    Debug.Print StrComp("ABC", "abc", vbTextCompare) = 0       ' <-- Prints "True"
end sub

如果您的字符串中存在前导或尾随空格,在任何我所知道的编程语言中都必须使用 trim

使用 Instr 来检查两个字符串是否完全相同并不是一个好主意,您可以将其用于子字符串搜索。请注意,InStr(以及它的对应函数InstrRev)会使用 option compare 设置:

Option Compare text
sub foo4
    Debug.print Instr("ABCDE", "cd")   ' Prints "3"
end sub

Option Compare binary
sub foo5
    Debug.print Instr("ABCDE", "cd")    ' Prints "0"
end sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接