See õpetus näitab, kuidas VBA -s massiivist väärtust otsida (leida)
Massiivist stringi otsimiseks on mitmeid viise - sõltuvalt sellest, kas massiiv on ühemõõtmeline või mitmemõõtmeline.
Otsimine ühemõõtmelises massiivis
Ühemõõtmelises massiivis väärtuse otsimiseks võite kasutada filtri funktsiooni.
123 | Dim z Variandina'filtreerige algne massiivz = filter (massiiv, string, tõene, vbCompareBinary) |
Valiku Filtri süntaks on järgmine
Filtreeri (allikamassiiv, sobita stringina, [kaasata tõeväärtusena], [võrdle kui vbCompareMethod])
The Allika massiiv ja Sobita stringina on vajalikud, kui Kaasa Booleanina ja Võrdle kui vbCompareMethod on vabatahtlikud. Kui neid pole, on need seatud Tõsi ja vbCompareBinary vastavalt.
Leidke filtrile vastavad väärtused
1234567891011121314 | Alamotsingu bob ()'Loo massiivDim strName () VariandinastrName () = massiiv ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklareerige variant, kuhu filtriandmed salvestadaDim strSubNames Variant'filtreerige algne massiivstrSubNames = Filter (strName, "Bob")'kui teie LBoundi väärtus on suurem kui -1, on see väärtus leitudKui LBound (strSubNames)> -1 Siis MsgBox ("Ma leidsin Bobi")End Sub |
Teine massiiv hoiab filtri leitud väärtusi. Kui teie LBoundi ja UBoundi väärtused ei ole -1, siis on massiivil õnnestunud leida otsitav väärtus.
Samuti saate vaadata, mitu korda tekst esialgses massiivis ilmub.
1234567891011121314 | AlamarvNimed ()'Loo massiivDim strName () VariandinastrName () = massiiv ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklareerige massiiv filtri andmete salvestamiseksDim strSubNames Variant'filtreerige algne massiivstrSubNames = Filter (strName, "Bob")'kui lahutada LBound UBoundi väärtustest ja lisada 1, saame teksti kuvamiskordade arvuMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "leitud nimed".End Sub |
Leidke väärtused, mis EI vasta filtrile
The [Kaasa tõeväärtusena] suvand võimaldab teil leida, kui palju väärtusi teie massiivis on ÄRA sobitage oma filtriga
1234567891011121314 | AlamarvExtraNames ()'loo massiivDim strName () VariandinastrName () = massiiv ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklareerige massiiv filtri andmete salvestamiseksDim strSubNames Variant'filtreerige algne massiivstrSubNames = Filter (strName, "Bob", False)'kui lahutada LBound UBoundi väärtustest ja lisada 1, saame teksti kuvamiskordade arvuMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "leitud nimed".End Sub |
Seetõttu muutsime seda rida:
1 | strSubNames = Filter (strName, "Bob") |
selle reaga:
1 | strSubNames = Filter (strName, "Bob", False) |
Kui kasutate seda koodi koodis, tagastatakse kõik nimed, mis EI vasta "Bobile".
Kirja tõstutundlikud filtrid
Leiate, et filter on vaikimisi tõstutundlik. See kehtib kõigi VBA funktsioonide kohta. Kui soovite otsida teksti, mis ei ole tõstutundlik, peate oma koodi veidi muutma.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Lisamine vbTextCompare filtrireale lubab teie koodil leida „bob” või „bob”. Kui see välja jätta, kasutab VBA vaikimisi vbBinaryCompare mis otsib ainult andmeid, mis on TÄPSELT sobitada. Pange tähele ülaltoodud näites, oleme välja jätnud [Kaasa tõeväärtusena] argumenti, seega eeldatakse tõde.
Valik Võrdle teksti
Teise võimalusena saate teksti lisada Valik Võrdle teksti oma mooduli ülaossa - see muudab kõik funktsioonid, mida sellesse moodulisse kirjutate, tundmatuks.
Silmuse kasutamine massiivi otsimiseks
Tsükli kasutamine on natuke keerulisem kui funktsiooni Filter kasutamine. Saame luua funktsiooni, mis vaatab läbi kõik massiivi väärtused.
1234567891011121314151617 | Sub LoopThroughArray ()'loo massiivDim strName () VariandinastrName () = massiiv ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Hämarda strFind otsi stringinastrFind = "Bob"Dim i As Long'silmus läbi massiiviI = LBound (strName, 1) kuni UBound (strName, 1)Kui InStr (strName (i), strFind)> 0 SiisMsgBox "Bob on leitud!"VäljuLõpp KuiEdasi iEnd Sub |
Selleks, et leida tekstistringi osa, st „Bob” asemel „Bob Smith” või „Bob Williams”, pidime If -avalduses kasutama funktsiooni Instr. See vaatas massiivi silmuse tagastatud stringi, et näha, kas stringis on “Bob”, ja nagu stringis, tagastab see sõnumikasti ja seejärel väljub silmusest.
Otsimine mitmemõõtmelises massiivis
Samuti kasutame silmust mitmemõõtmelise massiivi otsimiseks. Taaskord peame looma funktsiooni, mis võimaldab meil massiivi kõik väärtused läbi vaadata, kuid seekord peame ka massiivi iga mõõtme läbi loopima.
123456789101112131415161718192021222324252627 | Funktsioon LoopThroughArray ()Dim varArray () VariandinaDim strFind kui stringstrFind = "Arst"'deklareerige massiivi suurusReDim varArray (1, 2)'lähtestage massiivvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Raamatupidaja"varArray (1, 1) = "Sekretär"varArray (1, 2) = "Arst"'deklareerida silmuse muutujadDim i As Long, j As Long'silmust esimese mõõtme jaoksI = LBound (varArray, 1) kuni UBound (varArray, 1)'silmus teise mõõtme jaoksJ = LBound (varArray, 2) kuni UBound (varArray, 2)'kui leiame väärtuse, siis sõnumikastis öeldakse, et meil on väärtus, ja väljuda funktsioonistKui varArray (i, j) = strFind ThenMsgBox "Arst on leitud!"Välju funktsioonLõpp KuiJärgmine jEdasi iLõppfunktsioon |