37

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

不幸的是,我经常遇到区分大小写的问题。

例如,当我使用此代码时:

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

它会将活动单元格的值与我数据库中的单词列表进行比较。问题是,如果在我的活动单元格中,单词是“miami”或“MIAMI”,而数据库中只有“Miami”,它将不起作用......

其他示例:

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

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

我怎样才能摆脱这个?这特别烦人,我无法在每种可能的情况下都重写我的数据库!

提前致谢 !

4

4 回答 4

63

您可以在模块级别发出一条语句:

Option Compare Text

这使得所有“文本比较”不区分大小写。这意味着以下代码将显示消息“这是真的”:

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

于 2013-06-11T02:44:57.130 回答
23

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

这是一个例子:

If LCase(Range("J6").Value) = LCase("Tawi") Then
   Range("J6").Value = "Tawi-Tawi"
End If
于 2013-06-11T02:37:18.947 回答
4

如果要比较的列表很大(即上面示例中的 manilaListRange 范围),则使用 match 函数是明智之举。它避免了使用可能减慢过程的循环。如果您可以确保 manilaListRange 全部为大写或小写,那么这对我来说似乎是最好的选择。在进行比赛时可以快速应用“UCase”或“LCase”。

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

于 2013-06-11T05:39:12.400 回答
1

这有点hack,但会完成任务。

Function equalsIgnoreCase(str1 As String, str2 As String) As Boolean
    equalsIgnoreCase = LCase(str1) = LCase(str2)
End Function
于 2018-12-22T20:02:44.320 回答