Ребята, всем привет! 👋
Продолжаем изучать VBA. Сегодня поговорим об обработке ошибок VBA.
Обработка ошибок VBA относится к процессу прогнозирования, обнаружения и устранения ошибок во время выполнения VBA. Процесс обработки ошибок VBA происходит при написании кода до фактического возникновения каких-либо ошибок.
Это первая часть серии уроков посвященных обработке ошибок VBA, а потому, следим за обновлениями на нашем канале, и если не подписаны, то не забываем нажимать кнопочку подписаться в конце статьи.
✨ А прежде, чем мы начнем 📣 напомню, теперь у нас на канале есть удобный рубрикатор 👉 Быстрый поиск решения. Путеводитель по Excel, а все видео 📽 предыдущих уроков доступны и на YouTube.
☑️ Обработка ошибок VBA
Ошибки времени выполнения VBA - это ошибки, возникающие во время выполнения кода. Примеры ошибок во время выполнения включают:
- Ссылка на несуществующую книгу, рабочий лист или другой объект (ошибка времени выполнения 1004)
- Недопустимые данные, например, ссылающиеся на ячейку Excel, содержащую ошибку (несоответствие типов – ошибка времени выполнения 13)
- Попытка деления на ноль
☑️ Сообщение об ошибке
Большая часть обработки ошибок VBA выполняется с помощью инструкции On Error . Инструкция On Error сообщает VBA, что делать, если она обнаруживает ошибку.
Есть три инструкции об ошибках:
- При ошибке GoTo 0
- При возобновлении работы с ошибкой следующий
- В строке перехода к ошибке
▶️ При ошибке GoTo 0
При ошибке GoTo 0 является настройкой VBA по умолчанию. Вы можете восстановить это значение по умолчанию, добавив следующую строку кода:
🔘 On Error GoTo 0
Когда возникает ошибка с ошибкой On Error GoTo 0, VBA прекратит выполнение кода и отобразит стандартное окно сообщения об ошибке:
Часто вы добавляете при ошибке GoTo 0 после добавления при ошибке возобновить следующую обработку ошибок (следующий раздел):
▶️ При возобновлении работы с ошибкой следующий
При возобновлении работы с ошибками Next сообщает VBA пропустить все строки кода, содержащие ошибки, и перейти к следующей строке.
🔘 On Error Resume Next
⚠️ ВАЖНО!
При ошибке Resume Next не исправляет ошибку или иным образом не устраняет ее. Он просто сообщает VBA действовать так, как если бы строка кода, содержащая ошибку, не существовала. Неправильное использование On Error Resume Next может привести к непредвиденным последствиям.
Отличное время для использования при возобновлении работы с ошибками - при работе с объектами, которые могут существовать, а могут и не существовать.
Например, вы хотите написать некоторый код, который удалит фигуру, но если вы запустите код, когда фигура уже удалена, VBA выдаст ошибку.
🔔 Вместо этого вы можете использовать On Error Resume Рядом с указанием VBA удалить фигуру, если она существует.
🔔 Обратите внимание, что мы добавили при ошибке GoTo 0 после строки кода, содержащей потенциальную ошибку. Это сбрасывает обработку ошибок.
Далее, рассмотрим, как проверить, произошла ли ошибка, используя Err.Number, предоставляя вам более продвинутые варианты обработки ошибок.
🔷 Ошибки Err.Number, Err.Clear и перехват ошибок
Вместо того, чтобы просто пропускать строку, содержащую ошибку, мы можем перехватить ошибку, используя On Error Resume Next и Err.Number .
Err.Number возвращает номер ошибки, соответствующий типу обнаруженной ошибки. Если ошибки нет, Err.Number = 0.
Например, ниже представленный код вернет “11”, поскольку возникающая ошибка является ошибкой времени выполнения "11".
Пример кода:
Результат:
🔷 Обработка ошибок с помощью Err.Number
Суть Err.Number заключается в способности обнаруживать, произошла ли ошибка (Err.Number <> 0).
В приведенном ниже примере мы создали функцию, которая проверяет, существует ли лист, используя Err.Number:
🔔 Мы добавили в конец GoTo -1 при ошибке, который сбрасывает Err.Number на 0.
🔔 С помощью On Error Resume Next и Err.Number вы можете воспроизвести функциональность “Try” и “Catch” других языков программирования.
▶️ В строке перехода к ошибке
При ошибке строка GoTo сообщает VBA “перейти” к помеченной строке кода при обнаружении ошибки. Вы объявляете оператор Go To следующим образом (где errHandler - это метка строки, к которой нужно перейти):
🔘 On Error GoTo errHandler
и создайте метку строки, подобную этой:
🔘 errHandler:
Прим.: это та же метка, которую вы бы использовали с обычным оператором VBA GoTo
Дале, продемонстрируем использование строки перехода к ошибке для выхода из процедуры
🔷 При ошибке Exit Sub
Вы можете использовать строку перехода к ошибке для выхода из вложенного файла при возникновении ошибки.
Вы можете сделать это, поместив метку строки обработчика ошибок в конце вашей процедуры:
или с помощью вспомогательной команды Exit:
🔷 Ошибка.Очистить, при ошибке GoTo -1 и сбросить err.Number
После обработки ошибки обычно следует удалить ошибку, чтобы предотвратить будущие проблемы с обработкой ошибок.
После возникновения ошибки для сброса Err.Number на 0 можно использовать как Err.Clear, так и On Error GoTo -1.
Но есть одно очень важное отличие: Err.Clear не сбрасывает саму фактическую ошибку, а только сбрасывает Err.Number.
Что это значит? Используя Err.Clear, вы не сможете изменить настройку обработки ошибок. Чтобы увидеть разницу, протестируйте этот код и замените при ошибке GoTo -1 на Err.Clear:
⚠️ Как правило, рекомендуется всегда использовать при ошибке GoTo -1, если только у вас нет веских причин использовать Err.Clear вместо этого.
🔷 VBA при ошибке MsgBox
Вы также можете отобразить окно сообщения об ошибке. В этом примере будут отображаться разные окна сообщений в зависимости от того, где возникает ошибка:
☑️ VBA IsError
Другой способ обработки ошибок - проверить их с помощью функции ISERROR VBA.
Функция ISERROR проверяет выражение на наличие ошибок, возвращая значение TRUE (ИСТИНА) или FALSE (ЛОЖЬ) в случае возникновения ошибки.
☑️ Если ошибка VBA
Вы также можете обрабатывать ошибки в VBA с помощью функции Excel IFERROR.
Доступ к функции IFERROR необходимо получить с помощью класса WorksheetFunction:
🔔 Для получения дополнительной информации об обработке ошибок VBA рекомендуем:
- Ошибка 1004 VBA - ошибка, определяемая приложением или объектом
- Несоответствие типа VBA (ошибка времени выполнения 13). Часть 1
- Несоответствие типа VBA (ошибка времени выполнения 13). Часть 2. Исправляем ошибки
- Как использовать VBA при возобновлении работы с ошибкой Next и при ошибке Goto 0
- Ошибка компиляции VBA
А на этом сегодня все. 👏 Продолжение следует...
Подписывайтесь на канал, чтобы не пропустить новые уроки и полезные фишки Excel. Следите за нашими новостями и вы узнаете больше о VBA и Excel в частности.
📝 Нам очень важна Ваша обратная связь. Отзыв по уроку и любые вопросы пишите в комментариях.
💝 А если у Вас пока нет вопросов, но вы дочитали данную статью до конца оставьте в комментариях просто смайлик 😉 (автору будет приятно)
И конечно же, за лайк 👍 и репост 🔁 данного поста благодарочка 💖 и респект 🤝 каждому!