比较 VBA 中字符串的最佳方法?
Best way to compare strings in VBA?
我过去一个月一直在使用 VBA(为了我的工作),自从我开始使用这个 language/script,有好几次出现我在比较字符串时遇到问题..到目前为止我比较字符串的方式是:
- str1 = str2 和 str1 <> str2
- StrComp(str1, str2, comparisonMethod)
- InStr(str1, str2)
有时,在使用其中一种比较方法之前,我会先应用 UCase(str1),甚至是 UCase(Trim(str1))。不过,根据我目前的经验,比较 VBA 中的字符串似乎是一件相当善变的事情,因为我觉得我得到的结果不一致。
问题:比较VBA[=33中的两个字符串的最佳程序是什么=]?
例如:假设有两个列表。一个列表包含笔记本电脑型号,另一个包含部件号。目标是将所有零件号与模型相关联。我的结果只产生部分关联,这意味着如果我有 10 个应该与模型关联的零件号,实际上只有 5 或 6 个。然后我将没有正确比较的字符串在单独的代码中再次比较,然后将得到正确的结果。这种行为在我使用 VBA 的整个过程中一直保持一致,这也是 "feeling" 的来源。
第一个问题是,如果您想比较区分大小写或不区分大小写 - 换句话说:是 "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
-函数得到相同的结果,但不需要在模块顶部设置比较选项。相反,您可以提供所需的方式来比较参数:
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
我过去一个月一直在使用 VBA(为了我的工作),自从我开始使用这个 language/script,有好几次出现我在比较字符串时遇到问题..到目前为止我比较字符串的方式是:
- str1 = str2 和 str1 <> str2
- StrComp(str1, str2, comparisonMethod)
- InStr(str1, str2)
有时,在使用其中一种比较方法之前,我会先应用 UCase(str1),甚至是 UCase(Trim(str1))。不过,根据我目前的经验,比较 VBA 中的字符串似乎是一件相当善变的事情,因为我觉得我得到的结果不一致。
问题:比较VBA[=33中的两个字符串的最佳程序是什么=]?
例如:假设有两个列表。一个列表包含笔记本电脑型号,另一个包含部件号。目标是将所有零件号与模型相关联。我的结果只产生部分关联,这意味着如果我有 10 个应该与模型关联的零件号,实际上只有 5 或 6 个。然后我将没有正确比较的字符串在单独的代码中再次比较,然后将得到正确的结果。这种行为在我使用 VBA 的整个过程中一直保持一致,这也是 "feeling" 的来源。
第一个问题是,如果您想比较区分大小写或不区分大小写 - 换句话说:是 "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
-函数得到相同的结果,但不需要在模块顶部设置比较选项。相反,您可以提供所需的方式来比较参数:
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