VBA iskanje vrednosti (Najdi) v matriki

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
wave wave wave wave wave