Se, nel tuo programma VBA, devi eseguire la stessa attività (ovvero ripetere lo stesso codice) più volte, puoi farlo utilizzando uno dei loop VBA.
I tipi di loop VBA sono:
- Il ciclo For
- Il ciclo Do While
- il ciclo Do Until
Ciascuno dei tipi di loop qua sopra è discusso separatamente di seguito.
Il ciclo For di Visual Basic
Il ciclo “For” di Visual Basic può assumere due forme diverse: il ciclo For … Next e il ciclo For Each.
Il ciclo For … Next
Il ciclo For … Next utilizza una variabile, che cicla attraverso una serie di valori all’interno di un intervallo specificato. Il codice VBA all’interno del loop viene quindi eseguito per ciascun valore. Questo è meglio spiegato con semplice esempio:
For i = 1 To 10
Total = Total + iArray(i)
Next i
Il precedente ciclo For … Next imposta la variabile i in modo che abbia i valori 1, 2, 3, …, 10 e per ciascuno di questi valori, esegue il codice VBA all’interno del loop. Pertanto, nell’esempio qua sopra, il ciclo aggiunge ciascuno dei membri dell’array iArray alla variabile Total.
Nell’esempio qua sopra, non viene specificata alcuna dimensione del passo, quindi il ciclo utilizza la dimensione di passo predefinita, che è 1. Tuttavia, a volte è possibile che si desideri scorrere un ciclo usando passi di dimensioni diverse. Questo può essere fatto usando la parola chiave Step, come mostrato nel seguente semplice esempio.
For d = 0 To 10 Step 0.1
dTotal = dTotal + d
Next d
Nel precedente ciclo For, poiché la dimensione del passo è specificata come 0,1, il valore della variabile d è impostato sui valori 0,0, 0,1, 0,2, 0,3, …, 9,9, 10,0 per ogni esecuzione del codice VBA all’interno del ciclo.
È inoltre possibile utilizzare dimensioni di passo negative nel ciclo For, come illustrato di seguito:
For i = 10 To 1 Step -1
iArray(i) = i
Next i
In questo esempio, la dimensione del passo è specificata come -1, quindi il ciclo imposta la variabile i per avere i valori, 10, 9, 8, …, 1.
Se vuoi approfondire il ciclo For Next di Visual Basic, puoi trovare la documentazione Microsoft a questo indirizzo.
Il ciclo For Each
Il ciclo For Each è simile al ciclo For … Next ma, invece di scorrere un set di valori assegnati ad una variabile, il ciclo For Each scorre ogni oggetto all’interno di un set di oggetti. Ad esempio, il codice seguente mostra il ciclo For Each utilizzato per elencare tutti i fogli di lavoro nella cartella di lavoro Excel corrente:
Dim wSheet As Worksheet
For Each wSheet in Worksheets
MsgBox "Trovato Foglio di lavoro: " & wSheet.Name
Next wSheet
Se vuoi approfondire il ciclo For Each di Visual Basic, puoi trovare la documentazione Microsoft a questo indirizzo.
L’istruzione Exit For
Se si desidera uscire anticipatamente da un ciclo ‘For’, è possibile utilizzare l’istruzione Exit For. Questa istruzione fa sì che VBA esca dal ciclo e continui con la riga di codice successiva al di fuori del ciclo. Ad esempio, durante la ricerca di un valore particolare in un array, è possibile utilizzare un ciclo per controllare ciascuna voce dell’array. Tuttavia, una volta trovato il valore che stai cercando, non è necessario continuare la ricerca, quindi esci dal ciclo in anticipo.
L’istruzione Exit For è illustrata nell’esempio seguente, che scorre attraverso 100 voci di array, confrontando ognuna con il valore ‘dVal’. Il ciclo viene chiuso anticipatamente se nell’array viene trovato dVal:
For i = 1 To 100
If dValues(i) = dVal Then
indexVal = i
Exit For
End If
Next i
Il ciclo Do While di Visual Basic
Il ciclo Do While esegue ripetutamente una sezione di codice finché una condizione specificata continua a risultare True. Ciò è mostrato nella seguente procedura Sub, in cui un ciclo Do While viene utilizzato per stampare tutti i valori della sequenza di Fibonacci fino a quando il valore corrente diventa maggiore di 1.000:
' Procedura Sub per elencare la serie di Fibonacci per tutti i valori inferiori a 1.000
Sub Fibonacci()
Dim i As Integer ' contatore per la posizione nella serie
Dim iFib As Integer ' contiene il valore corrente nella serie
Dim iFib_Next As Integer ' contiene il valore seguente nella serie
Dim iStep As Integer ' contiene la dimensione del passaggio seguente
' Inizializza le variabili i and iFib_Next
i = 1
iFib_Next = 0
' Ciclo Do While da eseguire finché il valore del
' corrente numero di Fibonacci supera 1000
Do While iFib_Next < 1000
If i = 1 Then
' Caso speciale per il primo numero della serie
iStep = 1
iFib = 0
Else
' Memorizza il passaggio seguente prima di sovrascrivere
' il numero corrente della serie
iStep = iFib
iFib = iFib_Next
End If
' Stampa il valore corrente di Fibonacci in colonna A
' del foglio di lavoro corrente
Cells(i, 1).Value = iFib
' Calcola il prossimo valore nella serie e incrementa
' il marcatore di posizione di 1
iFib_Next = iFib + iStep
i = i + 1
Loop
End Sub
Si può vedere che, nell’esempio qua sopra, la condizione iFib_Next <1000 viene testata all’inizio del loop. Pertanto, se il primo valore di iFib_Next fosse maggiore di 1.000, il loop non verrebbe eseguito affatto.
Un altro modo in cui è possibile implementare il ciclo Do While è quello di posizionare la condizione alla fine del ciclo anziché all’inizio. Questo fa sì che il loop venga eseguito almeno una volta, indipendentemente dal fatto che la condizione inizialmente sia valutata True o meno.
Il codice seguente mostra la forma di un ciclo Do While che presenta la condizione alla fine del ciclo:
Do
.
.
.
Loop While iFib_Next < 1000
Il ciclo Do Until di Visual Basic
Il ciclo Do Until è molto simile al ciclo Do While. Il ciclo esegue ripetutamente una sezione di codice fino a quando una condizione specificata non diventa True. Ciò è mostrato nella seguente procedura Sub, in cui un ciclo Do Until viene utilizzato per estrarre i valori da tutte le celle nella colonna A di un foglio di lavoro, fino a quando non incontra una cella vuota:
iRow = 1
Do Until IsEmpty(Cells(iRow, 1))
' Memorizza il valore della cella corrente nella matrice dCellValues
dCellValues(iRow) = Cells(iRow, 1).Value
iRow = iRow + 1
Loop
Nell’esempio qua sopra, poiché la condizione IsEmpty (Cells (iRow, 1)) è all’inizio del ciclo Do Until, il ciclo verrà avviato solo se la prima cella rilevata non è vuota.
Tuttavia, come illustrato nel ciclo Do While, a volte potresti voler avviare il ciclo almeno una volta, indipendentemente dalla condizione iniziale. In questo caso, la condizione può essere posizionata alla fine del loop, come segue:
Do
.
.
.
Loop Until IsEmpty(Cells(iRow, 1))
Se vuoi approfondire il ciclo Do Loop di Visual Basic, puoi trovare la documentazione Microsoft a questo indirizzo.
Vai a VBA Tutorial Parte 7 – Gli operatori e le funzioni incorporate
Torna alla pagina Tutorial VBA