2013-04-23 15 views
5

Używam funkcji dopasowywania w programie Excel, ale mam z tym problem, ponieważ wybiera tylko identyczne dopasowania:. Na przykład, jeśli porównasz komórkę z "Bananem" do innej komórki z "Bananem", to zadziała i zwróci dodatnią wartość.
Ale jeśli porównasz "banan" do komórki, której treścią jest "Banana choco", to nie rozpoznasz, że słowo banan jest w komórce.Excel - VBA: spraw, aby metoda dopasowania była mniej restrykcyjna (przez znajdowanie słowa w zdaniu).

W moim przypadku chciałbym zwrócić wartość PRAWDA, gdy słowo zostanie zauważone w zdaniu.

Oto mój kod:

Worksheets("sBldgMakati").Activate 

For i = 2 To 605 
    Range("B" & i).Activate 
    myResult = IsNumeric(Application.Match(ActiveCell.Value, elementsListRange, 0)) 

    If myResult Then 
    Range("K" & i).Value = Range("K" & i).Value + 10 
    Else 
    Range("K" & i).Value = Range("K" & i).Value + 0 
End If 

Next i 

muszę wskazać, że w tym kodzie, elementsListRange odpowiadają zakresu komórek, których zawartość jest tylko jedno słowo („Banana” na przykład) i ActiveCell.value jest zwykle dłuższe wyrażenie (na przykład "Banana choco").

Z góry dziękuję za pomoc!

+0

Czy próbowałeś użyć funkcji 'Znajdź' lub' Wyszukaj'? I jest 'elementListRange' zakres komórek, lista VBA/kolekcja wartości komórek? – user2140261

+0

Może mógłbyś wybrać odpowiedź na wszystkie twoje pytania, to jest powód, dla którego to robimy! –

Odpowiedz

2

użyć następujących funkcji, dopasowuje podciąg ciągu ciąg:

Function match(searchStr As Variant, matchStr As Variant) As Boolean 
    match = False 
    If (IsNull(searchStr) Or IsNull(matchStr)) Then Exit Function 
    If (matchStr = "") Or (searchStr = "") Then Exit Function 
    Dim f As Variant 
    f = InStr(1, CStr(searchStr), CStr(matchStr), vbTextCompare) 
    If IsNull(f) Then Exit Function 
    match = f > 0 
End Function 

go używać z zakresu:

Dim searchstr="A Banana found" 
Dim isFound as boolean 
IsFound=false 
For each c in range 
    If match(searchstr, c.value) 
     IsFound=true 
     Exit for 
    End if 
End for 

Uwaga że searchStr i matchStr to wariant, dzięki czemu można przekazywać wartości z komórek Excel do niego.

+0

To rozwiązanie działa znacznie lepiej, dzięki Matt! – Phalanx

5

Z dokumentacji pomocy w Excelu (po naciśnięciu klawisza F1 i szukać match):

Jeśli match_type jest 0 i szukana_wartość jest ciągiem tekstowym, można użyć symboli wieloznacznych - znak zapytania (?) i gwiazdką (*) - w argumencie argumentu szukania_wartość. Znak zapytania pasuje do dowolnego pojedynczego znaku; Gwiazdka pasuje do dowolnej sekwencji znaków.

Zatem =MATCH("*Banana*",C8,0) powraca 1 jeśli C8 zawiera "Banana choco".

w VBA, jeśli element, który ma być dopasowany jest w komórce, można zawierać gwiazdki wieloznacznych z łańcuchów znaków, np:

myResult = IsNumeric(Application.Match("*" & ActiveCell.Value & "*", elementsListRange, 0)) 

Jeśli istnieje wiele zdań w zakresie B2:B605, które muszą być testowane przed wszystkimi słowami w elementListRange, jak wydaje się być w przypadku tej sytuacji, myślę, że być może trzeba zrobić coś takiego (niesprawdzone):

For Each cell in elementsListRange.Cells 
    myResult = Application.Match("*" & cell.Value & "*", B2:B605, 0) 
    if (IsNumeric(myResult)) then 
     Range("K" & myResult).Value = Range("K" & myResult).Value + 10 
    end if 
next 
+0

Dzięki za te informacje @Simon, pomocne. Niemniej jednak nie udało mi się sprawić, by działało w moim przypadku, ponieważ nie mam bezpośredniego związku z zawartością moich komórek, ale z zasięgiem. Próbowałem dodać gwiazdki do mojego kodu, ale oczywiście nie jest to właściwy sposób.Czy wiesz, jaki byłby właściwy sposób umieszczania gwiazdek wokół "elementsListRange" (gdzie "banan" byłby przechowywany w moim przypadku), ale w sposób kodowy? – Phalanx

+1

Edytowałem swoją odpowiedź, aby pokazać, w jaki sposób można łączyć gwiazdki na każdym końcu wartości komórki. – Simon

+0

Och, dzięki, naprawdę interesujące. Przykro mi jednak, że ponownie zwracam się z prośbą, ale ponieważ komórki z pojedynczymi słowami są przechowywane w "elementsListRange", więc nie działa to w ActiveCelle.Value. I addind "*" i przed i po "elementsListRange" zwraca komunikat o błędzie (niekompatybilność typu). Próbowałem również bezpośrednio na zawartość elementów ListRange, ale to nie działa: Ustaw elementsListRange = .Range ("D2: D" i lRowD) – Phalanx

Powiązane problemy