В VBA избавиться от чувствительности к регистру при сравнении слов?

Я работаю над программой VBA, которая позволит пользователю вводить адрес и находить местоположение, сопоставляя элементы адреса с базой данных.

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

Например, когда я использую этот код:

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

Он сравнит значение активной ячейки со списком слов из моей базы данных. Проблема в том, что если в моей активной ячейке есть слово «Майами» или «Майами», а в базе данных только «Майами», это не сработает...

Другой пример:

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

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

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

Заранее спасибо !


person Phalanx    schedule 11.06.2013    source источник
comment
application.match не чувствителен к регистру, поэтому я думаю, что у вас другая проблема   -  person JosieP    schedule 11.06.2013


Ответы (4)


Существует оператор, который вы можете выполнить на уровне модуля:

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.

person Floris    schedule 11.06.2013
comment
Как предупреждение, это не сработало для меня, когда я пытался увидеть, идентичны ли две строки. Из этой статьи я понял, что это работает лучше для меньшего или большего сравнения текста: msdn.microsoft.com/en-us/library/8t3khw5f.aspx. Я работаю с идентификаторами Salesforce, которые чувствительны к регистру, и даже с установленным параметром сравнения текста VBA по-прежнему находит i3vz равным i3vZ. - person rryanp; 25.03.2014
comment
@rryanp Option Compare Text должно быть нечувствительным к регистру, так что вы увидели именно то, что и ожидали. Если вы хотите, чтобы он был чувствительным (чтобы "i3vz" <> "i3vZ" вы могли использовать вместо него Option Compare Binary. - person Floris; 25.03.2014
comment
Ах, теперь я вижу, что читал его пост задом наперед. Отлично — пойду попробую Option Compare Binary — большое спасибо за информацию! - person rryanp; 25.03.2014
comment
Для справки: Application.Match изначально нечувствителен к регистру, поэтому параметр сравнения текста не имеет значения. - person Selkie; 18.01.2018

Вы можете преобразовать оба значения в нижний регистр и сравнить.

Вот пример:

If LCase(Range("J6").Value) = LCase("Tawi") Then
   Range("J6").Value = "Tawi-Tawi"
End If
person Vasanth    schedule 11.06.2013

Если список для сравнения большой (например, диапазон manilaListRange в приведенном выше примере), будет разумным шагом использовать функцию сопоставления. Это позволяет избежать использования цикла, который может замедлить процедуру. Если вы можете убедиться, что manilaListRange находится в верхнем или нижнем регистре, то это кажется мне лучшим вариантом. Можно быстро применить «UCase» или «LCase» во время матча.

Если у вас не было контроля над ManilaListRange, вам, возможно, придется прибегнуть к циклу по этому диапазону, и в этом случае есть много способов сравнить «поиск», «Instr», «заменить» и т. д.

person dra_red    schedule 11.06.2013

Это немного взломать, но сделает задачу.

Function equalsIgnoreCase(str1 As String, str2 As String) As Boolean
    equalsIgnoreCase = LCase(str1) = LCase(str2)
End Function
person MeLine    schedule 22.12.2018
comment
Это вообще НЕ взлом. Но все, что вы сделали, это повторили ответ Васанта ПЯТЬ+ лет спустя. - person Excel Hero; 01.05.2020
comment
@ExcelHero спасибо за комментарий, вы правы, идея та же, но мой ответ добавляет больше ценности, потому что объявленная функция может использоваться в качестве формулы Excel. - person MeLine; 02.05.2020