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 |