VBA Wyszukaj (znajdź) wartość w tablicy

Ten samouczek pokaże, jak wyszukiwać (znaleźć) wartość w tablicy w VBA

Istnieje wiele sposobów wyszukiwania ciągu w tablicy - w zależności od tego, czy tablica jest jednowymiarowa, czy wielowymiarowa.

Wyszukiwanie w jednowymiarowej tablicy

Aby wyszukać wartość w tablicy jednowymiarowej, możesz użyć funkcji filtru.

123 Dim z jako wariant'filtruj oryginalną tablicęz = Filtr (tablica, ciąg, prawda, vbCompareBinary)

Składnia opcji filtra jest następująca

Filtr(tablica źródłowa, Dopasuj jako ciąg, [Uwzględnij jako Boolean], [Porównaj jako vbCompareMethod])

ten Tablica źródłowa i Dopasuj jako ciąg są wymagane, gdy Uwzględnij jako Boolean i Porównaj jako vbCompareMethod są opcjonalne. Jeśli nie są one uwzględnione, są ustawione na Prawdziwe oraz vbPorównaj Binarny odpowiednio.

Znajdź wartości pasujące do filtra

1234567891011121314 Sub Znajdź Boba()'Utwórz tablicęDim strName() jako wariantstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'zadeklaruj wariant do przechowywania danych filtra wDim strSubNames jako wariant'filtruj oryginalną tablicęstrSubNames = Filter(strName, "Bob")'jeśli wartość LBound jest większa niż -1, to wartość została znalezionaJeśli LBound(strSubNames ) > -1 to MsgBox ("Znalazłem Boba")Napis końcowy

Druga tablica będzie zawierała wartości znalezione przez filtr. Jeśli twoje wartości LBound i UBound nie są równe -1, to tablica zdołała znaleźć szukaną wartość.

Możesz także zobaczyć, ile razy tekst pojawia się w oryginalnej tablicy.

1234567891011121314 SubCountNames()'Utwórz tablicęDim strName() jako wariantstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklaruj tablicę, w której będą przechowywane dane filtraDim strSubNames jako wariant'filtruj oryginalną tablicęstrSubNames = Filter(strName, "Bob")'jeśli pomniejszysz LBound z wartości UBound i dodasz 1, otrzymamy liczbę wystąpień tekstuMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 & " znaleziono nazwy."Napis końcowy

Znajdź wartości, które NIE pasują do filtra

ten [Uwzględnij jako logiczne] opcja pozwala znaleźć ile wartości w Twojej tablicy, które NIE RÓB dopasuj swój filtr

1234567891011121314 Sub CountExtraNames()'utwórz tablicęDim strName() jako wariantstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklaruj tablicę, w której będą przechowywane dane filtraDim strSubNames As Variant'filtruj oryginalną tablicęstrSubNames = Filter(strName, "Bob", False)'jeśli pomniejszysz LBound z wartości UBound i dodasz 1, otrzymamy liczbę wystąpień tekstuMsgbox UBound(strSubNames ) - LBound(strSubNames ) + 1 & " znaleziono nazwy."Napis końcowy

dlatego zmieniliśmy ten wiersz:

1 strSubNames = Filter(strName, "Bob")

z tą linią:

1 strSubNames = Filter(strName, "Bob", False)

Użycie tego wiersza w kodzie zwróci wszystkie imiona, które NIE pasują do „Bob”.

Filtry uwzględniające wielkość liter

Przekonasz się, że filtr domyślnie rozróżnia wielkość liter. Dotyczy to wszystkich funkcji VBA. Jeśli chcesz wyszukać tekst, w którym nie jest rozróżniana wielkość liter, musisz nieznacznie zmienić kod.

1 z = Filter(strName, "bob", vbTextCompare)

Dodawanie vbTextPorównaj do linii filtra pozwoli Twojemu kodowi znaleźć „bob” lub „Bob”. Jeśli zostanie to pominięte, domyślnie używa VBA vbBinaryCompare który będzie szukał tylko danych, które są DOKŁADNY mecz. Zauważ, że w powyższym przykładzie pominęliśmy [Uwzględnij jako logiczne] argument, więc zakłada się True.

Opcja Porównaj tekst

Alternatywnie możesz dodać tekst Opcja Porównaj tekst na górę twojego modułu - spowoduje to, że wszystkie funkcje, które napiszesz w tym konkretnym module, będą niewrażliwe na wielkość liter.

Używanie pętli do przeszukiwania tablicy

Korzystanie z pętli jest nieco bardziej skomplikowane niż korzystanie z funkcji Filter. Możemy stworzyć funkcję, która przejdzie przez wszystkie wartości w tablicy.

1234567891011121314151617 Podrzędna pętla przez tablicę()'utwórz tablicęDim strName() jako wariantstrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strZnajdź jako ciągstrFind = "Bob"Przyciemnij i tak długo'przeprowadź pętlę przez tablicęFor i = LBound(strName, 1) To UBound(strName, 1)Jeśli InStr(strName(i), strFind) > 0 WtedyMsgBox "Znaleziono Boba!"Wyjdź dlaZakończ, jeśliDalej jaNapis końcowy

Aby znaleźć część ciągu tekstowego, tj. „Bob” zamiast „Bob Smith” lub „Bob Williams”, musieliśmy użyć funkcji Instr w instrukcji If. Spojrzało to w ciągu zwróconym przez pętlę z tablicy, aby sprawdzić, czy „Bob” znajduje się w ciągu, i tak jak w ciągu, zwróci okno komunikatu, a następnie wyjdzie z pętli.

Wyszukiwanie w tablicy wielowymiarowej

Pętli używamy również do przeszukiwania tablicy wielowymiarowej. Po raz kolejny musimy utworzyć funkcję, która umożliwi nam pętlę przez wszystkie wartości w tablicy, ale tym razem musimy również przejść przez każdy wymiar tablicy.

123456789101112131415161718192021222324252627 Funkcja pętli przez tablicę()Dim varArray() jako wariantDim strZnajdź jako ciągstrFind = "Doktor"'deklaruj rozmiar tablicyReDim varArray(1, 2)'zainicjuj tablicę'varArray(0, 0) = "Mel Smith"varArray(0, 1) = "Fred Buckle"varArray(0, 2) = "Jane Eyre"varArray(1, 0) = "Księgowy"varArray(1, 1) = "Sekretarka"varArray(1, 2) = "Doktor"'deklaruj zmienne dla pętliDim i tak długo, j tak długo„pętla dla pierwszego wymiaru”For i = LBound(varArray, 1) To UBound(varArray, 1)„pętla dla drugiego wymiaru”For j = LBound(varArray, 2) To UBound(varArray, 2)'jeśli znajdziemy wartość, to msgbox, aby powiedzieć, że mamy wartość i wyjść z funkcjiJeśli varArray(i, j) = strFind WtedyMsgBox "Znaleziono lekarza!"Wyjdź z funkcjiZakończ, jeśliNastępny jDalej jaKoniec funkcji
wave wave wave wave wave