Denne vejledning viser, hvordan du søger efter (Find) en værdi i et array i VBA
Der er en række måder, du kan søge efter en streng i en matrix - afhængigt af om matrixen er en endimensionel eller flerdimensionel.
Søgning i en en-dimensionel matrix
For at søge efter en værdi i et endimensionelt array kan du bruge filterfunktionen.
123 | Dim z Som variant'filtrer det originale arrayz = Filter (Array, String, True, vbCompareBinary) |
Syntaxen for indstillingen Filter er følgende
Filter (Kildearray, Match som streng, [Inkluder som boolsk], [Sammenlign som vbCompareMethod])
Det Kildearray og Match som streng er påkrævet, mens Medtag som boolsk og Sammenlign som vbCompareMethod er valgfrie. Hvis disse ikke er inkluderet, er de indstillet til Sand og vbCompareBinary henholdsvis.
Find værdier, der matcher filteret
1234567891011121314 | Sub FindBob ()'Opret arrayDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklære en variant til at gemme filterdata iDim strSubNames som variant'filtrer det originale arraystrSubNames = Filter (strName, "Bob")'hvis din LBound -værdi er større end -1, er værdien fundetHvis LBound (strSubNames)> -1 Så er MsgBox ("Jeg fandt Bob")Afslut Sub |
Det andet array indeholder de værdier, der findes af filteret. Hvis dine LBound- og UBound -værdier ikke er -1, har arrayet formået at finde den værdi, du søgte efter.
Du kan også se, hvor mange gange teksten vises i det originale array.
1234567891011121314 | Sub CountNames ()'Opret arrayDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklære en matrix til at gemme filterdata iDim strSubNames som variant'filtrer det originale arraystrSubNames = Filter (strName, "Bob")'hvis du minus LBound fra UBound -værdierne og tilføjer 1, får vi det antal gange, teksten visesMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "navne fundet."Afslut Sub |
Find værdier, der IKKE matcher filteret
Det [Inkluder som boolsk] indstilling giver dig mulighed for at finde, hvor mange værdier i dit array, som LADE VÆRE MED match dit filter
1234567891011121314 | Sub CountExtraNames ()'oprette arrayDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'erklære en matrix til at gemme filterdata iDim strSubNames som variant'filtrer det originale arraystrSubNames = Filter (strName, "Bob", Falsk)'hvis du minus LBound fra UBound -værdierne og tilføjer 1, får vi det antal gange, teksten visesMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "navne fundet."Afslut Sub |
vi har derfor ændret denne linje:
1 | strSubNames = Filter (strName, "Bob") |
med denne linje:
1 | strSubNames = Filter (strName, "Bob", Falsk) |
Hvis du bruger denne linje i koden, returneres alle de navne, der IKKE matcher "Bob".
Kassefølsomme filtre
Du vil opdage, at filteret som standard er forskelligt mellem store og små bogstaver. Dette gælder for alle VBA -funktioner. Hvis du vil søge efter tekst, der ikke er store og små bogstaver, skal du ændre din kode lidt.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Tilføjelse vbTextCompare til din filterlinje giver din kode mulighed for at finde “bob” eller “Bob”. Hvis dette udelades, bruges VBA som standard vbBinaryCompare som kun vil lede efter data, der er en EKSAKT match. Bemærk i eksemplet ovenfor, vi har udeladt [Inkluder som boolsk] argumentet så Sand antages.
Mulighed Sammenlign tekst
Alternativt kan du tilføje teksten Mulighed Sammenlign tekst til toppen af dit modul - dette vil gøre alle de funktioner, du skriver i det pågældende modul, ufølsomme.
Brug af en loop til at søge gennem et array
At bruge en loop er lidt mere kompliceret end at bruge filterfunktionen. Vi kan oprette en funktion, der går gennem alle værdierne i arrayet.
1234567891011121314151617 | Sub LoopThroughArray ()'oprette arrayDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strFind som strengstrFind = "Bob"Dim i så længe'loop gennem arrayetFor i = LBound (strName, 1) Til UBound (strName, 1)Hvis InStr (strName (i), strFind)> 0 SåMsgBox "Bob er fundet!"Afslut ForAfslut HvisNæste iAfslut Sub |
For at finde en del af tekststrengen, dvs. “Bob” i stedet for “Bob Smith” eller “Bob Williams”, var vi nødt til at bruge Instr -funktionen i If -erklæringen. Dette kiggede i strengen, der blev returneret af sløjfen fra matrixen for at se, om "Bob" var i strengen, og som det var i strengen, ville den returnere en meddelelsesboks og derefter afslutte løkken.
Søger i et flerdimensionalt array
Vi bruger også løkken til at søge gennem et multidimensionalt array. Endnu en gang er vi nødt til at oprette en funktion, der gør det muligt for os at gennemgå alle værdierne i arrayet, men denne gang skal vi også gå gennem hver dimension i arrayet.
123456789101112131415161718192021222324252627 | Function LoopThroughArray ()Dim varArray () Som variantDim strFind As StringstrFind = "Læge"'angive størrelsen på arrayetReDim varArray (1, 2)'initialiser arrayetvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Bogholder"varArray (1, 1) = "Sekretær"varArray (1, 2) = "Læge"'erklære variabler for sløjfenDim i As Long, j As Long'loop for den første dimensionFor i = LBound (varArray, 1) Til UBound (varArray, 1)'loop for den anden dimensionFor j = LBound (varArray, 2) Til UBound (varArray, 2)'hvis vi finder værdien, så msgbox for at sige, at vi har værdien og forlader funktionenHvis varArray (i, j) = strFind derefterMsgBox "Lægen er fundet!"Afslut funktionAfslut HvisNæste jNæste iAfslut funktion |