VBA Søk etter (Finn) verdi i Array

Denne opplæringen vil demonstrere hvordan du søker etter (Finn) en verdi i en matrise i VBA

Det er en rekke måter du kan søke etter en streng i en matrise - avhengig av om matrisen er en endimensjonal eller flerdimensjonal.

Søker i en en-dimensjonal matrise

For å søke etter en verdi i en endimensjonal matrise, kan du bruke filterfunksjonen.

123 Dim z Som variant'filtrer den opprinnelige matrisenz = Filter (Array, String, True, vbCompareBinary)

Syntaks for alternativet Filter er som følger

Filtrer (Kildearray, Match som streng, [Inkluder som boolsk], [Sammenlign som vbCompareMethod])

De Kildearray og Match som streng er påkrevd mens Inkluder som boolsk og Sammenlign som vbCompareMethod er valgfrie. Hvis disse ikke er inkludert, er de satt til ekte og vbCompareBinary henholdsvis.

Finn verdier som samsvarer med filteret

1234567891011121314 Sub FindBob ()'Lag matriseDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklærer en variant for å lagre filterdataene iDim strSubNames As Variant'filtrer den opprinnelige matrisenstrSubNames = Filter (strName, "Bob")'hvis du LBound -verdien er større enn -1, er verdien funnetIf LBound (strSubNames)> -1 Then MsgBox ("I found Bob")Slutt Sub

Den andre matrisen vil inneholde verdiene funnet av filteret. Hvis LBound- og UBound -verdiene ikke er -1, har matrisen klart å finne verdien du søkte etter.

Du kan også se hvor mange ganger teksten vises i den opprinnelige matrisen.

1234567891011121314 Sub CountNames ()'Lag matriseDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklære en matrise for å lagre filterdataene iDim strSubNames As Variant'filtrer den opprinnelige matrisenstrSubNames = Filter (strName, "Bob")'hvis du minus LBound fra UBound -verdiene og legger til 1, får vi antall ganger teksten visesMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "navn funnet."Slutt Sub

Finn verdier som IKKE samsvarer med filteret

De [Inkluder som boolsk] alternativet lar deg finne hvor mange verdier i matrisen som IKKE samsvarer med filteret ditt

1234567891011121314 Sub CountExtraNames ()'opprett matriseDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklærer en matrise for å lagre filterdataene iDim strSubNames As Variant'filtrer den opprinnelige matrisenstrSubNames = Filter (strName, "Bob", False)'hvis du minus LBound fra UBound -verdiene og legger til 1, får vi antall ganger teksten visesMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "navn funnet."Slutt Sub

Vi har derfor endret denne linjen:

1 strSubNames = Filter (strName, "Bob")

med denne linjen:

1 strSubNames = Filter (strName, "Bob", False)

Hvis du bruker denne linjen i koden, returnerer alle navnene som IKKE samsvarer med "Bob".

Skilt mellom store og små bokstaver

Du vil finne at filteret som standard er skift mellom store og små bokstaver. Dette gjelder for alle VBA -funksjoner. Hvis du vil søke etter tekst som ikke er bokstavfølsom, må du endre koden litt.

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

Legger til vbTextCompare til filterlinjen din, vil koden din kunne finne “bob” eller “Bob”. Hvis dette er utelatt, bruker VBA som standard vbBinaryCompare som bare vil se etter data som er en NØYAKTIG kamp. Legg merke til i eksemplet ovenfor, vi har utelatt [Inkluder som boolsk] argumentet så True antas.

Alternativ Sammenlign tekst

Alternativt kan du legge til teksten Alternativ Sammenlign tekst til toppen av modulen - dette vil gjøre alle funksjonene du skriver i den aktuelle modulen ufølsomme.

Bruk en loop til å søke gjennom en matrise

Å bruke en sløyfe er litt mer komplisert enn å bruke filterfunksjonen. Vi kan lage en funksjon som går gjennom alle verdiene i matrisen.

1234567891011121314151617 Sub LoopThroughArray ()'opprett matriseDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim str Finn som strengstrFind = "Bob"Dim i As Long'gå gjennom matrisenFor i = LBound (strName, 1) Til UBound (strName, 1)Hvis InStr (strName (i), strFind)> 0 DaMsgBox "Bob er funnet!"Avslutt forSlutt omNeste jegSlutt Sub

For å finne en del av tekststrengen, dvs. “Bob” i stedet for “Bob Smith” eller “Bob Williams”, måtte vi bruke Instr -funksjonen i If -setningen. Dette så i strengen som ble returnert av løkken fra matrisen for å se om "Bob" var i strengen, og som den var i strengen, ville den returnere en meldingsboks og deretter avslutte løkken.

Søker i en flerdimensjonal matrise

Vi bruker også løkken til å søke gjennom et flerdimensjonalt utvalg. Nok en gang må vi lage en funksjon som gjør at vi kan gå gjennom alle verdiene i matrisen, men denne gangen må vi også gå gjennom hver dimensjon i matrisen.

123456789101112131415161718192021222324252627 Function LoopThroughArray ()Dim varArray () Som variantDim strFind As StringstrFind = "Doctor"'erklærer størrelsen på matrisenReDim varArray (1, 2)'initialiser matrisenvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Regnskapsfører"varArray (1, 1) = "Sekretær"varArray (1, 2) = "lege"'erklære variabler for løkkenDim i As Long, j As Long'loop for den første dimensjonenFor i = LBound (varArray, 1) Til UBound (varArray, 1)'loop for den andre dimensjonenFor j = LBound (varArray, 2) Til UBound (varArray, 2)'hvis vi finner verdien, så msgbox for å si at vi har verdien og avslutter funksjonenIf varArray (i, j) = strFind ThenMsgBox "Legen er funnet!"Avslutt funksjonSlutt omNeste jNeste jegSluttfunksjon
wave wave wave wave wave