Le matrici di Visual Basic per Excel sono strutture che vengono utilizzate per archiviare un set di variabili correlate dello stesso tipo. È possibile accedere a ciascuna voce dell’array mediante un numero indice.
Ad esempio, se hai 20 membri di una squadra e volessi memorizzare tutti i nomi per utilizzarli nel tuo codice VBA. È possibile dichiarare 20 variabili per contenere i nomi dei membri del team, come segue:
Dim Team_Member1 As String
Dim Team_Member2 As String
.
.
.
Dim Team_Member20 As String
In alternativa, è possibile utilizzare il metodo più semplice e organizzato per memorizzare i membri del team in un array di 20 variabili String:
Dim Team_Members(1 To 20) As String
Dopo aver dichiarato l’array come sopra, ogni voce dell’array può essere popolata come segue:
Team_Members(1) = "Mario Rossi"
Un ulteriore vantaggio della memorizzazione dei dati in un array, piuttosto che nelle singole variabili, sorge se si desidera eseguire la stessa azione su tutti i membri dell’elenco. Se i nomi dei membri del team fossero memorizzati in 20 singole variabili, occorrerebbero 20 righe di codice per eseguire un’azione specifica su ciascun nome. Invece, se i nomi sono stati memorizzati in un array, è possibile utilizzare un semplice ciclo per eseguire l’azione per ciascuna voce dell’array.
Questo è mostrato nel seguente codice di esempio, che stampa ogni nome nell’array Team_Members sulla colonna A del foglio di lavoro Excel corrente:
For i = 1 To 20
Cells(i, 1).Value = Team_Members(i)
Next i
Anche con soli 20 nomi, i vantaggi dell’uso di un array sono evidenti, ma immagina di avere 1.000 nomi da memorizzare! E immagina di voler memorizzare i cognomi separatamente dai nomi! Presto sarebbe quasi impossibile gestire questa quantità di dati senza l’uso di array nel tuo codice VBA.
Le matrici multidimensionali di Visual Basic per Excel
Gli array di Visual Basic discussi sopra sono monodimensionali, in quanto si riferiscono a un elenco di nomi. Tuttavia, le matrici possono avere più dimensioni. Un array con due dimensioni può essere pensato come una griglia di valori.
Ad esempio, immagina di voler memorizzare i dati sulle vendite giornaliere per il mese di gennaio, per 5 team diversi. Avresti bisogno di una matrice bidimensionale, composta da 5 serie di importi per 31 giorni. Dichiarerai quindi l’array come segue:
Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency
Per accedere alle voci nella matrice “Jan_Sales_Figures”, è necessario utilizzare due indici, facendo riferimento al giorno del mese e al numero del team. Ad esempio, i dati sulle vendite di Team2 il 15 gennaio sarebbero indicati come:
Jan_Sales_Figures(15, 2)
È possibile dichiarare matrici con 3 o più dimensioni allo stesso modo. Cioè aggiungendo ulteriori dimensioni nella dichiarazione e usando un ulteriore indice per fare riferimento alle voci dell’array.
Dichiarare le matrici di Visual Basic per Excel
Le sezioni precedenti hanno già fornito alcuni esempi di dichiarazioni di array di Visual Basic, ma vale la pena discuterne ulteriormente. Come visto sopra, un array monodimensionale può essere dichiarato come segue:
Dim Team_Members(1 To 20) As String
Questa dichiarazione dice al compilatore VBA che l’array ‘Team_Members’ ha 20 variabili, a cui fanno riferimento gli indici da 1 a 20. Tuttavia, potremmo anche decidere di indicizzare le 20 variabili di array da 0 a 19, nel qual caso la dichiarazione sarebbe:
Dim Team_Members(0 To 19) As String
In effetti, la forma predefinita di indicizzazione dell’array è iniziare da 0, quindi se si omette l’indice iniziale dalla dichiarazione, si dichiara l’array semplicemente così:
Dim Team_Members(19) As String
Quindi il compilatore VBA capirà che si tratta di un array di 20 variabili, che sono indicizzate da 0 a 19.
Le stesse regole vengono applicate alle dichiarazioni di array multidimensionali. Come mostrato nell’esempio precedente, una matrice bidimensionale viene dichiarata separando gli indici di dimensione con una virgola:
Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency
Invece, se omettiamo gli indici iniziali da entrambe le dimensioni, sarà come segue:
Dim Jan_Sales_Figures(31, 5) As Currency
questo è inteso come un array bidimensionale in cui la prima dimensione ha 32 voci, indicizzate da 0 a 31 e la seconda dimensione ha 6 voci, indicizzate da 0 a 5.
Matrici dinamiche
Negli esempi precedenti, le matrici hanno tutte dimensioni fisse. Tuttavia, in molti casi, potresti non sapere quanto sarà grande un array prima del runtime. Un modo per risolvere il problema è dichiarare un array enorme, nel tentativo di coprire le dimensioni massime possibili necessarie, ma ciò consumerebbe una quantità inutilmente grande di memoria e potrebbe rallentare il programma. Un’opzione migliore sarebbe quella di utilizzare un array dinamico, che è un array che può essere ridimensionato tutte le volte che vuoi, durante l’esecuzione di una macro.
Un array dinamico viene dichiarato con parentesi vuote, come segue:
Dim Team_Members() As String
È quindi necessario dichiarare la dimensione dell’array durante l’esecuzione del codice, usando l’istruzione ReDim:
ReDim Team_Members(1 To 20)
Se, durante l’esecuzione del codice, è necessario estendere le dimensioni di un array, è possibile utilizzare nuovamente ReDim:
If Team_Size > 20 Then
ReDim Team_Members(1 To Team_Size)
End If
Va notato che il ridimensionamento di un array dinamico in questo modo comporterà la perdita di tutti i valori che erano stati precedentemente memorizzati nell’array. Se si desidera evitare questa perdita e mantenere i valori precedentemente assegnati all’array, è necessario utilizzare la parola chiave ‘Preserve‘, come mostrato di seguito:
If Team_Size > 20 Then
ReDim Preserve Team_Members(1 To Team_Size)
End If
Lo svantaggio dell’uso della parola chiave ‘Preserve‘ quando si ridimensionano le matrici di Visual Basic è che è possibile modificare solo il limite superiore di un array, non il limite inferiore. Inoltre, se si dispone di un array multidimensionale, l’uso della parola chiave ‘Preserve‘ consente di modificare solo l’ultima dimensione dell’array.