Ovaj će vodič pokazati kako tražiti (pronaći) vrijednost u nizu u VBA -i
Postoji niz načina na koje možete tražiti niz u nizu - ovisno o tome je li niz jednodimenzionalan ili višedimenzionalan.
Traženje u jednodimenzionalnom nizu
Za traženje vrijednosti u jednodimenzionalnom nizu možete koristiti funkciju filtra.
123 | Dim z Kao varijanta'filtrirajte izvorni nizz = Filter (niz, niz, istina, vbCompareBinary) |
Sintaksa opcije Filter je sljedeća
Filter (izvorni niz, podudaranje kao niz, [uključi kao logičko], [usporedi kao vbCompareMethod])
The Izvorni niz i Uskladi kao niz su potrebni dok Uključi kao logičko i Usporedi kao vbCompareMethod su izborni. Ako nisu uključeni, postavljeni su na Pravi i vbCompareBinary odnosno.
Pronađite vrijednosti koje odgovaraju Filtru
1234567891011121314 | Sub FindBob ()'Napravi nizDim strName () Kao varijantastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte varijantu za spremanje podataka filtraDim strSubNames kao varijanta'filtrirajte izvorni nizstrSubNames = Filter (strName, "Bob")'ako je vaša LBound vrijednost veća od -1, tada je vrijednost pronađenaAko je LBound (strSubNames)> -1 Zatim MsgBox ("Našao sam Boba")Kraj podm |
Drugi niz će sadržavati vrijednosti koje filter pronađe. Ako vaše vrijednosti LBound i UBound nisu -1, tada je niz uspio pronaći vrijednost koju ste tražili.
Također možete vidjeti koliko se puta tekst pojavljuje u izvornom nizu.
1234567891011121314 | Imena podbroja ()'Stvori nizDim strName () Kao varijantastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte niz za pohranu podataka filtraDim strSubNames kao varijanta'filtrirajte izvorni nizstrSubNames = Filter (strName, "Bob")'ako minus vrijednost LBound iz UBound vrijednosti i dodate 1, dobit ćemo broj pojavljivanja tekstaMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "pronađena imena".Kraj podm |
Pronađite vrijednosti koje NE odgovaraju filteru
The [Uključi kao logičko] opcija vam omogućuje da pronađete koliko vrijednosti u vašem nizu koje NEMOJ odgovaraju vašem filtru
1234567891011121314 | PodbrojExtraNames ()'stvoriti nizDim strName () Kao varijantastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte niz za pohranu podataka filtraDim strSubNames kao varijanta'filtrirajte izvorni nizstrSubNames = Filter (strName, "Bob", False)'ako minus vrijednost LBound iz UBound vrijednosti i dodate 1, dobit ćemo broj pojavljivanja tekstaMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "pronađena imena".Kraj podm |
stoga smo izmijenili ovaj redak:
1 | strSubNames = Filter (strName, "Bob") |
ovim retkom:
1 | strSubNames = Filter (strName, "Bob", False) |
Korištenjem ovog retka u kodu vratili bi se svi nazivi koji NE odgovaraju "Bob".
Filtri osjetljivi na velika i mala slova
Vidjet ćete da je filter prema zadanim postavkama osjetljiv na velika i mala slova. To vrijedi za sve VBA funkcije. Ako želite pretraživati tekst koji ne razlikuje velika i mala slova, morate malo izmijeniti kôd.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Dodavanje vbTextCompare na vašu liniju filtra omogućit će vašem kodu da pronađe "bob" ili "Bob". Ako je to izostavljeno, VBA se zadano koristi vbBinaryCompare koji će tražiti samo podatke koji su TOČNO podudarati. Primijetite da smo u gornjem primjeru izostavili [Uključi kao logičko] argument pa se pretpostavlja True.
Opcija Usporedi tekst
Alternativno, možete dodati tekst Opcija Usporedi tekst do vrha vašeg modula - time će sve funkcije koje upisujete u velika i mala slova modula postati neosjetljive.
Korištenje petlje za pretraživanje kroz niz
Korištenje petlje malo je složenije od korištenja funkcije Filter. Možemo stvoriti funkciju koja će se pomicati kroz sve vrijednosti u nizu.
1234567891011121314151617 | Sub LoopThroughArray ()'stvoriti nizDim strName () Kao varijantastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Zatamni strNađi kao nizstrFind = "Bob"Dim i As Long'petlja kroz nizZa i = LBound (strName, 1) Za UBound (strName, 1)Ako je InStr (strName (i), strFind)> 0 ZatimMsgBox "Bob je pronađen!"Izlaz zaZavrši akoSljedeći iKraj podm |
Kako bismo pronašli dio tekstualnog niza, tj. "Bob" umjesto "Bob Smith" ili "Bob Williams", morali smo upotrijebiti funkciju Instr u naredbi If. Ovo je izgledalo u nizu koji je petlja vratila iz niza da vidi je li u nizu "Bob", a kako je bio u nizu, vratio bi okvir s porukom, a zatim izašao iz petlje.
Pretraživanje u višedimenzionalnom nizu
Također koristimo petlju za pretraživanje kroz višedimenzionalni niz. Još jednom moramo stvoriti funkciju koja nam omogućuje da prođemo kroz sve vrijednosti u nizu, ali ovaj put također moramo proći kroz svaku dimenziju niza.
123456789101112131415161718192021222324252627 | Funkcija LoopThroughArray ()Dim varArray () Kao varijantaZatamni str Pronađi kao nizstrFind = "Doktor"'deklarirajte veličinu nizaReDim varArray (1, 2)'inicijalizira nizvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred kopča"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Računovođa"varArray (1, 1) = "Tajnik"varArray (1, 2) = "Doktor"'deklariraju varijable za petljuDim i As Long, j As Long'petlja za prvu dimenzijuZa i = LBound (varArray, 1) Za UBound (varArray, 1)'petlja za drugu dimenzijuZa j = LBound (varArray, 2) Za UBound (varArray, 2)'ako nađemo vrijednost, onda msgbox reći da imamo vrijednost i izaći iz funkcijeAko je varArray (i, j) = strNađite tadaMsgBox "Liječnik je pronađen!"Izlazna funkcijaZavrši akoSljedeće jSljedeći iZavršna funkcija |