TOP

VBA-Lezione 8.2. Cicli (Loops)

Per mettere in pratica ciò che abbiamo appena imparato, seguiremo il processo di creazione di una macro per dipingere una scacchiera 10x10 (rossa e nera) a partire dalla cella attualmente attiva.


Diamo un'occhiata all'output del ciclo che vogliamo ottenere:

Successivamente, il primo passo dell'esercizio sarà creare una procedura vuota:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere

    '...
   
End Sub

Iniziamo aggiungendo un ciclo FOR per annerire la colonna A (la costante NB_CELLS è 10).

Dovremmo ottenere il seguente risultato:

Diamo un'occhiata al codice:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere

    For r = 1 To NB_CELLS 'r => numero di riga
   
        Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Nero

    Next
   
End Sub

Il passaggio successivo colora di rosso ogni cella successiva, utilizzando l'istruzione IF (a seconda che il numero di riga sia pari o dispari). Vedere inferiore:

Il codice per risolvere questa sottoattività è il seguente:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere

    For r = 1 To NB_CELLS 'r => numero di riga
   
       If r Mod 2 = 0 Then 'Mod => è il resto della divisione
           Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'Rosso
       Else
           Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Nero
       End If

    Next
   
End Sub

La condizione IF r Mod 2 = 0 significa: se il resto della divisione r per 2 è 0...

Solo il numero di riga pari ha resto 0 se diviso per 2:

Come creare un altro ciclo che esegua il ciclo che abbiamo già scritto per 10 colonne. Vedere inferiore:

Il codice per risolvere questa sottoattività è il seguente:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Scacchiera 10x10 con celle

    For r = 1 To NB_CELLS 'r => Numero di riga
   
        For c = 1 To NB_CELLS 'c => Numero di colonna
       
           If r Mod 2 = 0 Then
               Cells(r, c).Interior.Color = RGB(200, 0, 0) 'Rosso
           Else
               Cells(r, c).Interior.Color = RGB(0, 0, 0) 'Nero
           End If
           
        Next
    Next
   
End Sub

Ora il secondo ciclo è inserito nel primo.

Per ottenere il seguente risultato...

Sostituire:

If r Mod 2 = 0 Then

SU:

If (r + c) Mod 2 = 0 Then

Non resta che modificare il codice in modo che la scacchiera venga creata a partire dalla cella selezionata (non A1). Vedi sotto:

Per questo, scriveremo il seguente codice:

Sub loops_exercise()

   Const NB_CELLS As Integer = 10 'Scacchiera 10x10 con celle
   Dim offset_row As Integer, offset_col As Integer '=> aggiungi 2 variabili
   
   'Offset (righe) a partire dalla prima cella = numero di riga della cella attiva corrente - 1
   offset_row = ActiveCell.Row - 1
   'Offset (colonne) a partire dalla prima cella = numero di colonna della cella attualmente attiva - 1
   offset_col = ActiveCell.Column - 1
   
   For r = 1 To NB_CELLS 'Numero di riga
   
        For c = 1 To NB_CELLS 'Numero di colonna
       
            If (r + c) Mod 2 = 0 Then
            'Cella (numero di riga + offset di riga aggiuntivo, numero di colonna +
            'spostamento aggiuntivo degli altoparlanti)
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0) 'Rosso
            Else
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0) 'Nero
            End If
           
        Next
   Next
   
End Sub