Подтвердить что ты не робот

В 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

Аналогичная проблема, только слово, написанное с тем же случаем, будет работать.

Как я могу избавиться от этого? Это особенно раздражает, и я не могу переписать свою базу данных в каждой комбинации случаев!

Спасибо заранее!

4b9b3361

Ответ 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