2013-06-11 3 views
18

Я работаю над программой 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 

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

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

Заранее благодарен!

+1

применения .match не чувствителен к регистру, поэтому я думаю, что у вас другая проблема. – JosieP

ответ

38

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

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.

+0

Как предупреждение, это не сработало для меня, когда пытались увидеть, были ли две строки одинаковыми. Я получаю смысл из этой статьи, что это работает лучше, чем меньше или больше, чем сравнение текста: http://msdn.microsoft.com/en-us/library/8t3khw5f.aspx. Я работаю с идентификаторами Salesforce, которые чувствительны к регистру, и даже с помощью опции Compare Text set VBA все еще находил i3vz равным i3vZ. – rryanp

+2

@rryanp 'Option Compare Text' _supposed_, чтобы быть случайным ** нечувствительным ** - так, что вы видели, это то, что вы ожидаете.Если вы хотите, чтобы он был ** чувствительным ** (так что 'i3vz" <> "i3vZ", вы можете использовать вместо него вариант сравнения двоичных файлов. – Floris

+1

А теперь я вижу, что я читал его сообщение назад. Я попробую вариант Compare Binary - большое спасибо за информацию! – rryanp

12

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

Вот пример:

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

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

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

Смежные вопросы