Ricerca VBA per (Trova) valore nell'array

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
wave wave wave wave wave