FormulaCamp
Пройдено
13. VBA и макросы · Основы языка · 25 мин

3. VBA: циклы по диапазону

Урок 3 из 7
Задание 1 из 3
  1. В D2:D7 запишите то же, что макрос: «Просрочено», если срок оплаты раньше даты в F1, иначе «В срок».

Теория урока

Три цикла, которыми закрывается большинство задач:

  • For r = 2 To lastRow … Next r — по номерам строк, когда нужно обращаться к разным столбцам одной строки через Cells(r, n). Step 2 — шаг 2, Step -1 — обратный ход;
  • For Each cell In Range("B2:B100") … Next cell — по каждой ячейке диапазона;
  • Do While условие … Loop — пока условие верно, например пока ячейка не пустая. Не забудьте увеличить счётчик, иначе цикл будет бесконечным.

Последняя заполненная строка: lastRow = Cells(Rows.Count, 1).End(xlUp).Row — как нажать Ctrl+↑ из самого низа столбца A. Exit For досрочно выходит из цикла. Если в цикле удаляются строки, идите снизу вверх (Step -1), иначе строки сдвинутся и часть пропустится.

Sub СтатусыСчетов()
    Dim r As Long, lastRow As Long, cnt As Long
    Dim total As Double
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For r = 2 To lastRow
        If Cells(r, 3).Value < Range("F1").Value Then
            Cells(r, 4).Value = "Просрочено"
            cnt = cnt + 1
            total = total + Cells(r, 2).Value
        Else
            Cells(r, 4).Value = "В срок"
        End If
    Next r
    Range("F2").Value = cnt
    Range("F3").Value = total
End Sub

Счёт просрочен, если срок оплаты (столбец C) раньше даты отчёта в F1. Воспроизведите результат макроса формулами. Хорошая привычка: если задачу решает одна формула, макрос не нужен. Макрос полезен, когда действие повторяется каждый день на новых файлах.

Скорость: чтение каждой ячейки по отдельности медленное. Для тысяч строк загрузите диапазон в массив (arr = Range("A2:C5000").Value), обработайте его в памяти и запишите обратно одной строкой; на время работы выключайте перерисовку: Application.ScreenUpdating = False.

Тренажёр не выполняет макросы и скрипты. Код из урока запускайте в настольном Excel (VBA) или в Excel для Интернета (Office Scripts). Здесь вы учитесь читать код и проверяете себя формулами и тестом.

Проверьте себя

1. Сколько раз выполнится тело цикла: For i = 1 To 10 Step 3 … Next i ?
2. Какой ячейке соответствует Cells(3, 2)?
3. Макрос удаляет пустые строки циклом For r = 2 To lastRow с Rows(r).Delete, но некоторые пустые строки остаются. Как исправить?
4. Код: r = 2: Do While Cells(r, 1).Value <> "": Cells(r, 2).Value = 1: Loop. Что не так?
5. Что вернёт Cells(Rows.Count, 1).End(xlUp).Row, если в столбце A заполнены A1:A57?
6. На какую ячейку ссылается Range("A1").Offset(1, 2)?
7. Цикл по 50 000 строк через Cells работает минуту. Что ускорит его сильнее всего?

Практика — в Pro

Живая таблица, проверка заданий и файлы .xlsx во всех 170 уроках. Прогресс хранится в этом браузере; синхронизация между устройствами появится позже.