2013-06-11 5 views
18

Pracuję nad programem VBA, który pozwoliłby użytkownikowi wpisać adres i znaleźć lokalizację, dopasowując elementy adresu do bazy danych.W języku VBA pozbyć się rozróżniania wielkości liter podczas porównywania słów?

Niestety, mam powtarzający się problem z rozróżnianiem wielkości liter.

Na przykład, kiedy używam tego kodu:

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

To gonna porównanie wartości aktywnej komórki do listy słów z mojej bazy danych. Problem polega na tym, czy w moim aktywnej komórki słowo jest „Miami” czy „Miami” i tylko „Miami” jest w bazie danych, to nie będzie działać ...

Inny przykład:

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

Ten sam problem, tylko słowo napisane w tym samym przypadku będzie działało.

Jak mogę się tego pozbyć? Jest to szczególnie denerwujące i nie mogę przepisać mojej bazy danych w każdej możliwej kombinacji!

Z góry dziękuję!

+1

aplikacji .match jest _nieważna jest wielkość liter, więc myślę, że masz inny problem – JosieP

Odpowiedz

38

Jest oświadczenie można wydać na poziomie modułu:

Option Compare Text 

To sprawia, że ​​wszystkie „porównań tekstowych” przypadek niewrażliwe. Oznacza to, że poniższy kod pojawi się komunikat „To prawda”:

Option Compare Text 

Sub testCase() 
    If "UPPERcase" = "upperCASE" Then 
    MsgBox "this is true: option Compare Text has been set!" 
    End If 
End Sub 

patrz na przykład http://www.ozgrid.com/VBA/vba-case-sensitive.htm. Nie jestem pewien, czy całkowicie rozwiąże problem dla wszystkich instancji (takich jak funkcja Application.Match), ale zajmie się wszystkimi instrukcjami if a=b. Jeśli chodzi o Application.Match - możesz przekonwertować argumenty na wielkie lub małe litery, używając funkcji LCase.

+0

Jako ostrzeżenie, to nie działało dla mnie, gdy próbowałem sprawdzić, czy dwa ciągi były identyczne. W tym artykule zrozumiałem, że działa to lepiej w przypadku porównania tekstu niższego niż lub większego: http://msdn.microsoft.com/en-us/library/8t3khw5f.aspx. Pracuję z identyfikatorami Salesforce, w których rozróżniana jest wielkość liter, a nawet przy ustawieniu opcji porównywania tekstu, VBA nadal znajduje i3vz równe i3vZ. – rryanp

+2

@rryanp 'Opcja Porównaj tekst' ma wartość _supposed_ na wielkość liter ** jest niewrażliwa ** - więc to, co zobaczyłeś, jest tym, czego oczekiwałbyś.Jeśli chcesz, aby był ** wrażliwy ** (tak, że '' i3vz "<>" i3vZ "' możesz zamiast tego użyć opcji 'Porównaj porównanie binarne'. – Floris

+1

Ah, teraz widzę, że czytałem jego wpis wstecz. Pójdę wypróbować Option Compare Binary - wielkie dzięki za informację! – rryanp

12

Można przekonwertować obie wartości na małe i porównać.

Oto przykład:

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

Jeśli lista do porównania jest duża, (np. Zakres manilaListRange w powyższym przykładzie), jest to sprytny ruch, aby użyć funkcji dopasowania. Pozwala to uniknąć użycia pętli, która może spowolnić procedurę. Jeśli możesz upewnić się, że manilaListRange ma całą górną lub małą literę, to wydaje mi się to najlepszą opcją. Szybko stosuje się "UCase" lub "LCase" w trakcie meczu.

Jeśli nie masz kontroli nad ManilaListRange wtedy może trzeba uciekać się do przelotowego tym zakresie w takim przypadku istnieje wiele sposobów, aby porównać „szukaj”, „Instr”, „zastąpi” itd