VBA Zoeken naar (vinden) waarde in array

Deze tutorial laat zien hoe je kunt zoeken naar (vinden) een waarde in een array in VBA

Er zijn een aantal manieren waarop u naar een string in een array kunt zoeken, afhankelijk van of de array eendimensionaal of multidimensionaal is.

Zoeken in een eendimensionale array

Om naar een waarde in een eendimensionale array te zoeken, kunt u de filterfunctie gebruiken.

123 Dim z As Variant'filter de originele array'z = Filter(Array, String, True, vbCompareBinary)

De syntaxis van de filteroptie is als volgt:

Filter(Source Array, Match as String, [Include as Boolean], [Compare as vbCompareMethod])

De Bronmatrix en de Match als String zijn vereist terwijl de Opnemen als Booleaans en de Vergelijk als vbCompareMethod zijn optioneel. Als deze niet zijn opgenomen, zijn ze ingesteld op: Waar en vbVergelijkBinair respectievelijk.

Zoek waarden die overeenkomen met het filter

1234567891011121314 Sub FindBob()'Maak matrix'Dim strName() als variantstrName() = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declareer een variant om de filtergegevens in op te slaan'Dim strSubNamen als variant'filter de originele array'strSubNames = Filter(strName, "Bob")'Als je LBound-waarde groter is dan -1, dan is de waarde gevondenAls LBound(strSubNames) > -1 Dan MsgBox ("Ik heb Bob gevonden")Einde sub

De tweede array bevat de waarden die door het filter zijn gevonden. Als uw LBound- en UBound-waarden niet -1 zijn, heeft de array de waarde gevonden waarnaar u op zoek was.

U kunt ook zien hoe vaak de tekst in de oorspronkelijke array voorkomt.

1234567891011121314 Sub CountNames()'Maak array'Dim strName() als variantstrName() = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declareer een array om de filtergegevens in op te slaan'Dim strSubNamen als variant'filter de originele array'strSubNames = Filter(strName, "Bob")'als je de LBound van de UBound-waarden aftrekt en 1 optelt, krijgen we het aantal keren dat de tekst verschijntMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 & " namen gevonden."Einde sub

Vind waarden die NIET overeenkomen met het filter

De [Opnemen als Boolean] optie kunt u vinden hoeveel waarden in uw array welke NIET DOEN match je filter

1234567891011121314 Sub AantalExtraNamen()'matrix maken'Dim strName() als variantstrName() = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'declareer een array om de filtergegevens in op te slaan'Dim strSubNamen als variant'filter de originele array'strSubNames = Filter(strName, "Bob", False)'als je de LBound van de UBound-waarden aftrekt en 1 optelt, krijgen we het aantal keren dat de tekst verschijntMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 & " namen gevonden."Einde sub

we hebben daarom deze regel aangepast:

1 strSubNames = Filter(strName, "Bob")

met deze regel:

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

Als u deze regel in de code gebruikt, worden alle namen geretourneerd die NIET overeenkomen met "Bob".

Hoofdlettergevoelige filters

U zult zien dat het filter standaard hoofdlettergevoelig is. Dit geldt voor alle VBA-functies. Als u wilt zoeken naar tekst die niet hoofdlettergevoelig is, moet u uw code iets aanpassen.

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

Toevoegen vbTekstVergelijken naar uw filterregel zal uw code in staat stellen om "bob" of "Bob" te vinden. Als dit wordt weggelaten, gebruikt VBA standaard vbBinairVergelijken die alleen zoekt naar gegevens die een EXACT bij elkaar passen. Merk op dat we in het bovenstaande voorbeeld de hebben weggelaten [Opnemen als Boolean] argument dus waar wordt aangenomen.

Optie Tekst vergelijken

Als alternatief kunt u de tekst toevoegen Optie Tekst vergelijken naar de bovenkant van uw module - hierdoor worden alle functies die u in die specifieke module schrijft, hoofdletterongevoelig.

Een lus gebruiken om door een array te zoeken

Het gebruik van een lus is iets ingewikkelder dan het gebruik van de filterfunctie. We kunnen een functie maken die alle waarden in de array doorloopt.

1234567891011121314151617 Sub LoopThroughArray()'matrix maken'Dim strName() als variantstrName() = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strZoeken als stringstrFind = "Bob"Dim ik zo lang'loop door de array'Voor i = LBound(strName, 1) Naar UBound(strName, 1)Als InStr(strNaam(i), strFind) > 0 DanMsgBox "Bob is gevonden!"Afsluiten voorStop alsvolgende iEinde sub

Om een ​​deel van de tekstreeks te vinden, dwz "Bob" in plaats van "Bob Smith" of "Bob Williams", moesten we de Instr-functie in de If-opdracht gebruiken. Dit keek in de string die werd geretourneerd door de lus van de array om te zien of "Bob" in de string zat, en zoals het in de string was, zou het een berichtvenster retourneren en vervolgens de lus verlaten.

Zoeken in een multidimensionale array

We gebruiken de lus ook om door een multidimensionale array te zoeken. Nogmaals, we moeten een functie maken waarmee we door alle waarden in de array kunnen lopen, maar deze keer moeten we ook door elke dimensie van de array lopen.

123456789101112131415161718192021222324252627 Functie LoopThroughArray()Dim varArray() als variantDim strZoeken als stringstrFind = "Dokter"'declareer de grootte van de array'ReDim varArray(1, 2)'initialiseer de array'varArray(0, 0) = "Mel Smith"varArray(0, 1) = "Fred Buckle"varArray(0, 2) = "Jane Eyre"varArray(1, 0) = "Accountant"varArray(1, 1) = "Secretaris"varArray(1, 2) = "Dokter"'declareer variabelen voor de lus'Dim i As Long, j As Long'lus voor de eerste dimensie'Voor i = LBound(varArray, 1) Naar UBound(varArray, 1)'lus voor de tweede dimensie'Voor j = LBound(varArray, 2) Naar UBound(varArray, 2)'als we de waarde vinden, geef dan msgbox aan dat we de waarde hebben en verlaat de functie'Als varArray(i, j) = strFind DanMsgBox "Dokter is gevonden!"Functie verlatenStop alsvolgende jvolgende iFunctie beëindigen
wave wave wave wave wave