FormulaCamp
Пройдено
13. VBA и макросы · Надёжный код · 25 мин

6. VBA: обработка ошибок и отладка

Урок 6 из 7
Задание 1 из 2
  1. В D2:D7 посчитайте средний чек (выручка / чеков), а там, где деление невозможно, запишите «нет данных» — как макрос.

Теория урока

Ошибки бывают трёх видов: синтаксические (редактор подсветит красным), ошибки выполнения (деление на ноль, нет листа с таким именем, текст вместо числа) и логические (код работает, но считает не то). Против второго вида — обработчик:

Sub Импорт()
    On Error GoTo Ошибка
    Worksheets("Данные").Range("A1").Value = "Старт"
    ' … основная работа …
    Exit Sub                       ' без этой строки обработчик выполнится всегда
Ошибка:
    MsgBox "Ошибка " & Err.Number & ": " & Err.Description
End Sub
  • On Error GoTo метка — при ошибке перейти к метке; Err.Number и Err.Description — код и текст ошибки;
  • On Error Resume Next — пропускать ошибочную строку. Удобно для одной проверки, опасно для всего макроса: ошибки станут невидимыми;
  • On Error GoTo 0 — вернуть обычное поведение; Err.Clear — сбросить код ошибки;
  • частые коды: 9 — нет такого элемента (листа, книги), 11 — деление на ноль, 13 — несовпадение типов, 91 — объект не задан (забыли Set).

Отладка: F8 — выполнить одну строку; F9 — точка останова; Debug.Print x печатает значение в окно Immediate (Ctrl+G); окно Locals показывает все переменные; строка Stop останавливает макрос в нужном месте.

Макрос ниже считает средний чек и не падает на плохих данных. Воспроизведите его результат формулой с ЕСЛИОШИБКА: это то же «попробуй посчитать, при ошибке запиши запасное значение».

Sub СреднийЧек()
    Dim r As Long
    On Error Resume Next
    For r = 2 To 7
        Err.Clear
        Cells(r, 4).Value = Cells(r, 2).Value / Cells(r, 3).Value
        If Err.Number <> 0 Then Cells(r, 4).Value = "нет данных"
    Next r
    On Error GoTo 0
    Range("G1").Value = WorksheetFunction.CountIf(Range("D2:D7"), "нет данных")
End Sub

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

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

1. В процедуре есть On Error GoTo Ошибка и метка Ошибка: с MsgBox в конце, но нет Exit Sub перед меткой. Что увидит пользователь, если ошибок не было?
2. Куда выводит текст Debug.Print?
3. Какая клавиша выполняет макрос по одной строке?
4. Код: Worksheets("Отчёт 2025").Activate, а такого листа нет. Какая ошибка?
5. Макрос начинается с On Error Resume Next и «работает без ошибок», но итог неверный. В чём главная опасность такой строки?
6. Как остановить макрос на нужной строке, чтобы посмотреть переменные в окне Locals?

Практика — в Pro

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