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 |