Questo tutorial dimostrerà come cercare (trovare) un valore in un array in VBA
Esistono diversi modi per cercare una stringa in un array, a seconda che l'array sia unidimensionale o multidimensionale.
Ricerca in un array unidimensionale
Per cercare un valore in una matrice unidimensionale, puoi utilizzare la funzione di filtro.
123 | Dim z come variante'filtra l'array originalez = Filter(Array, String, True, vbCompareBinary) |
La sintassi dell'opzione Filtro è la seguente
Filter(Source Array, Corrispondenza come stringa, [Includi come booleano], [Confronta come vbCompareMethod])
Il Array sorgente e il Abbina come stringa sono necessari mentre i Includi come booleano e il Confronta come vbCompareMethod sono opzionali. Se questi non sono inclusi sono impostati su Vero e vbCompareBinary rispettivamente.
Trova i valori che corrispondono al filtro
1234567891011121314 | Sotto TrovaBob()"Crea matrice"Dim strName() come variantestrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'dichiarare una variante in cui memorizzare i dati del filtroDim strSubNames As Variant'filtra l'array originalestrSubNames = Filter(strName, "Bob")'se il valore di LBound è maggiore di -1, il valore è stato trovatoIf LBound(strSubNames ) > -1 Then MsgBox ("Ho trovato Bob")Fine sottotitolo |
Il secondo array conterrà i valori trovati dal filtro. Se i tuoi valori LBound e UBound non sono -1, l'array è riuscito a trovare il valore che stavi cercando.
Puoi anche vedere quante volte il testo appare nell'array originale.
1234567891011121314 | Sub CountNames()'Crea matriceDim strName() come variantestrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'dichiarare un array in cui memorizzare i dati del filtroDim strSubNames As Variant'filtra l'array originalestrSubNames = Filter(strName, "Bob")'se si sottrae LBound dai valori UBound e si aggiunge 1, otterremo il numero di volte in cui appare il testoMsgbox UBound(strSubNames) - LBound(strSubNames) + 1 & "nomi trovati."Fine sottotitolo |
Trova i valori che NON corrispondono al filtro
Il [Includi come booleano] l'opzione ti consente di trovare quanti valori nel tuo array che NON abbina il tuo filtro
1234567891011121314 | Sub CountExtraNames()'crea arrayDim strName() come variantestrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")'dichiarare un array in cui memorizzare i dati del filtroDim strSubNames As Variant'filtra l'array originalestrSubNames = Filter(strName, "Bob", False)'se si sottrae LBound dai valori UBound e si aggiunge 1, otterremo il numero di volte in cui appare il testoMsgbox UBound(strSubNames ) - LBound(strSubNames ) + 1 & "nomi trovati."Fine sottotitolo |
abbiamo quindi modificato questa riga:
1 | strSubNames = Filter(strName, "Bob") |
con questa riga:
1 | strSubNames = Filter(strName, "Bob", False) |
L'utilizzo di questa riga nel codice restituirebbe tutti i nomi che NON corrispondono a "Bob".
Filtri con distinzione tra maiuscole e minuscole
Scoprirai che il filtro fa distinzione tra maiuscole e minuscole per impostazione predefinita. Questo è vero per tutte le funzioni VBA. Se vuoi cercare del testo che non fa distinzione tra maiuscole e minuscole, devi modificare leggermente il codice.
1 | z = Filter(strName, "bob",, vbTextCompare) |
Aggiunta vbTextCompare alla tua linea di filtro abiliterà il tuo codice a trovare "bob" o "Bob". Se questo viene omesso, VBA per impostazione predefinita utilizza vbBinaryCompare che cercherà solo i dati che sono an ESATTO incontro. Notare nell'esempio sopra, abbiamo omesso il [Includi come booleano] argomento quindi si presume True.
Opzione Confronta testo
In alternativa, puoi aggiungere il testo Opzione Confronta testo all'inizio del tuo modulo - questo renderà tutte le funzioni che scrivi in quel particolare modulo insensibili alle maiuscole.
Utilizzo di un ciclo per la ricerca in un array
L'utilizzo di un ciclo è un po' più complicato rispetto all'utilizzo della funzione Filtro. Possiamo creare una funzione che scorrerà tutti i valori nell'array.
1234567891011121314151617 | Sub LoopThroughArray()'crea arrayDim strName() come variantestrName() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams")Dim strTrova come stringastrFind = "Bob"Dim I As Long'loop attraverso l'arrayPer i = LBound(strName, 1) To UBound(strName, 1)Se InStr(strName(i), strFind) > 0 AlloraMsgBox "Bob è stato trovato!"Esci perFinisci seAvanti ioFine sottotitolo |
Per trovare una parte della stringa di testo, ad esempio "Bob" invece di "Bob Smith" o "Bob Williams", era necessario utilizzare la funzione Instr nell'istruzione If. Questo ha cercato nella stringa restituita dal loop dall'array per vedere se "Bob" era nella stringa e, poiché era nella stringa, avrebbe restituito una finestra di messaggio e quindi Exit the Loop.
Ricerca in un array multidimensionale
Usiamo anche il ciclo per cercare attraverso un array multidimensionale. Ancora una volta, dobbiamo creare una funzione che ci permetta di scorrere tutti i valori nell'array, ma questa volta abbiamo anche bisogno di scorrere ogni dimensione dell'array.
123456789101112131415161718192021222324252627 | Funzione LoopThroughArray()Dim varArray() come varianteDim strTrova come stringastrFind = "Dottore"'dichiarare la dimensione dell'arrayReDim varArray(1, 2)'inizializza l'arrayvarArray(0, 0) = "Mel Smith"varArray(0, 1) = "Fibbia Fred"varArray(0, 2) = "Jane Eyre"varArray(1, 0) = "Contabile"varArray(1, 1) = "Segretaria"varArray(1, 2) = "Dottore"'dichiarare variabili per il ciclo'Dim i As Long, j As Long'loop per la prima dimensionePer i = LBound(varArray, 1) a UBound(varArray, 1)'loop per la seconda dimensionePer j = LBound(varArray, 2) To UBound(varArray, 2)'se troviamo il valore, allora msgbox per dire che abbiamo il valore ed esci dalla funzioneSe varArray(i, j) = strFind ThenMsgBox "Il dottore è stato trovato!"Esci dalla funzioneFinisci seAvanti jAvanti ioFine funzione |