Ta vadnica bo pokazala, kako iskati (najti) vrednost v nizu v VBA
Niz v nizu lahko iščete na različne načine - odvisno od tega, ali je matrika enodimenzionalna ali večdimenzionalna.
Iskanje v enodimenzionalnem nizu
Če želite poiskati vrednost v enodimenzionalnem nizu, lahko uporabite funkcijo filtra.
123 | Dim z kot varianta'filtrirajte izvirno matrikoz = Filter (niz, niz, True, vbCompareBinary) |
Možnost Sintaksa filtra je naslednja
Filtriraj (izvorni niz, ujemaj kot niz, [vključi kot logično], [primerjaj kot vbCompareMethod])
The Vir Niz in Ujemi kot niz so potrebni, medtem ko Vključi kot Boolean in Primerjaj kot vbCompareMethod so neobvezne. Če niso vključeni, so nastavljeni na Prav in vbCompareBinary oz.
Poiščite vrednosti, ki se ujemajo s filtrom
1234567891011121314 | Sub FindBob ()'Ustvari nizZatemni strName () kot variantostrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte varianto za shranjevanje podatkov filtraZatemni strSubNames kot varianto'filtrirajte izvirno matrikostrSubNames = Filter (strName, "Bob")'če je vaša vrednost LBound večja od -1, je bila vrednost najdenaČe je LBound (strSubNames)> -1, potem MsgBox ("Našel sem Boba")End Sub |
Druga matrika bo vsebovala vrednosti, ki jih najde filter. Če vrednosti LBound in UBound nista -1, je matriki uspelo najti vrednost, ki ste jo iskali.
Ogledate si lahko tudi, kolikokrat se besedilo pojavi v prvotni matriki.
1234567891011121314 | Imena podštevilk ()'Ustvari matrikoZatemni strName () kot variantostrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte niz, v katerem bodo shranjeni podatki filtraZatemni strSubNames kot varianto'filtrirajte izvirno matrikostrSubNames = Filter (strName, "Bob")"če od vrednosti UBound odštejete LBound in dodate 1, dobimo število prikaza besedilaMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "najdena imena."End Sub |
Poiščite vrednosti, ki se NE ujemajo s filtrom
The [Vključi kot Boolean] možnost vam omogoča, da ugotovite, koliko vrednosti v vašem nizu NE ujema s filtrom
1234567891011121314 | Sub CountExtraNames ()'ustvari matrikoZatemni strName () kot variantostrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarirajte niz, v katerem bodo shranjeni podatki filtraZatemni strSubNames kot varianto'filtrirajte izvirno matrikostrSubNames = Filter (strName, "Bob", False)"če od vrednosti UBound odštejete LBound in dodate 1, dobimo število prikaza besedilaMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "najdena imena."End Sub |
zato smo spremenili to vrstico:
1 | strSubNames = Filter (strName, "Bob") |
s to vrstico:
1 | strSubNames = Filter (strName, "Bob", False) |
Uporaba te vrstice v kodi bi vrnila vsa imena, ki se NE ujemajo z "Bob".
Filtri, občutljivi na velike in male črke
Ugotovili boste, da je filter privzeto občutljiv na velike in male črke. To velja za vse funkcije VBA. Če želite iskati besedilo, ki ne razlikuje velikih in malih črk, morate kodo nekoliko spremeniti.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Dodajanje vbTextCompare na vašo filtrirno vrstico bo vaši kodi omogočilo iskanje »bob« ali »Bob«. Če je to izpuščeno, privzeto uporablja VBA vbBinaryCompare ki bo iskal samo podatke, ki so TOČNO ujemati. V zgornjem primeru smo izpustili [Vključi kot Boolean] Argument je torej predpostavljen True.
Možnost Primerjaj besedilo
Lahko pa dodate besedilo Možnost Primerjaj besedilo na vrh vašega modula - s tem bodo vse funkcije, ki jih zapišete v tem modulu, neobčutljive.
Uporaba zanke za iskanje po matriki
Uporaba zanke je nekoliko bolj zapletena kot uporaba funkcije Filter. Ustvarimo lahko funkcijo, ki bo krožila skozi vse vrednosti v matriki.
1234567891011121314151617 | Sub LoopThroughArray ()'ustvari matrikoZatemni strName () kot variantostrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Zatemni strNajdi kot nizstrFind = "Bob"Dim i As Long'zanko skozi matrikoZa i = LBound (strName, 1) Za UBound (strName, 1)Če je InStr (strName (i), strFind)> 0 PotemMsgBox "Bob je bil najden!"Izhod zaKonec ČeNaprej iEnd Sub |
Da bi našli del besedilnega niza, tj. "Bob" namesto "Bob Smith" ali "Bob Williams", smo morali v stavku If uporabiti funkcijo Instr. To je bilo videti v nizu, ki ga zanka vrne iz niza, da preveri, ali je v nizu »Bob«, in tako kot v nizu, bi vrnil polje s sporočilom in nato zapustil zanko.
Iskanje v večdimenzionalnem nizu
Zanko uporabljamo tudi za iskanje po večdimenzionalni matriki. Še enkrat moramo ustvariti funkcijo, ki nam omogoča, da prelistamo vse vrednosti v matriki, tokrat pa moramo prečkati tudi vsako dimenzijo matrike.
123456789101112131415161718192021222324252627 | Funkcija LoopThroughArray ()Zatemni varArray () kot variantoZatemni str Najdi kot nizstrFind = "Zdravnik"'navedite velikost matrikeReDim varArray (1, 2)'inicializirajte matrikovarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred zaponka"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Računovodja"varArray (1, 1) = "Tajnik"varArray (1, 2) = "Zdravnik"'razglasi spremenljivke zankeDim i As Long, j As Long'zanka za prvo dimenzijoZa i = LBound (varArray, 1) Za UBound (varArray, 1)'zanka za drugo dimenzijoZa j = LBound (varArray, 2) Za UBound (varArray, 2)'če najdemo vrednost, potem msgbox pove, da imamo vrednost, in zapustimo funkcijoČe je varArray (i, j) = strFind thenMsgBox "Zdravnik je bil najden!"Izhodna funkcijaKonec ČeNaprej jNaprej iKončana funkcija |