TOP

VBA-Lezione 13.1. Utilizzo degli array (Arrays)

Gli array (Arrays) sono molto spesso utilizzati nella programmazione, incluso in Excel VBA.

Un array è essenzialmente una singola variabile con molte celle in cui memorizzare i valori, mentre una variabile tipica ha solo una cella di memorizzazione in cui può memorizzare un solo valore.

È possibile accedere ad un array nel suo insieme se si vuole fare riferimento a tutti i valori in esso contenuti, oppure è possibile fare riferimento ai suoi singoli elementi.

Puoi dichiarare un array in modo che funzioni con un insieme di valori dello stesso tipo di dati. Ne abbiamo già parlato in VBA-Lezione 6.2. Datatypes Ma ora scendiamo ancora più in profondità...

Perché vengono utilizzati gli array?

Immagina di provare a scrivere una procedura in cui devi memorizzare fino a 500 valori. Se devi creare 500 variabili separate, sarà molto difficile. Al centro dell'array, archiviare e lavorare con questi valori sarà molto più semplice.

Il secondo motivo per utilizzare gli array è la loro velocità. La lettura dei dati dagli array richiede molto meno tempo rispetto alle tabelle (composte da celle) nel foglio di lavoro Excel.


Un esempio di utilizzo degli array

Quindi ecco un esempio che mostrerà l'ovvio vantaggio dell'utilizzo degli array VBA in Excel.

Il primo foglio di lavoro ("DS") ha un set di dati: 5000 righe per 3 colonne:

Nel secondo foglio troverai una tabella riepilogativa che tiene conto di tutte le risposte "Sì" ("YES") per anno e cliente:

In questo caso la procedura utilizzerà un loop per elaborare il set di dati e registrare il numero di risposte "Sì" per ogni anno e per ogni codice cliente, per poi inserire tali dati nelle apposite celle.

Senza utilizzare gli array, occorrerebbero Excel 131,44 secondi per eseguire questa procedura:

Ma per salvare prima i dati in un array (dal foglio di lavoro "DS") e quindi eseguire gli stessi calcoli (utilizzando gli array invece del set di dati del foglio di lavoro "DS") occorreranno solo 1,74 secondi:

Se decidessimo di ottimizzare la nostra procedura memorizzando nell'array solo i dati contenenti le risposte "YES" (che rappresentano circa 3/4 dei dati totali), impiegheremmo solo 1,02 secondi:

Questo è un buon esempio di come l'utilizzo degli array consenta di eseguire una procedura 128 volte più velocemente. Il risultato della nostra ottimizzazione sarebbe ancora migliore se lavorassimo con molti set di dati contemporaneamente.

Torneremo sui dettagli del nostro esempio alla fine della lezione.

Dichiarazione di array

Di seguito sono riportati alcuni esempi di dichiarazione di array in VBA (se i primi due esempi non ti sono chiari, leggi):

 'Un esempio di dichiarazione di un array unidimensionale
 Dim array1(4)

 'Un esempio di dichiarazione di un array bidimensionale
 Dim array2(6, 1)

 'Un esempio di dichiarazione di un array dinamico
 Dim array3()

Se non è possibile inserire valori fissi durante la dichiarazione degli array (perché dipendono, ad esempio, dalla dimensione del set di dati), lasciare le parentesi vuote.

Non è necessario dichiarare un tipo di dati (string, long, ecc.), anche se in molti casi ciò rallenterà l'esecuzione della procedura.

Archiviazione dei dati in un array

Proviamo a memorizzare alcuni dati in un array:

In questo caso vogliamo memorizzare valori 11x1, quindi dobbiamo creare un array unidimensionale:

 'Dichiarazione
 Dim array_example(10)

Non dimenticare che la numerazione degli elementi nell'array inizia con 0 (questo è standard nella programmazione, quindi vale la pena prendere subito questa abitudine, anche se, in effetti, puoi cambiare questo approccio in VBA).

Ogni elemento nell'array riceverà ora il suo valore:

 'Salvataggio di valori in un array
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

È possibile operare o modificare ciascun elemento dell'array come se fosse una normale variabile.

Di seguito è riportato un esempio in cui utilizziamo array_example(8):

Sub example()
     'Dichiarazione
     Dim array_example(10)
     
     'Salvataggio di valori in un array
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     'Prova 1
     MsgBox array_example(8) '=> restituzione: 04/02/2016
    
     'Modifica di uno dei valori
     array_example(8) = Year(array_example(8))
     
     'Prova 2
     MsgBox array_example(8) '=> ritorni: 2016
End Sub

Un ciclo For sarebbe un'opzione migliore per salvare l'array più velocemente:

 'Dichiarazione
 Dim array_example(10)

 'Salvataggio di valori in un array
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next