ВГОРУ

VBA-Урок 8.2. Цикли (Loops)

Щоби попрактикуватись в тому, що ми щойно вивчили, ми покроково розглянемо процес створення макроса для розфарбування шахматної дошки розміром 10х10 (в червоне та чорне), починаючи з поточної активної комірки.


Давайте поглянемо на результат циклу, який ми хочемо отримати:

Далі, першим кроком вправи буде створення порожньої процедури:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Кількість клітинок, які ми хочемо зафарбувати

    '...
   
End Sub

Давайте почнемо з додавання циклу FOR, щоби зафарбувати в чорний колір колонку A (Константа NB_CELLS дорівнює 10).

Маємо отримати наступний результат:

Давайте поглянемо на код:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Кількість комірок, які ми хочемо зафарбувати

    For r = 1 To NB_CELLS 'r => номер рядка
   
        Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Чорний

    Next
   
End Sub

Наступний крок зафарбовує кожну наступну клітинку в червоне, за допомогою інструкції IF (базуючись на тому, чи номер рядка є парний чи непарний ). Див. нижче:

Код для вирішення цієї підзадачі наступний:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 'Кількість комірок, які ми хочемо зафарбувати

    For r = 1 To NB_CELLS 'r => номер рядка
   
       If r Mod 2 = 0 Then 'Mod => є залишком від ділення
           Cells(r, 1).Interior.Color = RGB(200, 0, 0) 'Червоний
       Else
           Cells(r, 1).Interior.Color = RGB(0, 0, 0) 'Чорний
       End If

    Next
   
End Sub

Умова IF r Mod 2 = 0 означає: якщо залишок від ділення r на 2 дорівнює 0...

Лише номер рядка, який є парним, має залишок 0 від ділення на 2:

Як зробити ще один цикл, який би виконував вже написаний нами цикл для 10 колонок. Див. нижче:

Код для вирішення цієї підзадачі наступний:

Sub loops_exercise()

    Const NB_CELLS As Integer = 10 '10x10 шахматна дошка з комірок

    For r = 1 To NB_CELLS 'r => Номер рядка
   
        For c = 1 To NB_CELLS 'c => Номер колонки
       
           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

Тепер другий цикл є вставлений в перший.

Щоби досягнути наступний результат...

Замініть:

If r Mod 2 = 0 Then

На:

If (r + c) Mod 2 = 0 Then

Все, що залишилося зробити, це змінити код так, щоби шахова дошка створювалася починаючи з вибраної комірки (а не A1). Див нижче:

Для цього напишемо наступний код:

Sub loops_exercise()

   Const NB_CELLS As Integer = 10 '10x10 шахматна дошка з комірок
   Dim offset_row As Integer, offset_col As Integer ' => додаємо 2 змінні
   
   'Зміщення (рядків) починаючи з першої комірки = номер рядка поточної активної комірки - 1
   offset_row = ActiveCell.Row - 1
   'Зміщення (колонок) починаючи з першої комірки = номер колонки поточної активної комірки - 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