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:

  1. Sub loops_exercise()  
  2.   
  3.     Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere  
  4.   
  5.     '...  
  6.      
  7. 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:

  1. Sub loops_exercise()  
  2.   
  3.     Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere  
  4.   
  5.     For r = 1 To NB_CELLS 'r => numero di riga  
  6.      
  7.         Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Nero  
  8.   
  9.     Next  
  10.      
  11. 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:

  1. Sub loops_exercise()  
  2.   
  3.     Const NB_CELLS As Integer = 10 'Il numero di celle che vogliamo dipingere  
  4.   
  5.     For r = 1 To NB_CELLS 'r => numero di riga  
  6.      
  7.        If r Mod 2 = 0 Then 'Mod => è il resto della divisione  
  8.            Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'Rosso  
  9.        Else  
  10.            Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Nero  
  11.        End If  
  12.   
  13.     Next  
  14.      
  15. 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:

  1. Sub loops_exercise()  
  2.   
  3.     Const NB_CELLS As Integer = 10 'Scacchiera 10x10 con celle  
  4.   
  5.     For r = 1 To NB_CELLS 'r => Numero di riga  
  6.      
  7.         For c = 1 To NB_CELLS 'c => Numero di colonna  
  8.          
  9.            If r Mod 2 = 0 Then  
  10.                Cells(r, c).Interior.Color = RGB(200, 0, 0) 'Rosso  
  11.            Else  
  12.                Cells(r, c).Interior.Color = RGB(0, 0, 0) 'Nero  
  13.            End If  
  14.              
  15.         Next  
  16.     Next  
  17.      
  18. End Sub  

Ora il secondo ciclo è inserito nel primo.

Per ottenere il seguente risultato...

Sostituire:

  1. If r Mod 2 = 0 Then  

SU:

  1. 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:

  1. Sub loops_exercise()  
  2.   
  3.    Const NB_CELLS As Integer = 10 'Scacchiera 10x10 con celle  
  4.    Dim offset_row As Integer, offset_col As Integer '=> aggiungi 2 variabili  
  5.      
  6.    'Offset (righe) a partire dalla prima cella = numero di riga della cella attiva corrente - 1  
  7.    offset_row = ActiveCell.Row - 1  
  8.    'Offset (colonne) a partire dalla prima cella = numero di colonna della cella attualmente attiva - 1  
  9.    offset_col = ActiveCell.Column - 1  
  10.      
  11.    For r = 1 To NB_CELLS 'Numero di riga  
  12.      
  13.         For c = 1 To NB_CELLS 'Numero di colonna  
  14.          
  15.             If (r + c) Mod 2 = 0 Then  
  16.             'Cella (numero di riga + offset di riga aggiuntivo, numero di colonna +  
  17.             'spostamento aggiuntivo degli altoparlanti)  
  18.                 Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0) 'Rosso  
  19.             Else  
  20.                 Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0) 'Nero  
  21.             End If  
  22.              
  23.         Next  
  24.    Next  
  25.      
  26. End Sub