VBA при ошибке - Рекомендации по обработке ошибок

Памятка по ошибкам VBA

Ошибки

ОписаниеКод VBAПри ошибке - код остановки и ошибка отображенияПри ошибке Перейти к 0При ошибке - пропустить ошибку и продолжить работуПри ошибке Возобновить ДалееПри ошибке - перейдите к строке кода [Ярлык]При ошибке Перейти к [ярлык]Сбрасывает (сбрасывает) ошибкуПри ошибке GoTo -1Показать номер ошибкиMsgBox Err.NumberПоказать описание ошибкиMsgBox Ошибка ОписаниеФункция для генерации собственной ошибкиErr.Raise

См. Другие «Шпаргалки» по VBA и бесплатные загрузки в формате PDF.

Обработка ошибок VBA

Обработка ошибок VBA относится к процессу прогнозирования, обнаружения и устранения ошибок времени выполнения VBA. Процесс обработки ошибок VBA происходит при написании кода до того, как на самом деле возникнут какие-либо ошибки.

Ошибки времени выполнения VBA - это ошибки, возникающие во время выполнения кода. Примеры ошибок времени выполнения включают:

  • Ссылка на несуществующую книгу, лист или другой объект
  • Неверные данные напр. ссылка на ячейку Excel, содержащую ошибку
  • Попытка разделить на ноль

Заявление об ошибке VBA

Большая часть обработки ошибок VBA выполняется с помощью О заявлении об ошибке. Оператор On Error сообщает VBA, что делать в случае возникновения ошибки. Есть три О сообщениях об ошибках:

  • При ошибке GoTo 0
  • При ошибке Возобновить Далее
  • При ошибке GoTo Линия

При ошибке GoTo 0

При ошибке GoTo 0 является настройкой VBA по умолчанию. Вы можете восстановить этот параметр по умолчанию, добавив следующую строку кода:

1 При ошибке GoTo 0

Когда возникает ошибка с При ошибке GoTo 0, VBA прекратит выполнение кода и отобразит стандартное окно сообщения об ошибке.

Часто вы добавляете При ошибке GoTo 0 после добавления При ошибке Возобновить Далее обработка ошибок (следующий раздел):

123456789 Sub ErrorGoTo0 ()При ошибке Возобновить ДалееActiveSheet.Shapes ("Start_Button"). УдалитьПри ошибке GoTo 0'Запустить больше кодаКонец подписки

При ошибке Возобновить Далее

При ошибке Возобновить Далее сообщает VBA пропустить любые строки кода, содержащие ошибки, и перейти к следующей строке.

1 При ошибке Возобновить Далее

Примечание: При ошибке Возобновить Далее не исправляет ошибку и не устраняет ее иным образом. Он просто сообщает VBA действовать, как если бы строка кода, содержащая ошибку, не существовала. Неправильное использование При ошибке Возобновить Далее может привести к непредвиденным последствиям.

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

123 При ошибке Возобновить ДалееActiveSheet.Shapes ("Start_Button"). УдалитьПри ошибке GoTo 0

Обратите внимание, что мы добавили При ошибке GoTo 0 после строки кода, содержащей потенциальную ошибку. Это сбрасывает обработку ошибок.

В следующем разделе мы покажем вам, как проверить, возникла ли ошибка, используя Err.Number, предоставляя вам более расширенные возможности обработки ошибок…

Err.Number, Err.Clear и перехват ошибок

Вместо того, чтобы просто пропустить строку, содержащую ошибку, мы можем отловить ошибку, используя При ошибке Возобновить Далее а также Err.Number.

Err.Number возвращает номер ошибки, соответствующий типу обнаруженной ошибки. Если ошибки нет, Err.Number = 0.

Например, эта процедура вернет «11», потому что возникает ошибка Ошибка времени выполнения ’11’.

1234567 Sub ErrorNumber_ex ()При ошибке Возобновить ДалееActiveCell.Value = 2/0MsgBox Err.NumberКонец подписки

Обработка ошибок с помощью Err.Number

Истинная сила Err.Number заключается в способности определить, произошла ли ошибка (Err.Number 0). В приведенном ниже примере мы создали функцию, которая будет проверять, существует ли лист, с помощью Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist («тест»)Конец подпискиФункция DoesWSExist (wsName As String) As BooleanDim ws как рабочий листПри ошибке Возобновить ДалееУстановить ws = Sheets (wsName)'Если ошибка WS не существуетЕсли Err.Number 0, тоDoesWSExist = FalseЕщеDoesWSExist = TrueКонец, еслиПри ошибке GoTo -1Конечная функция

Примечание. Мы добавили При ошибке GoTo -1 до конца, который сбрасывает Err.Number в 0 (см. два раздела ниже).

С участием При ошибке Возобновить Далее а также Err.Number, вы можете воспроизвести "Попробуй поймать" функциональность других языков программирования.

При ошибке GoTo Линия

При ошибке GoTo Линия сообщает VBA «перейти» к помеченной строке кода при обнаружении ошибки. Вы объявляете оператор Go To следующим образом (где errHandler - это метка строки, к которой нужно перейти):

1 При ошибке GoTo errHandler

и создайте метку строки следующим образом:

1 errHandler:

Примечание. Это тот же ярлык, который вы использовали бы с обычным заявлением VBA GoTo.

Ниже мы продемонстрируем использование При ошибке GoTo Линия Выйти из процедуры.

При ошибке Выход из подпрограммы

Вы можете использовать On Error GoTo Line для выхода из подпрограммы при возникновении ошибки.

Вы можете сделать это, поместив метку строки обработчика ошибок в конце вашей процедуры:

12345678 Sub ErrGoToEnd ()При ошибке GoTo endProc'Некоторый кодendProc:Конец подписки

или используя команду Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()При ошибке GoTo endProc'Некоторый кодПерейти Пропустить ВыходendProc:Выйти из подводной лодкиskipExit:Еще немного кодаКонец подписки

Err.Clear, при ошибке GoTo -1 и сброс Err.Number

После обработки ошибки обычно следует удалить ее, чтобы предотвратить проблемы с обработкой ошибок в будущем.

После возникновения ошибки, оба Err.Clear а также При ошибке GoTo -1 можно использовать для сброса Err.Number до 0. Но есть одно очень важное отличие: Err.Clear не сбрасывает саму ошибку, а только сбрасывает Err.Number.

Что это обозначает? С использованиемErr.Clear, вы не сможете изменить настройку обработки ошибок. Чтобы увидеть разницу, проверьте этот код и замените При ошибке GoTo -1 с участием Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()При ошибке GoTo errHandler:"Ошибка, определяемая приложением"Ошибка (13)Выйти из подводной лодкиerrHandler:'Очистить ошибкуПри ошибке GoTo -1При ошибке GoTo errHandler2:Ошибка "Несоответствие типа"Ошибка (1034)Выйти из подводной лодкиerrHandler2:Отладка.Ошибка печати ОписаниеКонец подписки

Обычно я рекомендую всегда использовать При ошибке GoTo -1, если у вас нет веской причины использовать Err.Clear вместо.

VBA при ошибке MsgBox

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

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg как строкаПри ошибке GoTo errHandler'Этап 1errMsg = "Произошла ошибка на этапе копирования и вставки."'Err.Raise (11)'Этап 2errMsg = "Произошла ошибка на этапе проверки данных."Err.Raise (11)'Этап 3errMsg = "Произошла ошибка на этапе построения прибылей и убытков и копирования."Err.Raise (11)'Этап 4errMsg = "Произошла ошибка при попытке зарегистрировать импорт на странице настройки"Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Конец подписки

Здесь вы должны заменить Err.Raise (11) своим реальным кодом.

VBA IsError

Другой способ обработки ошибок - проверить их с помощью функции VBA IsError. Функция IsError проверяет выражение на наличие ошибок, возвращая ИСТИНА или ЛОЖЬ в случае возникновения ошибки.

123 Sub IsErrorEx ()MsgBox IsError (Диапазон ("a7"). Значение)Конец подписки

Если ошибка VBA

Вы также можете обрабатывать ошибки в VBA с помощью функции Excel IfError. Доступ к функции IfError должен осуществляться с помощью Класс WorksheetFunction:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Range ("a10"). Value, 0)MsgBox nКонец подписки

Это выведет значение диапазона A10, если значение является ошибкой, вместо этого будет выведено 0.

Типы ошибок VBA

Ошибки времени выполнения

Как указано выше:

Ошибки времени выполнения VBA - это ошибки, возникающие во время выполнения кода. Примеры ошибок времени выполнения включают:

  • Ссылка на несуществующую книгу, лист или другой объект
  • Неверные данные напр. ссылка на ячейку Excel, содержащую ошибку
  • Попытка разделить на ноль

Вы можете «обработать ошибки» ошибок времени выполнения, используя описанные выше методы.

Ошибки синтаксиса

Ошибки синтаксиса VBA это ошибки при написании кода. Примеры синтаксических ошибок:

  • Неправильное написание
  • Отсутствие или неправильная пунктуация

Редактор VBA выделяет множество синтаксических ошибок красным цветом:

В редакторе VBA также есть опция «Автоматическая проверка синтаксиса»:

Когда этот флажок установлен, редактор VBA сгенерирует окно сообщения, предупреждающее вас об ошибках синтаксиса после ввода строки кода:

Лично меня это очень раздражает, и я отключил эту функцию.

Ошибки компиляции

Прежде чем пытаться запустить процедуру, VBA «скомпилирует» процедуру. Компиляция преобразует программу из исходного кода (который вы видите) в исполняемую форму (вы не видите).

Ошибки компиляции VBA - это ошибки, препятствующие компиляции кода.

Хорошим примером ошибки компиляции является отсутствие объявления переменной:

Другие примеры включают:

  • Для без Следующий
  • Выбирать без Конец Выбрать
  • Если без Конец, если
  • Вызов процедура этого не существует

Ошибки синтаксиса (предыдущий раздел) - это подмножество ошибок компиляции.

Отладка> Компиляция

Ошибки компиляции появятся при попытке запустить процедуру. Но в идеале вы должны выявить ошибки компиляции до попытки запустить процедуру.

Сделать это можно, скомпилировав проект заранее. Для этого перейдите в Отладка> Скомпилировать проект VBA.

Компилятор «перейдет» к первой ошибке. Как только вы исправите эту ошибку, снова скомпилируйте проект. Повторяйте, пока все ошибки не будут исправлены.

Вы можете сказать, что все ошибки исправлены, потому что Скомпилировать проект VBA будет неактивным:

Ошибка переполнения

В Ошибка переполнения VBA происходит, когда вы пытаетесь поместить значение в слишком большую переменную. Например, Целочисленные переменные может содержать только значения от -32 768 до 32 768. Если вы введете большее значение, вы получите ошибку переполнения:

Вместо этого вы должны использовать Длинная переменная для хранения большего числа.

Другие термины ошибок VBA

Ошибка перехвата VBA

В отличие от других языков программирования, в VBA нет Заявление о вылове. Однако вы можете воспроизвести оператор Catch, используя При ошибке Возобновить Далее а также Если Err.Number 0, то. Это описано выше в разделе Обработка ошибок с помощью Err.Number.

Ошибка игнорирования VBA

Чтобы игнорировать ошибки в VBA, просто используйте При ошибке Возобновить Далее утверждение:

1 При ошибке Возобновить Далее

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

VBA Throw Error / Err.Raise

Чтобы устранить ошибку в VBA, вы используете Err.Raise метод.

Эта строка кода вызовет ошибку времени выполнения ’13’: Несоответствие типов:

1 Err.Raise (13)

Перехват ошибок VBA

Перехват ошибок VBA это просто еще один термин для обработки ошибок VBA.

Сообщение об ошибке VBA

А Сообщение об ошибке VBA выглядит так:

Когда вы нажмете «Отладка», вы увидите строку кода, которая выдает ошибку:

Обработка ошибок VBA в цикле

Лучший способ обработки ошибок в цикле - использовать При ошибке Возобновить Далее вместе с Err.Number чтобы определить, произошла ли ошибка (не забудьте использовать Err.Clear чтобы сбрасывать ошибку после каждого появления).

Пример ниже разделит два числа (столбец A на столбец B) и выведет результат в столбец C. В случае ошибки результатом будет 0.

12345678910111213141516 Подтест ()Тусклая ячейка как диапазонПри ошибке Возобновить ДалееДля каждой ячейки в диапазоне ("a1: a10")'Установить значение ячейкиcell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Если Cell.Value - Error, то по умолчанию 0Если Err.Number 0, тоcell.Offset (0, 2) .Value = 0Err.ClearКонец, еслиСледующийКонец подписки

Обработка ошибок VBA в Access

Все приведенные выше примеры работают в Access VBA точно так же, как и в Excel VBA.

123456789101112131415161718 Функция DelRecord (от формы как)'эта функция используется для удаления записи в таблице из формыПри ошибке GoTo заканчиваетсяС frmЕсли .NewRecord Тогда.ОтменитьФункция выходаКонец, еслиКонец сС помощью frm.RecordsetClone.Bookmark = frm.Bookmark.Удалитьfrm.RequeryКонец сФункция выходаокончание:КонецКонечная функция

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave