Заявление об ошибке Excel VBA
Оператор VBA On Error - это тип механизма обработки ошибок, который используется для указания кода, что делать, если он обнаруживает ошибку любого типа, обычно, когда код обнаруживает ошибку, выполнение останавливается, но с этим оператором в коде выполнение код продолжает работу, поскольку в нем есть набор инструкций, которые необходимо выполнить при обнаружении ошибки.
Предвидение ошибки в коде делает вас профессионалом в кодировании VBA. Вы не можете сделать код на 100% эффективным, даже если вы так или иначе уверены в своем коде, так как это может вызвать ошибку.
Выявить и обработать все виды ошибок практически невозможно, но у нас есть разные способы обработки ошибок в VBA. Во время написания кода вы можете не ожидать, что код ошибки может возникнуть, но если возникнет какая-либо ошибка, вы потратите больше времени на отладку, чем на написание самого кода.
Что такое ошибка?
Ошибка - это не что иное, как строка кода, которая не может быть выполнена из-за функциональности или неправильного кода. Поэтому постарайтесь предвидеть ошибку и обработать ее.
Например, если вы попытаетесь удалить лист, которого нет, очевидно, что мы не сможем выполнить эту строку кода.
Ошибка бывает трех типов: одна - ошибка компиляции из-за необъявленных переменных. Второй - ошибка ввода данных из-за неправильного ввода кодировщиком, а третий - ошибка времени выполнения из-за того, что VBA не может распознать строку кода. Для попытки получить доступ или работать с листом или книгой, которых там нет.
Но у нас есть инструкция в VBA для обработки всех этих типов ошибок, например, инструкция «On Error».
Типы сообщений об ошибках
Ключевым моментом обработки ошибок в VBA является оператор «On Error». Например, при ошибке «возобновить следующую строку», «перейти к другой строке или перейти к ней» и т. Д.
Оператор On Error имеет три вида операторов.
- GoTo 0 означает, что всякий раз, когда возникает ошибка времени выполнения, Excel или VBA должны отображать окно сообщения об ошибке с указанием типа обнаруженной ошибки. Как только VBA выполняет код, он отключает все обработчики ошибок в этом конкретном блоке кода.
- Resume Next означает, что всякий раз, когда возникает ошибка, этот оператор инструктирует Excel игнорировать эту ошибку и переходить (возобновить следующую) к следующей строке кода без отображения каких-либо сообщений об ошибках. Это не значит, что он исправит ошибку, скорее он просто проигнорирует ошибку.
- GoTo [метка] означает, что всякий раз, когда VBA обнаруживает ошибку, переходите к назначенной метке. Это заставляет код перейти к определенной строке, предоставленной кодировщиком.
3 основных способа обработки ошибок в VBA
Вы можете скачать этот шаблон VBA при ошибке здесь - Шаблон VBA при ошибке# 1 - При ошибке продолжить дальше
Предположим, вы делите значение 20 на 0 и объявили переменную, чтобы присвоить ей результат деления.
Код:
Sub OnError_Example1 () Dim i As Integer i = 20/0 End Sub
Если вы запустите этот код, он выдаст ошибку, указанную ниже.
Таким образом, вы не можете разделить любое число на нулевое значение. Номер ошибки времени выполнения - 11, т.е. деление на ноль.
Теперь добавлю в код еще одну строчку.
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число i = 20/0 j = 20/2 End Sub
Теперь я добавлю следующее вверху утверждение При возобновлении ошибки.
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число при ошибке Продолжить следующий i = 20/0 j = 20/2 End Sub
Теперь, если я выполню этот код, он не выдаст мне никаких сообщений об ошибках, а выполнит следующую строку кода, т.е. j = 20/2.
# 2 - При ошибке GoTo Label
Я объявил три переменные.
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число, k как целое число
Для всех этих трех переменных я назначу расчет деления.
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число, k как целое число i = 20/0 j = 20/2 k = 10/5
Результат всех этих трех вычислений будет показан в окне сообщения.
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число, k как целое число i = 20/0 j = 20/2 k = 10/5 MsgBox "Значение i равно" & i & vbNewLine & "Значение j равно "& j & _ vbNewLine &" Значение k равно "& k & vbNewLine End Sub
Теперь я попытаюсь выполнить этот код, поскольку вычисление «I» некорректно, мы получим ошибку времени выполнения 11.
Теперь я добавлю заявление «При ошибке возобновить следующее».
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число, k как целое число при ошибке Возобновить Далее i = 20/0 j = 20/2 k = 10/5 MsgBox "Значение i равно" & i & vbNewLine & " значение j равно "& j & _ vbNewLine &" Значение k равно "& k & vbNewLine End Sub
Если я выполню это, он пропустит вычисление «I» и выполнит оставшиеся два вычисления, и результат будет следующим.
Теперь вместо «При ошибке возобновить следующий» я добавлю «При ошибке GoTo KCalculation»
Код:
Sub OnError_Example1 () Dim i как целое число, j как целое число, k как целое число при ошибке GoTo KCalculation: i = 20/0 j = 20/2 KCalculation: k = 10/5 MsgBox "Значение i равно" & i & vbNewLine & "Значение j равно" & j & _ vbNewLine & "Значение k равно" & k & vbNewLine End SubNote: Here “KCalculation” is the label name I had given, you can give your own label name without any space.
Now if I execute this line of code it will not jump to the next line rather it will jump to the label name I have entered i.e. “KCalcualtion”. Here it will ignore the error given by “I” and also it will not execute “j” calculation but straight away it jumps to “KCalcualtion”.
#3 – Print Error Number in VBA
At the end of the code, we can also print the error number in a separate message box. The following line of code will do this job.
Code:
Err.Number
Now I will run this code first message box will show the calculation results.
Click on OK, it will show one more message box to show the error number.
We go 11 as the result i.e. Division by Zero.
We can also get the error description instead of the number. We just need to change the code, below is the code.
Code:
Err.Description
It will show a description like this.
Things to Remember
- After entering “On Error Resume Next” at the end of code don’t forget to add the statement “On Error GoTo 0”
- The label name should be the same in both places.
- Label names need not be defined well in advance.
- In the end, always see what was the error occurred through the separate message box.