Tento tutoriál ukáže, ako vo VBA hľadať (nájsť) hodnotu v poli
Existuje niekoľko spôsobov, ako môžete vyhľadať reťazec v poli - v závislosti od toho, či je pole jednorozmerné alebo viacrozmerné.
Hľadanie v jednorozmernom poli
Na vyhľadanie hodnoty v jednorozmernom poli môžete použiť funkciu filtra.
123 | Dim z As Variant'filtrovať pôvodné polez = Filter (pole, reťazec, True, vbCompareBinary) |
Nasleduje možnosť Syntax filtra
Filter (pole zdroja, zhoda ako reťazec, [zahrnúť ako booleovskú hodnotu], [porovnať ako vbCompareMethod])
The Zdrojové pole a Zápas ako reťazec sú povinné, zatiaľ čo Zahrnúť ako booleovskú hodnotu a Porovnať ako vbCompareMethod sú voliteľné. Ak nie sú zahrnuté, sú nastavené na Pravda a vbCompareBinary resp.
Nájdite hodnoty, ktoré zodpovedajú filtru
1234567891011121314 | Sub FindBob ()„Vytvorte poleDim strName () ako variantstrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarovať variant na uloženie údajov filtraDim strSubNames ako variant'filtrovať pôvodné polestrSubNames = Filter (strName, "Bob")„Ak je vaša hodnota LBound väčšia ako -1, hodnota sa našlaAk je LBound (strSubNames)> -1, potom MsgBox („Našiel som Boba“)Koniec pod |
Druhé pole bude uchovávať hodnoty nájdené filtrom. Ak vaše hodnoty LBound a UBound nie sú -1, potom sa poli podarilo nájsť hodnotu, ktorú ste hľadali.
Môžete tiež vidieť, koľkokrát sa text zobrazí v pôvodnom poli.
1234567891011121314 | Sub CountNames ()„Vytvorte poleDim strName () ako variantstrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarujte pole na uloženie údajov filtraDim strSubNames ako variant'filtrovať pôvodné polestrSubNames = Filter (strName, "Bob")„Ak mínus LBound z hodnôt UBound pridáte 1, dostaneme počet zobrazení textu.Msgbox UBound (strSubNames) - LBound (strSubNames) + 1 a „nájdené mená“.Koniec pod |
Nájdite hodnoty, ktoré sa NEDORÚČIA filtru
The [Zahrnúť ako booleovskú hodnotu] voľba vám umožní zistiť, koľko hodnôt vo vašom poli je NEROBTE zodpovedať vášmu filtru
1234567891011121314 | Sub CountExtraNames ()'vytvoriť poleDim strName () ako variantstrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)'deklarujte pole na uloženie údajov filtraDim strSubNames ako variant'filtrovať pôvodné polestrSubNames = Filter (strName, "Bob", False)„Ak mínus LBound z hodnôt UBound pridáte 1, dostaneme počet zobrazení textu.Msgbox UBound (strSubNames) - LBound (strSubNames) + 1 a „nájdené mená“.Koniec pod |
preto sme zmenili tento riadok:
1 | strSubNames = Filter (strName, "Bob") |
s týmto riadkom:
1 | strSubNames = Filter (strName, "Bob", False) |
Použitím tohto riadku v kóde sa vrátia všetky mená, ktoré NIE JE v zhode s „Bob“.
Filtre citlivé na veľkosť písmen
Zistíte, že filter štandardne rozlišuje veľké a malé písmena. To platí pre všetky funkcie VBA. Ak chcete vyhľadávať text, ktorý nerozlišuje veľké a malé písmena, musíte kód mierne upraviť.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Pridáva sa vbTextCompare do riadka filtra umožní kódu nájsť „bob“ alebo „Bob“. Ak je to vynechané, VBA štandardne používa vbBinaryCompare ktorý bude hľadať iba údaje, ktoré sú PRESNE zápas. Všimnite si vo vyššie uvedenom príklade, že sme vynechali [Zahrnúť ako booleovskú hodnotu] Argument so True sa predpokladá.
Možnosť Porovnať text
Prípadne môžete pridať text Možnosť Porovnať text na začiatok modulu - všetky funkcie, ktoré do konkrétneho modulu napíšete, budú citlivé na veľké písmená.
Použitie slučky na vyhľadávanie v poli
Použitie slučky je o niečo komplikovanejšie ako používanie funkcie Filter. Môžeme vytvoriť funkciu, ktorá bude prechádzať všetkými hodnotami v poli.
1234567891011121314151617 | Sub LoopThroughArray ()'vytvoriť poleDim strName () ako variantstrName () = Pole („Bob Smith“, „John Davies“, „Fred Jones“, „Steve Jenkins“, „Bob Williams“)Dim strFind ako reťazecstrFind = "Bob"Dim i As Long'cez polePre i = LBound (strName, 1) Do UBound (strName, 1)Ak je InStr (strName (i), strFind)> 0 PotomMsgBox „Bob bol nájdený!“Ukončiť preKoniec AkĎalej iKoniec pod |
Aby sme našli časť textového reťazca, napr. „Bob“ namiesto „Bob Smith“ alebo „Bob Williams“, museli sme vo vyhlásení If použiť funkciu Instr. Toto vyzeralo v reťazci vrátenom slučkou z poľa, aby sa zistilo, či je v reťazci „Bob“, a ako to bolo v reťazci, vrátilo by sa pole so správou a potom Opustiť slučku.
Hľadanie vo viacrozmernom poli
Smyčku používame aj na vyhľadávanie vo viacrozmernom poli. Opäť musíme vytvoriť funkciu, ktorá nám umožní opakovať všetky hodnoty v poli, ale tentoraz musíme tiež prejsť všetkými dimenziami poľa.
123456789101112131415161718192021222324252627 | Funkcia LoopThroughArray ()Dim varArray () ako variantDim strFind As StringstrFind = "Doktor"'deklarujte veľkosť poľaReDim varArray (1, 2)'inicializujte polevarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Účtovník"varArray (1, 1) = "tajomník"varArray (1, 2) = "Doktor"'deklarujte premenné pre slučkuDim i As Long, j As Long„slučka pre prvú dimenziuPre i = LBound (varArray, 1) až UBound (varArray, 1)„slučka pre druhú dimenziuPre j = LBound (varArray, 2) až UBound (varArray, 2)„Ak nájdeme hodnotu, potom msgbox povie, že hodnotu máme, a ukončíme funkciuAk varArray (i, j) = strFind ThenMsgBox „Doktor bol nájdený!“Ukončiť funkciuKoniec AkĎalej jĎalej iKoncová funkcia |