Per memorizzare più di una colonna di dati, abbiamo bisogno di una dimensione diversa dell'array. Esempio:
Salvataggio dei dati in un array bidimensionale:
'Dichiarazione Dim array_example(10, 2) 'Array "definito" 11 x 3 'Salvataggio dei dati in un array For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Ecco alcuni esempi di come lavorare con questi valori:
MsgBox array_example(0, 0) '=> restituzione: 03.11.2026 MsgBox array_example(0, 1) '=> restituisce: 24 MsgBox array_example(9, 2) '=> restituisce: NO MsgBox array_example(10, 2) '=> restituisce: YES
Immaginiamo per un momento di dover aggiornare regolarmente i dati del nostro array e quindi di non poter assegnare valori fissi al momento della dichiarazione...
Per trovare il numero di riga dell'ultima cella non vuota, o in altre parole dell'ultima riga del nostro database, utilizzeremo la seguente formula:
last_row = Range("A1").End(xlDown).Row
Excel non accetta variabili nella dichiarazione.
Dichiara invece un array dinamico (usando parentesi vuote), quindi definisci la sua dimensione usando Redim:
Dim array_example() ReDim array_example(last_row - 2, 2)
Utilizzando la seguente procedura, puoi memorizzare tutte le righe del tuo set di dati (tabella) nel nostro array:
Dim array_example() ReDim array_example(last_row - 2, 2)
Nell'esempio precedente, l'ultimo numero nel nostro array era last_row - 2:
For i = 0 To last_row - 2
Un altro modo per determinare l'ultimo numero nel nostro array potrebbe essere utilizzando Ubound:
For i = 0 To UBound(array_example)
Questa funzione restituisce il numero più grande nell'array per la dimensione selezionata (la prima dimensione è quella predefinita).
Ecco alcuni esempi che renderanno tutto più chiaro:
Sub example() Dim array_example(10, 2) MsgBox UBound(array_example) '=> restituisce: 10 MsgBox UBound(array_example, 1) '=> restituisce: 10 MsgBox UBound(array_example, 2) '=> restituisce: 2 End Sub
È possibile popolare un array con valori da un intervallo di celle su un foglio di lavoro senza nemmeno utilizzare un ciclo:
'Dichiarazione Dim array_example(10, 2) 'Array "definito" 11 x 3 'Salvataggio dei dati in un array For i = 0 To 10 array_example(i, 0) = Range("A" & i + 2) array_example(i, 1) = Range("B" & i + 2) array_example(i, 2) = Range("C" & i + 2) Next
Il codice precedente può essere efficacemente sostituito da questo:
'Dichiarazione Dim array_example() 'Salvataggio dei dati in un array array_example = Range("A2:C12").Value
Sebbene il secondo metodo sembri più interessante del primo, fai attenzione perché nella maggior parte dei casi potrebbe costarti più tempo rispetto al primo.
Se memorizzi i dati nell'array in questo modo, il primo numero sarà 1 anziché 0, il che può causare confusione...
Successivamente nel processo di incremento del codice, se decidi di memorizzare nell'array solo i dati che soddisfano determinati criteri di ricerca (o di eseguire un'operazione completamente diversa), dovrai riscrivere completamente il codice utilizzando una funzione di loop diversa...
Ma questo secondo metodo è molto utile se è necessario salvare l'intero contenuto di un set di dati di grandi dimensioni, perché è più veloce del looping (risparmiando circa 0,2 secondi ogni 15.000 record).
Ma se è necessario creare un array con contenuti "fissi".
Una soluzione potrebbe essere quella di registrare i valori nastro per nastro:
Dim en(5) en(0) = "IF" en(1) = "VLOOKUP" en(2) = "SUM" en(3) = "COUNT" en(4) = "ISNUMBER" en(5) = "MID"
Fortunatamente, puoi semplificare questo codice utilizzando un array (Array):
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
Ecco una dimostrazione dell'utilizzo della funzione Replace (questo ti aiuterà a capire il seguente esempio):
Sub replace_example() Dim var_translate As String 'Nastro di testo per questo esempio var_translate = "Hello World !" 'Sostituisci "Mondo" con "tu" nella barra multifunzione di testo var_translate = Replace(var_translate, "World", "you") 'Nastro dopo la sostituzione MsgBox var_translate '=> restituisce "Ciao a te!" End Sub
Ora, se vogliamo sostituire una serie di valori con un altro insieme di dati, utilizzare gli array e la funzione Array ci sarà estremamente utile:
Sub translate() 'Un esempio semplificato di traduzione di formule dall'inglese al francese Dim var_translate As String 'Nastro di testo per questo esempio var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))" 'Due serie di valori en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT") 'Sostituisci "SI" con "IF", "RECHERVEV" con "VLOOKUP", ecc. For i = 0 To UBound(en) var_translate = Replace(var_translate, en(i), fr(i)) Next 'Nastro dopo la sostituzione MsgBox var_translate '=> restituisce "Formula da tradurre: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))" End Sub
La funzione Split ci permette di dividere la stringa di caratteri in parti e scrivere i valori risultanti in un array.
Per convertire una barra multifunzione in una matrice, procedere come segue:
variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
Utilizza la funzione VBA Split e specifica il separatore:
en = Split(variable, "/")
L'array "en" restituirà i seguenti valori:
MsgBox en(0) '=> restituisce: IF MsgBox en(1) '=> restituisce: CERCA.VERT MsgBox en(2) '=> restituisce: SOMMA MsgBox en(3) '=> restituisce: COUNT MsgBox en(4) '=> restituisce: ISNUMERO MsgBox en(5) '=> restituisce: MID
Anche i seguenti 3 array restituiranno gli stessi valori:
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID") en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",") en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
L'esempio seguente restituisce il terzo valore nella stringa:
MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> restituisce: SOMMA
L'inverso di Split è la funzione VBA Join.
Questa funzione raccoglie i valori di un array in una stringa.
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> restituisce: 12345