TOP

VBA-Lezione 13.2. Utilizzo degli array (Arrays) (continua)


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

Matrice dinamica

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)

Ubound

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

Salvataggio dei dati in un intervallo di elementi dell'array

È 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).

Serie (Array)

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

Converti testo in array (VBA Split)

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