VBA Hae (Etsi) arvoa Array -ohjelmasta

Tämä opetusohjelma osoittaa, kuinka arvoa etsitään (löydetään) taulukosta VBA: ssa

Voit etsiä merkkijonoa taulukosta useilla tavoilla - riippuen siitä, onko taulukko yksi- vai moniulotteinen.

Etsiminen yksiulotteisesta taulukosta

Voit etsiä arvoa yksiulotteisesta taulukosta käyttämällä suodatintoimintoa.

123 Dim z Vaihtoehtona'suodata alkuperäinen matriisiz = Suodatin (Array, String, True, vbCompareBinary)

Suodatinvaihtoehdon syntaksi on seuraava

Suodatin (Lähdealue, Yhdistä merkkijonoksi, [Sisällytä totuusarvoksi], [Vertaa vbCompareMethodina])

The Lähde Array ja Sovita merkkijonoksi vaaditaan, kun Sisällytä Booleaniksi ja Vertaa kuin vbCompareMethod ovat valinnaisia. Jos nämä eivät sisälly, ne asetetaan arvoon Totta ja vbVertaaBinaarinen vastaavasti.

Etsi suodatinta vastaavat arvot

1234567891011121314 Osa FindBob ()'Luo ArrayDim strName () VarianttinastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'julistaa variantin, johon suodatintiedot tallennetaanDim strSubNames as Variant'suodata alkuperäinen matriisistrSubNames = Suodatin (strName, "Bob")'Jos LBound -arvo on suurempi kuin -1, arvo on löydettyJos LBound (strSubNames)> -1 Sitten MsgBox ("Löysin Bobin")End Sub

Toinen taulukko säilyttää suodattimen löytämät arvot. Jos LBound- ja UBound -arvosi eivät ole -1, taulukko on onnistunut löytämään etsimäsi arvon.

Voit myös nähdä, kuinka monta kertaa teksti näkyy alkuperäisessä taulukossa.

1234567891011121314 AlalaskutNimet ()'Luo taulukkoDim strName () VarianttinastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'julistaa taulukon, johon suodatintiedot tallennetaanDim strSubNames as Variant'suodata alkuperäinen matriisistrSubNames = Suodatin (strName, "Bob")'Jos vähennät LBoundin UBound -arvoista ja lisäät yhden, saamme kuinka monta kertaa teksti näkyyMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nimet löydetty."End Sub

Etsi arvot, jotka EIVÄT vastaa suodatinta

The [Sisällytä totuusarvoksi] -vaihtoehdon avulla voit selvittää, kuinka monta arvoa taulukossasi on ÄLÄ vastaa suodatinta

1234567891011121314 AlalaskuriExtraNames ()'luo taulukkoDim strName () VarianttinastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'julistaa taulukon, johon suodatintiedot tallennetaanDim strSubNames as Variant'suodata alkuperäinen matriisistrSubNames = Suodatin (strName, "Bob", False)'Jos vähennät LBoundin UBound -arvoista ja lisäät yhden, saamme kuinka monta kertaa teksti näkyyMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "nimet löydetty."End Sub

siksi olemme muuttaneet tätä riviä:

1 strSubNames = Suodatin (strName, "Bob")

tällä rivillä:

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

Tämän rivin käyttäminen koodissa palauttaisi kaikki nimet, jotka EIVÄT vastaa "Bob".

Kirjainkokoiset suodattimet

Huomaat, että suodatin erottaa isot ja pienet kirjaimet oletusarvoisesti. Tämä pätee kaikkiin VBA -toimintoihin. Jos haluat etsiä tekstiä, joka ei erota kirjainkokoa, sinun on muutettava koodiasi hieman.

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

Lisätään vbTextCompare suodatinrivillesi mahdollistaa koodisi löytämisen "bob" tai "Bob". Jos tämä jätetään pois, VBA käyttää oletusarvoisesti vbBinaryCompare joka etsii vain tietoja, jotka ovat TARKKA ottelu. Huomaa yllä olevassa esimerkissä, olemme jättäneet pois [Sisällytä totuusarvoksi] argumentti, joten oletetaan totta.

Vaihtoehto Vertaa tekstiä

Vaihtoehtoisesti voit lisätä tekstin Vaihtoehto Vertaa tekstiä moduulin yläosaan - tämä tekee kaikki toiminnot, jotka kirjoitat kyseiseen moduuliin, kirjainkokoa.

Silmukan käyttäminen taulukon etsimiseen

Silmukan käyttäminen on hieman monimutkaisempaa kuin Suodatin -toiminnon käyttö. Voimme luoda funktion, joka kiertää kaikki taulukon arvot.

1234567891011121314151617 Sub LoopThroughArray ()'luo taulukkoDim strName () VarianttinastrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strFind merkkijonostrFind = "Bob"Dim niin kauan'kierrä taulukon läpiI = LBound (strName, 1) UBound (strName, 1)Jos InStr (strName (i), strFind)> 0 SittenMsgBox "Bob on löydetty!"LopetaLoppu JosSeuraavaksi minäEnd Sub

Jotta voisimme löytää osan tekstimerkkijonosta eli "Bob" "Bob Smith": n tai "Bob Williamsin" sijasta, meidän täytyi käyttää If -lausekkeen Instr -toimintoa. Tämä katsoi Array -silmukan palauttamasta merkkijonosta nähdäkseen, onko "Bob" merkkijonossa, ja kuten merkkijonossa, se palauttaisi viestiruudun ja lopeta sitten silmukasta.

Etsiminen moniulotteisesta taulukosta

Käytämme silmukkaa myös moniulotteisen taulukon etsimiseen. Jälleen kerran meidän on luotava funktio, jonka avulla voimme kiertää kaikki taulukon arvot, mutta tällä kertaa meidän on myös kierrettävä jokaisen taulukon ulottuvuuden läpi.

123456789101112131415161718192021222324252627 Toiminto LoopThroughArray ()Dim varArray () VarianttinaDim strFind kuin merkkijonostrFind = "Lääkäri"'ilmoittaa taulukon koonReDim varArray (1, 2)'alustaa taulukkovarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Kirjanpitäjä"varArray (1, 1) = "Sihteeri"varArray (1, 2) = "Lääkäri"'ilmoittaa silmukan muuttujatDim i Niin pitkä, j Niin pitkä'silmukka ensimmäiselle ulottuvuudelleI = LBound (varArray, 1) - UBound (varArray, 1)'silmukka toista ulottuvuutta vartenJ = LBound (varArray, 2) - UBound (varArray, 2)'Jos löydämme arvon, viestiviestillä sanotaan, että meillä on arvo ja poistutaan funktiostaJos varArray (i, j) = strFind ThenMsgBox "Lääkäri on löydetty!"Lopeta toimintoLoppu JosSeuraava jSeuraavaksi minäLopeta toiminto
wave wave wave wave wave