TOP

VBA-Lezione 8.2. Cicli (Loops)

YouLibreCalc for Excel logo

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