В VBA избавиться от чувствительности к регистру при сравнении слов?
Я работаю над программой VBA, которая позволит пользователю вводить адрес и находить местоположение, сопоставляя элементы адреса с базой данных.
К сожалению, у меня возникает повторяющаяся проблема с чувствительностью к регистру.
Например, когда я использую этот код:
For i = 11 To lRowB
Range("B" & i).Activate
myResult = IsNumeric(Application.Match(ActiveCell.Value, manilaListRange, 0))
Он будет сравнивать значение активной ячейки со списком слов из моей базы данных. Проблема в том, что если в моей активной ячейке слово "miami" или "MIAMI", и в базе данных находится только "Майами", это не сработает...
Другой пример:
If Range("J6").Value = "tawi" Then
Range("J6").Value = "Tawi-Tawi"
End If
Аналогичная проблема, только слово, написанное с тем же случаем, будет работать.
Как я могу избавиться от этого? Это особенно раздражает, и я не могу переписать свою базу данных в каждой комбинации случаев!
Спасибо заранее!
Ответы
Ответ 1
Существует заявка, которую вы можете задать на уровне модуля:
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
.
Ответ 2
Вы можете преобразовать оба значения в нижний регистр и сравнить.
Вот пример:
If LCase(Range("J6").Value) = LCase("Tawi") Then
Range("J6").Value = "Tawi-Tawi"
End If
Ответ 3
Если список для сравнения с большим, (т.е. диапазон manilaListRange в примере выше), это умное перемещение для использования функции соответствия. Это позволяет избежать использования цикла, который может замедлить процедуру. Если вы можете убедиться, что manilaListRange - это верхний или нижний регистр, это, по-моему, лучший вариант для меня. Быстро применять "UCase" или "LCase", как вы делаете свой матч.
Если у вас не было контроля над ManilaListRange, вам, возможно, придется прибегнуть к циклу в этом диапазоне, и в этом случае есть много способов сравнить "поиск", "инстр", "заменить" и т.д.
Ответ 4
Это немного взломать, но выполнит задачу.
Function equalsIgnoreCase(str1 As String, str2 As String) As Boolean
equalsIgnoreCase = LCase(str1) = LCase(str2)
End Function