Tento tutoriál předvede, jak ve VBA hledat (najít) hodnotu v poli
Existuje několik způsobů, jak můžete vyhledat řetězec v poli - v závislosti na tom, zda je pole jednorozměrné nebo vícerozměrné.
Hledání v jednorozměrném poli
Chcete-li vyhledat hodnotu v jednorozměrném poli, můžete použít funkci Filtr.
123 | Dim z As Variant'filtrujte původní polez = Filtr (pole, řetězec, True, vbCompareBinary) |
Následuje možnost Syntaxe filtru
Filtr (zdrojové pole, shoda jako řetězec, [zahrnout jako logickou hodnotu], [porovnat jako vbCompareMethod])
The Zdrojové pole a Zápas jako řetězec jsou vyžadovány, zatímco Zahrnout jako booleovský a Porovnat jako vbCompareMethod jsou volitelné. Pokud nejsou zahrnuty, jsou nastaveny na Skutečný a vbCompareBinary resp.
Najděte hodnoty, které odpovídají filtru
1234567891011121314 | Sub FindBob ()„Vytvořte poleDim strName () jako variantastrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarujte variantu pro uložení dat filtru.'Dim strSubNames jako varianta'filtrujte původní polestrSubNames = Filtr (strName, "Bob")'pokud je hodnota LBound větší než -1, pak byla hodnota nalezenaIf LBound (strSubNames)> -1 Then MsgBox ("I found Bob")End Sub |
Druhé pole bude uchovávat hodnoty nalezené filtrem. Pokud vaše hodnoty LBound a UBound nejsou -1, pak se poli podařilo najít hodnotu, kterou jste hledali.
Můžete také vidět, kolikrát se text objeví v původním poli.
1234567891011121314 | Sub CountNames ()„Vytvořte poleDim strName () jako variantastrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarujte pole pro ukládání dat filtru.'Dim strSubNames jako varianta'filtrujte původní polestrSubNames = Filtr (strName, "Bob")'Pokud odečtete LBound z hodnot UBound a přidáte 1, dostaneme počet zobrazení textuMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "jména nalezena."End Sub |
Najděte hodnoty, které NEodpovídají filtru
The [Zahrnout jako logickou hodnotu] Možnost umožňuje zjistit, kolik hodnot ve vašem poli NE odpovídat vašemu filtru
1234567891011121314 | Dílčí početExtraNames ()'vytvořit poleDim strName () jako variantastrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarujte pole pro ukládání dat filtru.'Dim strSubNames jako varianta'filtrujte původní polestrSubNames = Filtr (strName, "Bob", False)'Pokud odečtete LBound z hodnot UBound a přidáte 1, dostaneme počet zobrazení textuMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "jména nalezena."End Sub |
proto jsme změnili tento řádek:
1 | strSubNames = Filtr (strName, "Bob") |
s tímto řádkem:
1 | strSubNames = Filtr (strName, "Bob", False) |
Použitím tohoto řádku v kódu vrátíte všechna jména, která NEodpovídají „Bob“.
Filtry citlivé na velká a malá písmena
Zjistíte, že filtr ve výchozím nastavení rozlišuje velká a malá písmena. To platí pro všechny funkce VBA. Chcete -li hledat text, který nerozlišuje velká a malá písmena, musíte kód mírně upravit.
1 | z = Filtr (strName, "bob" ,, vbTextCompare) |
Přidávání vbTextCompare na váš řádek filtru umožní kódu najít „bob“ nebo „Bob“. Pokud je toto vynecháno, VBA ve výchozím nastavení používá vbBinaryCompare který bude hledat pouze data, která jsou PŘESNÝ zápas. Všimněte si, že ve výše uvedeném příkladu jsme vynechali [Zahrnout jako logickou hodnotu] předpokládá se argument True.
Možnost Porovnat text
Případně můžete přidat text Možnost Porovnat text na začátek vašeho modulu - tím budou všechny funkce, které píšete v konkrétním modulu, citlivé na malá a velká písmena.
Použití smyčky k vyhledávání v poli
Použití smyčky je o něco složitější než použití funkce Filtr. Můžeme vytvořit funkci, která bude procházet všemi hodnotami v poli.
1234567891011121314151617 | Sub LoopThroughArray ()'vytvořit poleDim strName () jako variantastrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)Dim strFind jako řetězecstrFind = "Bob"Dim i As Long'smyčka přes polePro i = LBound (strName, 1) Do UBound (strName, 1)Pokud InStr (strName (i), strFind)> 0 ThenMsgBox „Bob byl nalezen!“Ukončit proKonec IfPříště jáEnd Sub |
Abychom našli část textového řetězce, tj. „Bob“ místo „Bob Smith“ nebo „Bob Williams“, museli jsme v příkazu If použít funkci Instr. To vypadalo v řetězci vráceném smyčkou z Array, aby se zjistilo, zda je v řetězci „Bob“, a jak to bylo v řetězci, vrátilo by se okno se zprávou a poté Exit the Loop.
Hledání ve vícerozměrném poli
Smyčku také používáme k prohledávání vícerozměrného pole. Opět musíme vytvořit funkci, která nám umožní procházet všemi hodnotami v poli, ale tentokrát musíme také procházet každou dimenzí pole.
123456789101112131415161718192021222324252627 | Funkce LoopThroughArray ()Dim varArray () jako variantaDim strFind As StringstrFind = "Doktor"'deklarujte velikost pole.'ReDim varArray (1, 2)“inicializujte polevarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "účetní"varArray (1, 1) = "tajemník"varArray (1, 2) = "Doktor"'deklarujte proměnné pro smyčku.'Dim i As Long, j As Long'smyčka pro první dimenziPro i = LBound (varArray, 1) Do UBound (varArray, 1)'smyčka pro druhou dimenziPro j = LBound (varArray, 2) Do UBound (varArray, 2)'pokud najdeme hodnotu, pak msgbox řekne, že máme hodnotu a ukončíme funkciPokud varArray (i, j) = strFind ThenMsgBox "Doktor byl nalezen!"Funkce ukončeníKonec IfDalší jPříště jáKoncová funkce |