Lavorare con le Matrici: un po' di teoria

Nel precedente articolo abbiamo cominciato a vedere che è quasi impossibile lavorare in VBA senza far uso di variabili.

Abbiamo visto come dichiarare le variabili ed accennato ai vari tipi di variabili di cui possiamo disporre e abbiamo anche accennato a come predisporle per una giusta visibilità:

Abbiamo visto anche che quando è necessario lavorare con un numero discreto di variabli è possibile aggregarle in matrici, a seconda dei casi, ad una o più dimensioni.

Attenzione: Se per le variabili la dichiarazione è facoltativa anche se consigliabile, non altrettanto lo è per le matrici. Infatti le matrici debbono essere sempre dichiarate.

 

Attenzione: Leggere attentamente questo paragrafo.

Molti potrebbero obiettare che avendo i dati disponibili nelle celle dei vari fogli di Excel è inutile approfondire l'uso di matrici.

Per questa obiezione ho una duplice risposta:

Vero

Sbagliato

 

E' vero se dobbiamo lavorare ed elaborare pochi dati. La fatica usata per organizzare i dati in una matrice raramente è giustificata.
Chi pensa di non dover mai trattare grosse quantità di dati può fare a meno di questi approfondimenti.

E' sbagliato se dobbiamo elaborare una grossa mole di dati (migliaia o decine di migliaia) ed il fattore TEMPO è critico. Ben presto, soprattutto chi è abituato a lavorare con grosse quantità di dati, si accorgerà che eseguire complesse elaborazioni direttamente sulle celle del foglio richiede molto tempo. Lavorare sulle matrici abbatte queste lunghe attese di decine di minuti ed esegue il lavoro in una manciata di secondi.

Per questo motivo ritengo opportuno approfondire l'argomento che riguarda le matrici cercando di trattarne tutti gli aspetti.


Le matrici e le dimensioni

Le matrici possono essere ad una dimensione o a due e più dimensioni.

Un esempio di matrice ad una dimensione ci viene fornito dalla creazione di un semplice elenco disposto in una sola colonna (o riga) e può essere rappresentata da questa cassettiera:

Mela

Pera

Arancia

Limone

ecc

Un esempio di matrice a due dimensioni ci viene fornito da dati disposti in maniera tabellare e distribuiti in righe e colonne. Normalmente nella prima dimensione vediamo il numero di righe e nella seconda dimensione vediamo il numero di colonne ed in queste righe e colonne vengono distribuiti in modo ordinato i nostri dati proprio come in questa seconda cassettiera o il più famigliare foglio di calcolo.

Nome Cognome Città
Archimede Pitagorico Siracusa
Alessandro Manzoni Milano
Giosuè Carducci Valdicastello
Giovanni Pascoli S. Mauro di Romagna
Gabriele D'Annunzio Pescara
Dante Alighieri Firenze
ecc    

Poco pratico comincia ad essere l'uso di una matrice a più di due dimenzioni.
Infatti se una matrice ad una dimensione può essere paragonata ad un elenco che vediamo in una colonna o riga di un foglio di Excel, una matrice a due dimensioni può essere paragonata ad una tabella che si sviluppa in un insieme di righe e colonne di un foglio.

Ma una matrice a più di due dimensioni può essere paragonata a tabelle disposte su più fogli.

Quando si aggiungono dimensioni a una matrice, lo spazio di memorizzazione totale necessario aumenta in modo considerevole. È pertanto consigliabile utilizzare le matrici a più dimensioni con cautela, soprattutto nel caso di matrici Variant, che hanno dimensioni maggiori rispetto agli altri tipi di dati.


Le matrici e gli indici

Gli elementi di una matrice sono contraddistinti da indici proprio come in una battaglia navale, o meglio, visto che stiamo lavorando su Excel, come le celle di un foglio di lavoro. Per memorizzare o leggere un dato in una matrice è necessario indicarne le coordinate. Se la matrice è ad una sola dimensione la coordinata è una, ma se la matrice è a due o più dimensioni le coordinate da indicare sono due o più: MiaMatrice(1), MiaMatrice(2), MiaMatrice(1,1), MiaMatrice(1,2,1), ecc

Come è facilmente intuibile, spero, gli indici di ogni dimensione di una matrice hanno un limite inferiore ed uno superiore, ossia vanno da da un minimo ad un massimo.

Il limite inferiore di una matrice può essere referenziato con l'indice 0 o con l'indice 1. Questo dipende da settaggio del parametro "option base" che può essere dichiarato ad inizio del modulo che ospita la routine che fa uso di matrici con questa istruzione: Option Base 1. Non ha invece senso, anche se tollerata, la dichiarazione Option Base 0 perchè questa è la impostazione di default per ogni nuovo modulo.

Il limite inferiore inoltre non è limitato ai soli valori di 0 od 1 ma può essere diverso da 0 o da 1 se definito diversamente al momento della dichiarazione della matrice. In questo modo sia il limite inferiore della matrice che quello superiore sono personalizzabili in fase di progettazione.

 


Le matrici statiche e dinamiche

Le matrici possono essere di due nature: Statiche o Dinamiche

Le matrici statiche vengono usate quando occorre memorizzare un cospicuo numero di elementi. La quantità di elementi da memorizzare in una matrice statica è già nota al momento della sua dichiarazione. Il VBA riserva una quantità di memoria necessaria a contenere tutti i dati fin dal momento della dichiarazione. Le matrici statiche una volta create non possono essere ridimensionate durante l'esecuzione. Il loro indice, nella dichiarazione, è indicato da numeri costanti numerici, ossia non può essere indicato da una variabile.

Le matrici dinamiche rappresentano una buona alternativa alle matrici statiche in quanto permettono di essere usate anche quando non si conosce la quantità di dati da memorizzare. Il suo ridimensionamento, appunto per la natura stessa del tipo di matrice, può essere eseguito anche con valori contenuti in variabili e non solo con valori costanti. Inoltre ci sono due tipi di ridimensionamento: con perdita di dati (eseguito col semplice Redim) e senza perdita di dati usando la parola chiave Preserve.

In VBA, può essere dichiarato che una matrice sia dinamica cosicché sia possibile che il numero di elementi e dimensioni si modifichi in seguito durante l'esecuzione del codice.

È possibile utilizzare l'istruzione ReDim per modificare la dimensione di uno o più dimensioni di una matrice. Se si dispone di una matrice di grandi dimensioni e non si necessita più di alcuni dei suoi elementi, ReDim può liberare un po' di memoria riducendo le dimensioni della matrice. Dall'altra parte invece, se il codice determina che una matrice necessita di più elementi, ReDim sarà in grado di aggiungerli.

Se si utilizza Preserve, è possibile ridimensionare solo l'ultima dimensione della matrice, mentre per ogni altra dimensione sarà necessario specificare lo stesso limite già presente nella matrice esistente.

Se ad esempio la matrice ha un'unica dimensione, è possibile ridimensionare quest'ultima e mantenere ancora tutto il contenuto della matrice, in quanto si sta modificando l'ultima e unica dimensione. Nelle matrici con due o più dimensioni, invece, è consentito ridimensionare solo l'ultima dimensione quando si utilizza la parola chiave Preserve.

 


Per non appesantire la lettura e non complicare la comprensione dell'argomento, mi fermo qui. Ma nella prossima pagina esempio continueremo ad approfondire il discorso.