Типы ошибок vba: отладка и решение

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

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

 Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub

Но если активная ячейка имеет значение, отличное от числа, вы получите ошибку времени выполнения, как показано ниже.

ошибка выполнения

Параметры ошибок в VBA (перехват ошибок)

В опции VBA вы можете настроить настройку для обработки ошибок до того, как начнете писать код. Чтобы открыть настройки VBA, выберите «Инструменты» ➤ «Параметры» ➤ «Основные» ➤ «Перехват ошибок». Здесь у вас есть три варианта, которые вы можете использовать.

  • Остановить при всех ошибках : если вы включили эту опцию, VBA будет останавливать код для всех типов ошибок, даже если вы использовали все виды методов обработки ошибок.
  • Модуль класса взлома : с помощью этой опции VBA остановит все ваши коды, которые не обрабатываются каким-либо методом. А если вы используете такие объекты, как Userforms, он также разбивается на эти объекты и выделяет точную строку, в которой находится ошибка.
  • Прерывать при необработанных ошибках : это параметр по умолчанию, который помогает вам узнать обо всех ошибках, для которых вы не используете какие-либо методы обработки ошибок, и останавливает код для всех необработанных ошибок. (Но если вы используете такие объекты, как Userforms, это не выделит строку, вызывающую ошибку в объекте, а выделит только строку, которая ссылается на этот объект).

Типы ошибок VBA

Чтобы понять ошибки VBA, вы можете разделить их на четыре категории, и ниже приводится объяснение этих типов ошибок.

1. Синтаксические ошибки

При написании кода VBA вы должны следовать определенному синтаксису, и если вы его игнорируете или пишете не так, как следует, вы можете столкнуться с синтаксисной ошибкой (также известной как языковая ошибка). Это похоже на опечатки, которые вы допускаете при написании кода.

Что ж, VBA помогает вам сообщать об этих ошибках, отображая сообщение об ошибке. Вам просто нужно убедиться, что в вашем редакторе VB включена «Автоматическая проверка синтаксиса».

Перейдите в «Инструмент ➤ Параметры» и обязательно установите флажок «Автоматическая проверка синтаксиса». При этом всякий раз, когда вы допускаете СИНТАКСИСНУЮ ошибку, VBA отображает сообщение об ошибке.

Но если «Автоматическая проверка синтаксиса» отключена, VBA по-прежнему выделяет строку кода с ошибкой, но не отображает сообщение об ошибке.

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

Это происходит, когда вы пишете код для выполнения действия, но это действие является недопустимым или не может быть выполнено VBA. Лучшим примером является случай, когда у вас есть код, использующий оператор IF, но вы пропустили добавление END IF в конце оператора, и теперь при запуске этого VBA вы показываете сообщение об ошибке компиляции.

Помимо этого, есть и другие примеры ошибок компиляции:

  • Использование For без Next ( For Next ).
  • Выбрать, не выделяя конец ( Выбрать регистр ).
  • Не объявляйте переменную, если вы включили « Явную опцию ».
  • Вызов подпрограммы/функции, которая не существует.

3. Ошибки выполнения

Ошибка времени выполнения возникает при выполнении кода. Помните пример, которым я поделился с вами выше, когда код вычислил квадратный корень числа.

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

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

А когда возникает ошибка во время выполнения, выполнение кода останавливается. Если вы нажмете кнопку «Отладка», вы увидите строку кода, содержащую эту ошибку, выделив ее желтым цветом. Или вы можете нажать кнопку «Конец», чтобы остановить выполнение кода и закрыть сообщение об ошибке.

4. Логическая ошибка

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

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

Использование инструментов отладки в VBA

VBA предоставляет вам набор инструментов для отладки вашего кода и удаления ошибок из ваших кодов.

1. Скомпилируйте проект VBA.

В редакторе Visual Basic есть опция, которую можно использовать сразу после завершения написания кода. Эти параметры компиляции анализируют каждую строку вашего кода и отображают окно сообщения, если в вашем коде есть ошибка.

Примечание. Параметр «Компилировать VBA» отслеживает только ошибки синтаксиса и компиляции, но не ошибки времени выполнения, поскольку эти ошибки возникают только во время выполнения кода. Чтобы использовать «Компилировать проект VBA», выберите ➤ «Отладка» ➤ «Компилировать проект VBA».

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

2. Запустите каждую строку кода одну за другой.

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

На «Панели инструментов отладки» есть кнопка «Шаг вперед», которую можно использовать для запуска кода построчно, или вы можете просто нажать F8, чтобы запустить одну строку, а затем нажать ее еще раз, чтобы запустить следующую строку кода.

Использование оператора «On ERROR» для обработки ошибок VBA

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

  • Позвольте VBA проигнорировать ошибку и запустите код.
  • Позвольте специальному набору инструкций выполняться при возникновении ошибки.

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

1. Если вы ошиблись, начните заново

Эта простая строка кода позволяет VBA продолжать выполнение кода, несмотря на возникновение ошибки. ИДЕЯ проста: перейти к следующей строке кода, если где-то во время выполнения обнаружена ошибка.

В приведенном ниже коде у вас есть две строки кода:

  • Первая строка указывает, что значение в ячейке A1 равно 25, разделенному на 0.
  • А во второй строке написано, что значение ячейки A2 равно 10, разделенному на 5.

Теперь возникла проблема с кодом, который у вас есть в сети. Как известно, если что-либо разделить на 0, результатом будет ошибка. Поэтому, когда вы запускаете этот код, VBA отображает сообщение об ошибке «Ошибка выполнения ’11’, деление на ноль» и останавливает выполнение.

Но когда вы добавляете «При возобновлении ошибки дальше» в самом начале кода и запускаете код, VBA просто игнорирует строку кода, в которой возникает ошибка, переходит ко второй строке и добавляет это значение в ячейку A2.

 Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub

Итак, всякий раз, когда вы хотите, чтобы ваш код выполнялся, несмотря на возникшую где-либо ошибку, просто используйте в своем коде оператор «При ошибке возобновлять далее».

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

Допустим, в строке 5 возникает ошибка, и вы добавили «При возобновлении ошибки дальше» в строке 8, эта ошибка не будет пропущена. Поэтому лучший способ — добавить его в качестве первой строки кода процедуры.

2. В случае ошибки GoTo 0.

Это поведение VBA по умолчанию: при возникновении ошибки выполнение кода прекращается.

Что ж, использование «При ошибке GoTo 0» не влияет на ваш код. VBA просто остановит выполнение кода и отобразит сообщение с описанием ошибки. Так почему я должен использовать его? Умный вопрос. Давайте воспользуемся примером, который вы использовали выше в разделе « Дальнейшее возобновление при ошибке ».

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

Таким образом, если вы введете «При ошибке GoTo 0» после второй строки кода, он восстановит обработчик ошибок VBA по умолчанию, который отображает сообщения об ошибках при каждом возникновении ошибки.

3. В случае ошибки GoTo [Метка]

Подумайте о месте в здании, куда вы можете обратиться в случае чрезвычайной ситуации. Аналогично, используя «При ошибке GoTo [Label]», вы можете просто создать отдельный блок кода в основном коде для обработки ошибки.

Фактически, «При ошибке GoTo [Label]» — гораздо лучший и удобный способ обработки ошибок. В приведенном ниже коде указано «При ошибке GoTo Oh!» Ошибка» теперь в этой строке объявления слово «О!» Ошибка» — это метка.

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

Что же произойдет, если произойдет ошибка: VBA перейдет к метке «О! Ошибка» и выполнит блок кода, который находится после этой метки.

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

  • Во-первых, убедитесь, что вы добавили тег ошибки в конце кода.
  • Во-вторых, добавьте «Exit Sub» перед меткой ошибки.

Благодаря этому вы выиграете в обеих ситуациях. Допустим, если произойдет ошибка и VBA переключится на указанную вами метку, то из самой метки в код останется только код. И если ошибка не возникает, оператор «Exit Sub», который находится перед меткой, завершит процедуру без выполнения метки ошибки.

4. В случае ошибки GoTo -1

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

О ВБА! Жить в настоящем

Чтобы обработать вторую ошибку в коде VBA, необходимо удалить первую ошибку из памяти VBA. В приведенном ниже коде есть два оператора «On Error GoTo [Label]», которые обрабатывают ошибки из двух разных блоков кода.

Но если вы запустите этот код, при второй ошибке VBA не перейдет к установленной вами метке и вместо этого отобразит сообщение об ошибке «Несоответствие типов».

 Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Чтобы решить эту проблему, вы можете использовать «При ошибке GoTo -1», который позволяет VBA удалить текущую ошибку из своего хранилища.

 Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Теперь, когда вы запускаете этот код, «При ошибке GoTo -1» удаляет ошибку из памяти, а VBA обрабатывает ошибку во втором операторе по желанию.

Что еще мне нужно знать для обработки ошибок в VBA?

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

Ошибка объекта

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

Характеристики

Вот свойства, которые вы можете использовать с объектом Err:

  • Err.Number : при возникновении ошибки номер сохраняется в объекте Err. В приведенном ниже коде, когда это происходит, в окне сообщения отображается номер ошибки.
  • Err.Description : это свойство отображает описание ошибки, которое поможет вам понять ее причину.
  • Err.Source: это свойство сообщает вам, в каком проекте произошла ошибка.
  • Err.HelpContext: это свойство возвращает идентификатор контекста справки для ошибки в файле справки.
  • Err.HelpContext: это строковое значение, указывающее расположение файла справки.

Обычно, когда вы имеете дело с ошибками, используя методы обработки ошибок, вы не часто используете объект Err в своих кодах. Но ниже приведен простой пример его использования.

 Sub Square_Root() On Error GoTo myError1    Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1:    MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _                "Error Number: " & Err.Number  & vbCrLf & _                "Error Description: " & Err.Description End Sub

Когда вы запустите приведенный выше код и произойдет ошибка, отобразится окно сообщения с номером ошибки и описанием ошибки.

Методы

С Err Object вы также можете использовать два метода.

  • Err.Clear: этот метод удаляет номер ошибки и описание ошибки из памяти VBA (это отличается от «При ошибке GoTo -1», поскольку он не сбрасывает ошибку полностью).
  • Err.Raise: с помощью этого метода вы можете намеренно сгенерировать ошибку времени выполнения в своем коде, и вот синтаксис, которому нужно следовать:

Err .Raise [номер], [источник], [описание], [файл справки], [контекст справки]

Краткие советы по обработке ошибок

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

  • Используйте «Возобновить при ошибке дальше» только в том случае, если вы точно знаете, что произошла ошибка и можно пропустить строку кода с ошибкой и безопасно перейти к следующей строке.
  • Лучший способ справиться с ошибками во время выполнения — использовать «Обработчик ошибок» с «При ошибке GoTo [Label]». Это гарантирует, что при возникновении ошибки вы будете уведомлены, но не будет отображаться это неприятное сообщение об ошибке.
  • Каждый раз, когда вы используете обработчик ошибок, обязательно сначала используйте «Exit Sub».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *