fbpx

VBA Tutorial Parte 6: i Loop

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