In precedenza abbiamo visto il ciclo FOR, oggi vedremo una sua variante il ciclo FOR…EACH il quale ci permetterà di creare dei cicli dinamici.
Per il ciclo FOR, se vi ricordate la sua sintassi è
For X Inizio To Fine
…righe di codice con le istruzioni da eseguire
Next X
Ciò significa che dobbiamo dare un valore iniziale per far partire il ciclo ed uno finale per farlo terminare, ma se non fossimo a conoscenza di questi due limiti? Questo scenario può capitare quando abbiamo a che fare con un ciclo che può assumere valori dinamici a seconda del numero dei valori da controllare.
In questo caso può venirci in aiuto il ciclo FOR…EACH, il quale ci permetterà di controllare ogni singolo valore contenuto in un range specifico, la sintassi è
For Each X in Range(“indicare l’intervallo“)
…righe di codice con le istruzioni da eseguire
Next X
In sostanza Excel andrà a controllare uno dopo l’altro ogni valore contenuto nell’intervallo, questo significa che non è necessario sapere a priori quanto sarà grande questo l’intervallo e tanto meno sapere quanti valori saranno contenuti in esso, perché come detto prima saranno scansionati uno dopo l’altro.
Il comando Next dirà ad Excel di passare al valore successivo.
Come prima operazione andiamo a copiare la macro utilizzata con il ciclo FOR dopo di che apporteremo le opportune modifiche.
Premiamo Ctrl C + Ctrl V e rinominiamo la Sub da COLORA_CELLE() a COLORA_CELLE_FOR_EACH()
Andiamo a dichiarare 2 nuove variabili che utilizzeremo con questo ciclo, non preoccupatevi in corso d’opera capirete bene a cosa servono, definiamo le variabili:
valt as variant che assumerà il valore contenuto in ogni singola cella e indt che assumerà l’indirizzo della cella che andremo a colorare
Come tipo di variabile ho messo Variant questa tipologia è utilizzata per memorizzare qualsiasi dato. In sostanza è il tipo predefinito quando una variabile non viene dichiarata.
La prima parte rimarrà inalterata ma se prima utilizzavamo 2 cicli FOR nidificati uno per far avanzare le colonne ed uno per far avanzare le righe, con il ciclo FOR…EACH basterà indicare l’intervallo in cui effettuare il controllo, quindi cancelliamo
For Riga = 3 To 12 ‘ ciclo FOR per le righe
Next Riga
E scriviamo
For each valt in range(“C3:L12”) ‘ ciclo FOR EACH
Modifichiamo anche la variabile per il comando Next in:
Next valt
Ora dovremo eliminare anche le variabili Riga e Col che non ci servono più, ma cosa mettiamo al loro posto? Dovremo scrivere un’istruzione che ci restituirà il l’indirizzo della cella in questione, per fare questo scriveremo:
indt = valt.Address ‘ restituisce la posizione
indt sarà il nome della nostra variabile che conterrà le coordinate di riga e colonna restituite tramite l’istruzione Address
Aggiungiamo una variabile “valt” alla quale assegneremo il valore contenuto nella cella che si sta controllando, quindi scriviamo:
valt = Range(indt).Value ‘restituisce il valore
Infine modifichiamo la riga di codice per far colorare la tabella, nel seguente modo:
Range(indt).Interior.Color = RGB(R, G, B) ‘ colora la cella
A questo punto siamo pronti per far partire la nostra macro premendo F8, così vedremo anche passo passo i valori che assumeranno le varie variabili
…Andiamo a pulire la tabella…
…diamo i valori RGB…
Ed arriviamo al comando FOR…EACH, come potete vedere la variabile “valt” ha assunto il valore di 1 che corrisponde al primo valore della tabella, F8 nuovamente e vediamo che la variabile “indt” ha assunto il valore di $C$3, la quale ci conferma che il numero 1 è contenuto nella colonna C e riga 3
F8 e la riga successiva dirà di colorare la cella C3.
Continuiamo con F8 e riprendiamo nuovamente il ciclo.
… come vedete i valori delle variabili cambiano…
Ed in automatico Excel si porterà sulla seconda riga, facciamo avanzare ora la macro con il comando F5.
Come avete visto usando Il ciclo FOR…EACH abbiamo semplificato la struttura della macro perché alla fine usiamo un unico ciclo per tutta la tabella e soprattutto non dobbiamo preoccuparci di dare i valori limite con il classico ciclo FOR.
Anche oggi siamo arrivati al termine della lezione dedicata al ciclo FOR…EACH, ma abbiamo aggiunto un ulteriore tassello alla conoscenza del linguaggio VBA.
Nel video qui sotto trovate tutti i passaggi appena illustrati, buona visione.