Denna handledning kommer att visa hur du söker efter (Hitta) ett värde i en matris i VBA
Det finns ett antal sätt att söka efter en sträng i en array - beroende på om matrisen är en endimensionell eller flerdimensionell.
Söker i en endimensionell uppsättning
Om du vill söka efter ett värde i en endimensionell array kan du använda filterfunktionen.
123 | Dim z Som variant'filtrera den ursprungliga matrisenz = Filter (Array, String, True, vbCompareBinary) |
Syntaxen för alternativet Filter är följande
Filtrera (källmatris, matcha som sträng, [inkludera som booleskt], [Jämför som vbCompareMethod])
De Källa Array och den Matcha som sträng krävs medan Inkludera som booleskt och den Jämför som vbCompareMethod är valfria. Om dessa inte ingår är de inställda på Sann och vbCompareBinary respektive.
Hitta värden som matchar filtret
1234567891011121314 | Sub FindBob ()'Skapa matrisDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarera en variant för att lagra filterdata iDim strSubNames som variant'filtrera den ursprungliga matrisenstrSubNames = Filter (strName, "Bob")'om ditt LBound -värde är större än -1, har värdet hittatsOm LBound (strSubNames)> -1 Då MsgBox ("Jag hittade Bob")Avsluta Sub |
Den andra matrisen innehåller de värden som finns i filtret. Om dina LBound- och UBound -värden inte är -1 har matrisen lyckats hitta det värde du sökte efter.
Du kan också se hur många gånger texten visas i den ursprungliga matrisen.
1234567891011121314 | Sub CountNames ()'Skapa matrisDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarera en array för att lagra filterdata iDim strSubNames som variant'filtrera den ursprungliga matrisenstrSubNames = Filter (strName, "Bob")'om du minus LBound från UBound -värdena och lägger till 1 får vi antalet gånger texten visasMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "namn hittades."Avsluta Sub |
Hitta värden som INTE matchar filtret
De [Inkludera som booleskt] alternativet kan du hitta hur många värden i din matris som LÅT BLI matcha ditt filter
1234567891011121314 | Sub CountExtraNames ()'skapa matrisDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'deklarera en array för att lagra filterdata iDim strSubNames som variant'filtrera den ursprungliga matrisenstrSubNames = Filter (strName, "Bob", falskt)'om du minus LBound från UBound -värdena och lägger till 1 får vi antalet gånger texten visasMsgbox UBound (strSubNames) - LBound (strSubNames) + 1 & "namn hittades."Avsluta Sub |
Vi har därför ändrat denna rad:
1 | strSubNames = Filter (strName, "Bob") |
med den här raden:
1 | strSubNames = Filter (strName, "Bob", falskt) |
Om du använder den här raden i koden returnerar alla namn som INTE matchar "Bob".
Skyltkänsliga filter
Du kommer att upptäcka att filtret är skiftlägeskänsligt som standard. Detta gäller för alla VBA -funktioner. Om du vill söka efter text som inte är skiftlägeskänslig måste du ändra din kod något.
1 | z = Filter (strName, "bob" ,, vbTextCompare) |
Lägger till vbTextCompare till din filterrad gör det möjligt för din kod att hitta "bob" eller "Bob". Om detta utelämnas använder VBA som standard vbBinaryCompare som bara letar efter data som är en EXAKT match. Lägg märke till i exemplet ovan, vi har utelämnat [Inkludera som booleskt] argument så True antas.
Alternativ Jämför text
Alternativt kan du lägga till texten Alternativ Jämför text till toppen av din modul - detta kommer att göra alla funktioner som du skriver i just den modulen skiftlägeskänsliga.
Använda en loop för att söka igenom en array
Att använda en loop är lite mer komplicerat än att använda filterfunktionen. Vi kan skapa en funktion som går igenom alla värden i matrisen.
1234567891011121314151617 | Sub LoopThroughArray ()'skapa matrisDim strName () Som variantstrName () = Array ("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strFind as stringstrFind = "Bob"Dim i As Long'gå igenom matrisenFör i = LBound (strName, 1) Till UBound (strName, 1)Om InStr (strName (i), strFind)> 0 DåMsgBox "Bob har hittats!"Avsluta förAvsluta omNästa iAvsluta Sub |
För att hitta en del av textsträngen, dvs "Bob" istället för "Bob Smith" eller "Bob Williams", behövde vi använda Instr -funktionen i If -uttalandet. Detta tittade i strängen som returnerades av slingan från matrisen för att se om "Bob" fanns i strängen, och som det var i strängen, skulle den returnera en meddelanderuta och sedan avsluta slingan.
Söker i en flerdimensionell matris
Vi använder också slingan för att söka igenom en flerdimensionell matris. Återigen måste vi skapa en funktion som gör det möjligt för oss att gå igenom alla värden i matrisen, men den här gången måste vi också gå igenom varje dimension i matrisen.
123456789101112131415161718192021222324252627 | Function LoopThroughArray ()Dim varArray () Som variantDim strFind As StringstrFind = "Doctor"'deklarera storleken på matrisenReDim varArray (1, 2)'initiera matrisenvarArray (0, 0) = "Mel Smith"varArray (0, 1) = "Fred Buckle"varArray (0, 2) = "Jane Eyre"varArray (1, 0) = "Bokförare"varArray (1, 1) = "Sekreterare"varArray (1, 2) = "Doktor"'deklarera variabler för slinganDim i As Long, j As Long'loop för den första dimensionenFör i = LBound (varArray, 1) Till UBound (varArray, 1)'loop för den andra dimensionenFör j = LBound (varArray, 2) Till UBound (varArray, 2)'om vi hittar värdet, så msgbox för att säga att vi har värdet och lämnar funktionenIf varArray (i, j) = strFind ThenMsgBox "Läkaren har hittats!"Avsluta funktionAvsluta omNästa jNästa iAvsluta funktion |