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
-
-
-
- End Sub
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
-
- For r = 1 To NB_CELLS
-
- Cells(r, 1).Interior.Color = RGB(0, 0, 0)
-
- Next
-
- End Sub
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
-
- For r = 1 To NB_CELLS
-
- If r Mod 2 = 0 Then
- Cells(r, 1).Interior.Color = RGB(200, 0, 0)
- Else
- Cells(r, 1).Interior.Color = RGB(0, 0, 0)
- End If
-
- Next
-
- End Sub
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
-
- For r = 1 To NB_CELLS
-
- For c = 1 To NB_CELLS
-
- If r Mod 2 = 0 Then
- Cells(r, c).Interior.Color = RGB(200, 0, 0)
- Else
- Cells(r, c).Interior.Color = RGB(0, 0, 0)
- End If
-
- Next
- Next
-
- End Sub
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
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
- Dim offset_row As Integer, offset_col As Integer
-
-
- offset_row = ActiveCell.Row - 1
-
- offset_col = ActiveCell.Column - 1
-
- For r = 1 To NB_CELLS
-
- For c = 1 To NB_CELLS
-
- If (r + c) Mod 2 = 0 Then
-
-
- Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0)
- Else
- Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0)
- End If
-
- Next
- Next
-
- End Sub
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