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à...
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.
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.
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.
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