VBA Căutați (găsiți) valoare în matrice

Acest tutorial va arăta cum să căutați (găsiți) o valoare într-o matrice în VBA

Există mai multe moduri în care puteți căuta un șir într-o matrice - în funcție de faptul dacă matricea este unidimensională sau multidimensională.

Căutarea într-o matrice unidimensională

Pentru a căuta o valoare într-o matrice unidimensională, puteți utiliza funcția de filtrare.

123 Dim z Ca variantă'filtrează matricea originalăz = Filtru (matrice, șir, adevărat, vbCompareBinary)

Sintaxa opțiunii Filtru este următoarea

Filtru (matrice sursă, potrivire ca șir, [Includeți ca boolean], [Comparați ca vbCompareMethod])

The Sursă matrice si Potriviți ca șir sunt necesare în timp ce Includeți ca boolean si Comparați ca vbCompareMethod sunt opționale. Dacă acestea nu sunt incluse, acestea sunt setate la Adevărat și vbCompareBinary respectiv.

Găsiți valori care se potrivesc cu Filtrul

1234567891011121314 Sub FindBob ()'Creați matriceDim strName () Ca variantăstrName () = Array („Bob Smith”, „John Davies”, „Fred Jones”, „Steve Jenkins”, „Bob Williams”)'declarați o variantă pentru a stoca datele filtrului înDim strSubNames As Variant'filtrează matricea originalăstrSubNames = Filtru (strName, "Bob")'dacă valoarea LBound este mai mare decât -1, atunci valoarea a fost găsităDacă LBound (strSubNames)> -1 Apoi MsgBox („L-am găsit pe Bob”)Sfârșitul Sub

A doua matrice va conține valorile găsite de filtru. Dacă valorile LBound și UBound nu sunt -1, atunci matricea a reușit să găsească valoarea pe care o căutați.

De asemenea, puteți vedea de câte ori apare textul în matricea originală.

1234567891011121314 Sub CountNames ()'Creați matriceDim strName () Ca variantăstrName () = Array („Bob Smith”, „John Davies”, „Fred Jones”, „Steve Jenkins”, „Bob Williams”)'declara o matrice în care să stocheze datele filtruluiDim strSubNames As Variant'filtrează matricea originalăstrSubNames = Filtru (strName, "Bob")'dacă scădeți LBound din valorile UBound și adăugați 1, vom obține de câte ori apare textulMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & „nume găsite”.Sfârșitul Sub

Găsiți valori care NU se potrivesc cu filtrul

The [Includeți ca boolean] opțiunea vă permite să găsiți câte valori din matrice care NU FACE potriviți filtrul

1234567891011121314 Sub CountExtraNames ()'creați matriceDim strName () Ca variantăstrName () = Array („Bob Smith”, „John Davies”, „Fred Jones”, „Steve Jenkins”, „Bob Williams”)'declara o matrice în care să stocheze datele filtruluiDim strSubNames As Variant'filtrează matricea originalăstrSubNames = Filtru (strName, "Bob", Fals)'dacă scădeți LBound din valorile UBound și adăugați 1, vom obține de câte ori apare textulMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & „nume găsite”.Sfârșitul Sub

prin urmare, am modificat această linie:

1 strSubNames = Filtru (strName, "Bob")

cu această linie:

1 strSubNames = Filtru (strName, "Bob", Fals)

Folosind această linie în cod, s-ar returna toate numele care NU se potrivesc cu „Bob”.

Filtre sensibile la majuscule

Veți găsi că filtrul este sensibil la majuscule și minuscule în mod implicit. Acest lucru este valabil pentru toate funcțiile VBA. Dacă doriți să căutați text care nu este sensibil la majuscule, trebuie să modificați ușor codul.

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

Se adaugă vbTextCompare la linia de filtrare vă va permite codul să găsească „bob” sau „Bob”. Dacă acest lucru este omis, se folosește implicit VBA vbBinaryCompare care va căuta doar date care sunt un CORECT Meci. Observați în exemplul de mai sus, am lăsat deoparte [Includeți ca boolean] argument astfel încât se presupune că Adevărat.

Opțiune Comparați textul

Alternativ, puteți adăuga textul Opțiune Comparați textul în partea de sus a modulului dvs. - acest lucru va face ca toate funcțiile pe care le scrieți în acel modul particular să fie insensibile.

Utilizarea unei bucle pentru a căuta printr-o matrice

Utilizarea unei bucle este puțin mai complicată decât utilizarea funcției de filtrare. Putem crea o funcție care va parcurge toate valorile din matrice.

1234567891011121314151617 Sub LoopThroughArray ()'creați matriceDim strName () Ca variantăstrName () = Array („Bob Smith”, „John Davies”, „Fred Jones”, „Steve Jenkins”, „Bob Williams”)Dim strFind ca șirstrFind = "Bob"Dim i As Long'buclă prin matricePentru i = LBound (strName, 1) To UBound (strName, 1)Dacă InStr (strName (i), strFind)> 0 AtunciMsgBox "Bob a fost găsit!"Ieșiți pentruEnd IfApoi euSfârșitul Sub

Pentru a găsi o parte a șirului de text, adică „Bob” în loc de „Bob Smith” sau „Bob Williams”, a trebuit să folosim Funcția Instr în Instrucțiunea If. Acest lucru s-a uitat în șirul returnat de bucla din matrice pentru a vedea dacă „Bob” era în șir și, așa cum era în șir, va returna o casetă de mesaje și apoi Ieși din buclă.

Căutarea într-o matrice multidimensională

De asemenea, folosim bucla pentru a căuta printr-o matrice multidimensională. Încă o dată, trebuie să creăm o funcție care ne permite să parcurgem toate valorile din matrice, dar de această dată, trebuie să parcurgem fiecare dimensiune a matricei.

123456789101112131415161718192021222324252627 Funcția LoopThroughArray ()Dim varArray () Ca variantăDim strFind As StringstrFind = "Doctor"'declarați dimensiunea matriceiReDim varArray (1, 2)'inițializați matriceavarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Contabil"varArray (1, 1) = "Secretar"varArray (1, 2) = "Doctor"'declarați variabile pentru buclăDim i As Long, j As Longbucla pentru prima dimensiunePentru i = LBound (varArray, 1) To UBound (varArray, 1)bucla pentru a doua dimensiunePentru j = LBound (varArray, 2) To UBound (varArray, 2)'dacă găsim valoarea, atunci msgbox pentru a spune că avem valoarea și ieșim din funcțieDacă varArray (i, j) = strFind ThenMsgBox "Doctorul a fost găsit!"Funcția de ieșireEnd IfUrmătorul jApoi euFuncția de sfârșit
wave wave wave wave wave