【问题标题】:Best way to compare strings in VBA?在 VBA 中比较字符串的最佳方法?
【发布时间】:2017-07-20 13:11:26
【问题描述】:

上个月我一直在使用 VBA(为了我的工作),自从我开始使用这种语言/脚本以来,我在比较字符串时遇到了几次问题。 . 到目前为止,我比较字符串的方式是:

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

有时,在使用其中一种比较方法之前,我会先应用 UCase(str1),甚至是 UCase(Trim(str1))。不过,根据我目前的经验,在 VBA 中比较字符串似乎是一件相当多变的事情,因为我觉得我得到的结果不一致。

问题:在 VBA 中比较两个字符串的最佳程序是什么

例如:假设有两个列表。一个列表包含笔记本电脑型号,另一个包含零件编号。目标是将所有零件编号与模型相关联。我的结果只产生了部分关联,这意味着如果我有 10 个零件号应该与一个模型关联,那么实际上只有 5 或 6 个。然后,我将无法正确比较的字符串在单独的代码中再次进行比较,然后将得到正确的结果。这种行为在我使用 VBA 的过程中一直保持一致,这也是“感觉”的来源。

【问题讨论】:

  • “我觉得我得到了不一致的结果” - 你怎么能感觉到这种“二进制”的东西(?),请添加一个示例,说明你的方法没有返回预期的结果。
  • A = B 如果 A 和 B 在相同的情况下并且具有相同(如果有的话)前导/尾随空格,则 A = B 是 100% 可靠的 - 请记住始终确保这两件事是真实的,您将拥有没问题。
  • @Charles 也许您正在处理这样的案例:stackoverflow.com/questions/45120678/…
  • 是的,我们需要一个例子。

标签: vba excel string-comparison


【解决方案1】:

第一个问题是您是否要比较区分大小写或不区分大小写 - 换句话说:是"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-function 得到相同的结果,但不需要在模块顶部设置比较选项。相反,您可以将所需的方式作为参数进行比较:

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

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 2013-06-20
    • 2013-12-10
    • 1970-01-01
    • 2019-03-06
    • 2011-01-04
    • 2012-03-15
    相关资源
    最近更新 更多