TOP

VBA-Lecția 8.2. Bucle (Loops)

Pentru a exersa ceea ce tocmai am învățat, vom parcurge procesul de creare a unei macrocomenzi pentru a picta o tablă de șah de 10x10 (roșu și negru) pornind de la celula activă în prezent.


Să ne uităm la ieșirea buclei pe care vrem să o obținem:

În continuare, primul pas al exercițiului va fi crearea unei proceduri goale:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Numărul de celule pe care vrem să le pictăm

    '...
   
End Sub

Să începem prin a adăuga o buclă FOR pentru a înnegri coloana A (constanta NB_CELLS este 10).

Ar trebui să obținem următorul rezultat:

Să aruncăm o privire la cod:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Numărul de celule pe care vrem să le pictăm

    For r = 1 To NB_CELLS 'r => numărul rândului
   
        Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Negru

    Next
   
End Sub

Următorul pas colorează în roșu fiecare celulă ulterioară, folosind instrucțiunea IF (în funcție de faptul că numărul rândului este par sau impar). Vedea inferior:

Codul pentru rezolvarea acestei sarcini secundare este următorul:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Numărul de celule pe care vrem să le pictăm

    For r = 1 To NB_CELLS 'r => numărul rândului
   
       If r Mod 2 = 0 Then 'Mod => este restul din diviziune
           Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'roșu
       Else
           Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Negru
       End If

    Next
   
End Sub

Condiția IF r Mod 2 = 0 înseamnă: dacă restul împărțirii lui r la 2 este 0...

Numai numărul rândului care este par are restul 0 atunci când este împărțit la 2:

Cum să faci o altă buclă care să execute bucla pe care am scris-o deja pentru 10 coloane. Vedea inferior:

Codul pentru rezolvarea acestei sarcini secundare este următorul:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Tablă de șah 10x10 cu celule

    For r = 1 To NB_CELLS 'r => Numărul rândului
   
        For c = 1 To NB_CELLS 'c => Numărul coloanei
       
           If r Mod 2 = 0 Then
               Cells(r, c).Interior.Color = RGB(200, 0, 0) 'roșu
           Else
               Cells(r, c).Interior.Color = RGB(0, 0, 0) 'Negru
           End If
           
        Next
    Next
   
End Sub

Acum al doilea ciclu este introdus în primul.

Pentru a obține următorul rezultat...

A inlocui:

If r Mod 2 = 0 Then

Pe:

If (r + c) Mod 2 = 0 Then

Tot ce rămâne de făcut este să schimbi codul, astfel încât tablele de șah să fie create pornind de la celula selectată (nu A1). Vezi mai jos:

Pentru aceasta, vom scrie următorul cod:

Sub loops_exercise()

   Const NB_CELLS As Integer = 10 'Tablă de șah 10x10 cu celule
   Dim offset_row As Integer, offset_col As Integer '=> adăugați 2 variabile
   
   'Offset (rânduri) începând de la prima celulă = numărul de rând al celulei active curente - 1
   offset_row = ActiveCell.Row - 1
   'Offset (coloane) începând de la prima celulă = numărul coloanei celulei active curente - 1
   offset_col = ActiveCell.Column - 1
   
   For r = 1 To NB_CELLS 'Numărul de linie
   
        For c = 1 To NB_CELLS 'Numărul coloanei
       
            If (r + c) Mod 2 = 0 Then
            'Celulă (număr rând + offset suplimentar rând, numărul coloanei +
            'deplasarea suplimentară a coloanelor)
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0) 'roșu
            Else
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0) 'Negru
            End If
           
        Next
   Next
   
End Sub