TOP

VBA-Lekcja 8.2. Pętle (Loops)

Aby przećwiczyć to, czego się właśnie nauczyliśmy, przeprowadzimy proces tworzenia makra do malowania szachownicy 10x10 (czerwonej i czarnej), zaczynając od aktualnie aktywnej komórki.


Spójrzmy na wynik pętli, którą chcemy uzyskać:

Następnie pierwszym krokiem ćwiczenia będzie utworzenie pustej procedury:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Liczba komórek, które chcemy pomalować

    '...
   
End Sub

Zacznijmy od dodania pętli FOR, aby zaczernić kolumnę A (stała NB_CELLS wynosi 10).

Powinniśmy uzyskać następujący wynik:

Rzućmy okiem na kod:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Liczba komórek, które chcemy pomalować

    For r = 1 To NB_CELLS 'r => numer wiersza
   
        Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Czarny

    Next
   
End Sub

Następny krok koloruje każdą kolejną komórkę na czerwono, używając instrukcji IF (w zależności od tego, czy numer wiersza jest parzysty czy nieparzysty). Widzieć niżej:

Kod rozwiązania tego podzadania jest następujący:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Liczba komórek, które chcemy pomalować

    For r = 1 To NB_CELLS 'r => numer wiersza
   
       If r Mod 2 = 0 Then 'Mod => to reszta z dzielenia
           Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'Czerwony
       Else
           Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Czarny
       End If

    Next
   
End Sub

Warunek IF r Mod 2 = 0 oznacza: jeśli reszta z dzielenia r przez 2 wynosi 0...

Tylko parzysty numer wiersza przy dzieleniu przez 2 daje resztę 0:

Jak zrobić kolejną pętlę, która wykona pętlę, którą napisaliśmy już dla 10 kolumn. Widzieć niżej:

Kod rozwiązania tego podzadania jest następujący:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Szachownica 10x10 z komórkami

    For r = 1 To NB_CELLS 'r => Numer wiersza
   
        For c = 1 To NB_CELLS 'c => Numer kolumny
       
           If r Mod 2 = 0 Then
               Cells(r, c).Interior.Color = RGB(200, 0, 0) 'Czerwony
           Else
               Cells(r, c).Interior.Color = RGB(0, 0, 0) 'Czarny
           End If
           
        Next
    Next
   
End Sub

Teraz drugi cykl jest wstawiany do pierwszego.

Aby osiągnąć następujący wynik...

Zastępować:

If r Mod 2 = 0 Then

NA:

If (r + c) Mod 2 = 0 Then

Pozostało jeszcze tylko zmienić kod tak, aby szachownica tworzona była zaczynając od wybranej komórki (nie A1). Zobacz poniżej:

W tym celu napiszemy następujący kod:

Sub loops_exercise()

   Const NB_CELLS As Integer = 10 'Szachownica 10x10 z komórkami
   Dim offset_row As Integer, offset_col As Integer '=> dodaj 2 zmienne
   
   'Przesunięcie (wiersze) począwszy od pierwszej komórki = numer wiersza aktualnie aktywnej komórki - 1
   offset_row = ActiveCell.Row - 1
   'Przesunięcie (kolumny) począwszy od pierwszej komórki = numer kolumny aktualnie aktywnej komórki - 1
   offset_col = ActiveCell.Column - 1
   
   For r = 1 To NB_CELLS 'Numer kolejki
   
        For c = 1 To NB_CELLS 'Numer kolumny
       
            If (r + c) Mod 2 = 0 Then
            'Komórka (numer wiersza + dodatkowe przesunięcie wiersza, numer kolumny +
            'dodatkowe przemieszczenie głośników)
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(200, 0, 0) 'Czerwony
            Else
                Cells(r + offset_row, c + offset_col).Interior.Color = RGB(0, 0, 0) 'Czarny
            End If
           
        Next
   Next
   
End Sub