在VBA中,在比较单词时去掉大小写敏感性



我正在研究一个VBA程序,该程序允许用户键入地址并通过与数据库匹配地址元素来找到位置。

不幸的是,我有一个反复出现的问题与大小写敏感性。

例如,当我使用以下代码时:

For i = 11 To lRowB
Range("B" & i).Activate
myResult = IsNumeric(Application.Match(ActiveCell.Value, manilaListRange, 0))

它会将活动单元格的值与数据库中的单词列表进行比较。问题是,如果在活动单元格中,单词是迈阿密;或";MIAMI"只有"迈阿密";是在数据库中,它不会工作…

其他的例子:

If Range("J6").Value = "tawi" Then
Range("J6").Value = "Tawi-Tawi"
End If

同样的问题,只有用相同的大小写写的单词才有效。

我怎样才能摆脱这个?这是特别恼人的,我不能重写我的数据库在所有可能的情况下的组合!

你可以在模块级发出一个语句:

Option Compare Text

这使得所有"文本比较"不区分大小写。这意味着下面的代码将显示消息" This is true":

Option Compare Text
Sub testCase()
  If "UPPERcase" = "upperCASE" Then
    MsgBox "this is true: option Compare Text has been set!"
  End If
End Sub

参见http://www.ozgrid.com/VBA/vba-case-sensitive.htm。我不确定它会完全解决所有实例的问题(如Application.Match函数),但它会照顾所有的if a=b语句。至于Application.Match -您可能希望使用LCase函数将参数转换为大写或小写。

您可以将两个值转换为小写并进行比较。

下面是一个例子:

If LCase(Range("J6").Value) = LCase("Tawi") Then
   Range("J6").Value = "Tawi-Tawi"
End If

如果要比较的列表很大(即上面示例中的manilaListRange范围),则使用match函数是明智之举。它避免了使用可能减慢过程的循环。如果你能确保manilaListRange都是大写或小写,那么这对我来说似乎是最好的选择。它是快速应用' uccase '或'LCase'当你做你的匹配。

如果你不能控制ManilaListRange,那么你可能不得不求助于循环遍历这个范围,在这种情况下,有很多方法来比较'search', 'Instr', 'replace'等。

这是一个有点hack,但将完成任务。

Function equalsIgnoreCase(str1 As String, str2 As String) As Boolean
    equalsIgnoreCase = LCase(str1) = LCase(str2)
End Function

最新更新