Excel Analysis Blog
BETA
Придется немного поработать


Макросы. Урок седьмой

Циклы

Надеюсь что все предыдущие задания были сделаны, и больше трудностей у вас не вызывают. Перейдем к тому, чтобы далее улучшать наши программы. Прошу вас, если не смогли что-то сделать из самостоятельной работы, то к этому упражнению не приступать. Тут будем использовать уже все изученное.

For Next

Первый цикл, который мы с вами рассмотрим. В нем вам необходимо указывать две переменные. Начало и конец цикла. Любой цикл — это по сути шаги, повторяющиеся действия. В примерах, я сейчас буду использовать данные с Листа1.

Напротив каждого, мне нужно проставить слово «Collector». Конечно мы можем сделать это так

Sub test()
    Dim sht1 As Worksheet
    
    Set sht1 = ThisWorkbook.Worksheets("Лист1")
    
    sht1.Cells(2, 2) = "Collector"
    sht1.Cells(3, 2) = "Collector"
    sht1.Cells(4, 2) = "Collector"
    sht1.Cells(5, 2) = "Collector"
    sht1.Cells(6, 2) = "Collector"
End Sub

Но если у нас столбец из 200 тыс. строк? В данном случае, экономнее будет цикл.

Sub test()
    Dim sht1 As Worksheet
    Dim row As Long
    
    Set sht1 = ThisWorkbook.Worksheets("Лист1")
    
    For row = 2 To 6
        sht1.Cells(row, 2) = "Collector"
    Next row
    
End Sub

Разберем этот код. Во-первых, я завел переменную row. Она у меня будет использовать как счетчик строк. Теперь сам цикл.

For row = 2 To 6 ‘здесь я указываю, что переменная row, будет менять свое значение, в периоде от 1 до 6.

sht1.Cells(row, 2) = "Collector" ‘данный код должен быть всем понятен. Как видите, для номера строк, я использую переменную row, которая будет менять свое значение каждый шаг цикла.

Next row ’эта команда перейти к следующему шагу цикла.

Выполните этот код по шагам. Чтобы было понятно, как он работает. Как видите, это делается специально, чтобы повторять один и тот же код.

В подобный цикл можно ставить еще одну переменную. Она необязательна. В первом случае, я говорю, что переменная row должна менять свое значение так:

2

3

4

5

6

Но я могу также указать шаг. В этом случае можем писать так.

Sub test1()
    Dim sht1 As Worksheet
    Dim row As Long
    
    Set sht1 = ThisWorkbook.Worksheets("Лист1")
    
    For row = 2 To 6 Step 2
        sht1.Cells(row, 2) = "Collector"
    Next row
    
End Sub

For row = 2 To 6 Step 2 'в данном случае я устанавливаю, что шаг цикла должен быть равен двум. Это означает, что он будет в работе перескакивать через одно значение. Т.е. переменная row будет менять значения так:

2

4

6

Соответственно шаг можно сделать любой.

Цикл можно сочетать как с другими циклами, так и с другими операциями. Например, я немного изменю вид таблицы, будет такое

Здесь мне нужно проставить слово Collector тем, кто работает. Легче всего мне будет это сделать, через добавление IF

Sub test2()
    Dim sht1 As Worksheet
    Dim row As Long
    
    Set sht1 = ThisWorkbook.Worksheets("Лист1")
    
    For row = 2 To 6  ‘запускаем цикл
        If sht1.Cells(row, 3) = "Да" Then  ‘проверяем, что сотрудник работает
            sht1.Cells(row, 2) = "Collector"  'проставляем ему значение
        End If
    Next row
    
End Sub

А также можно один цикл вложить в другой. И еще позволяется в цикле диапазон указывать не конкретными цифрами, а переменными. Перейдем на Лист2. Там сделаем таблицу в таком виде:

Наша задача в-третьем столбце, напротив фамилии проставить слов Collector. А в четвертом столбце, заполнять во все-пустых местах место работы, которое числится у них во-втором столбце. Т.е. должно в итоге получиться так:

Пишем код:

Sub test3()
    Dim sht1 As Worksheet
    Dim row As Long, rrooww As Long
    Dim mesto_raboty As String
    
    Set sht1 = ThisWorkbook.Worksheets("Лист2")
    
    For row = 2 To 16 Step 3
        sht1.Cells(row, 3) = "Collector"
        mesto_raboty = sht1.Cells(row, 2)
        
        For rrooww = row To row+2
            sht1.Cells(rrooww, 4) = mesto_raboty
        Next rrooww
        
    Next row
End Sub

В данном коде я завел еще одну переменную, под именем «rrooww», которая также будет служить мне счетчиком строк. А также переменную «mesto_raboty».

Во-первых я запускаю цикл: For row = 2 To 16 Step 3 ‘причем я говорю, что нужно перешагивать через три строчки. Затем я записываю, куда мне надо, слово Collector. Также, через тестовую переменную, я запоминаю место работы.

Потом, внутри этого цикла, я запускаю второй цикл. For rrooww = row To row+2 ‘здесь мы указываем, что переменная rrooww будет менять в диапазоне от значения переменно row, до значения переменной Row+2.

Понимаю, что написано довольно сложно. Для того, чтобы лучше понять, выполняйте код пошагово. На каждом шаге наводите мышку на переменные, смотрите как меняются их значения. Если у вас есть второй монитор, то выведете лист Excel и лист VBA-редактора на разные. Выполняйте код пошагово, и смотрите как идет заполнение.

Если второго монитора нет, то руками выведите на один мотор оба окна, сузив их. Тут очень рекомендую наблюдать как пошагово заполняется документ.

По окончанию можете приступать к самостоятельной работе.

Скачать примеры урока

Скачать самостоятельное задание