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

Статьи по теме:

  • VBA-Урок 8.1. Циклы (Loops)
  • VBA-Урок 9. Процедуры и функции