VBA относно изявления за грешки | Топ 3 начина за справяне с грешки

Декларация за грешка в Excel VBA

VBA On Error statement е вид механизъм за обработка на грешки, който се използва за насочване на кода да прави какво, ако срещне всякакъв вид грешка, обикновено когато код срещне грешка, изпълнението спира, но с този израз в кода изпълнението на кодът продължава, тъй като има набор от инструкции, които трябва да прави, когато срещне грешка.

Предвиждането на грешката в кода ви прави професионалист във VBA кодирането. Не можете да направите кода 100% ефективен, дори ако сте уверени в кода си по един или друг начин, той може да доведе до грешка.

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

Какво е грешка?

Грешката не е нищо друго, но ред код не може да бъде изпълнен поради функционалността или грешния код. Затова се опитайте да предвидите грешката и да се справите с нея.

Например, ако се опитате да изтриете листа, който го няма, тогава очевидно не можем да изпълним този ред код.

Грешката е от три типа, една е компилирана грешка поради недекларирани променливи. Втората е грешка при въвеждане на данни поради грешни записи от кодера, а третата е грешка във времето на изпълнение поради VBA не може да разпознае реда на кода. За опит за достъп или работа върху работен лист или работна книга, която не е там.

Но ние имаме изявление във VBA, за да се справим с всички тези видове грешки, т.е. изявлението „On Error“.

Видове отчети за грешки

Ключовият момент за обработка на грешките в VBA е изявлението „On Error“. Например При грешка „възобновяване на следващия ред“, „отидете или преминете към друг ред“ и т.н. ...

Изявлението за грешка има три вида изявления към него.

  1. GoTo 0  означава всеки път, когато възникне грешка по време на изпълнение, Excel или VBA трябва да покаже полето за съобщение за грешка, казвайки вида грешка, която е срещнала. Веднага след като VBA изпълни кода, той деактивира всички манипулатори на грешки в конкретния блок на кода.
  2. Resume Next означава, когато възникне грешката, този оператор инструктира Excel да игнорира тази грешка и да премине към (възобновяване на следващия) следващия ред код, без да показва съобщения за грешка. Това не означава, че ще поправи грешката, а просто я игнорира.
  3. 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 As Integer, j As Integer i = 20/0 j = 20/2 End Sub 

Сега ще добавя изявлението за възобновяване на грешка следващото отгоре.

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer On Error Resume Next i = 20/0 j = 20/2 End Sub 

Сега, ако изпълня този код, той няма да ми даде никакви съобщения за грешка, а ще изпълни следващия ред код, т.е. j = 20/2.

# 2 - При грешка GoTo Label

Декларирах три променливи.

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer 

За всички тези три променливи ще присвоя изчисление на деление.

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer i = 20/0 j = 20/2 k = 10/5

Резултатът от всички тези три изчисления ще бъде показан в полето за съобщения.

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer i = 20/0 j = 20/2 k = 10/5 MsgBox "Стойността на i е" & i & vbNewLine & "Стойността на j е "& j & _ vbNewLine &" Стойността на k е "& k & vbNewLine End Sub 

Сега ще се опитам да изпълня този код, тъй като изчисляването на „I“ не е правилно, ще получим грешка в времето на изпълнение 11.

Сега ще добавя изявлението „On Error Resume Next“.

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer On Error Resume Next i = 20/0 j = 20/2 k = 10/5 MsgBox "Стойността на i е" & i & vbNewLine & "The стойността на j е "& j & _ vbNewLine &" Стойността на k е "& k & vbNewLine End Sub 

Ако изпълня това, то ще пропусне изчислението „I” и ще изпълни останалите две изчисления и резултатът е както следва.

Сега вместо „При грешка възобновяване нататък“ ще добавя „При грешка GoTo KCalculation“

Код:

 Sub OnError_Example1 () Dim i As Integer, j As Integer, k As Integer On Error GoTo KCalculation: i = 20/0 j = 20/2 KCalculation: k = 10/5 MsgBox "Стойността на i е" & i & vbNewLine & "Стойността на j е" & j & _ vbNewLine & "Стойността на k е" & k & vbNewLine End Sub 

Note: 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.