VBA про заяви про помилки | Найкращі 3 способи усунення помилок

Заява про помилку в Excel VBA

Оператор VBA On Error - це тип механізму обробки помилок, який використовується для керівництва кодом робити те, що, якщо він стикається з будь-яким типом помилки, зазвичай, коли код зустрічає помилку, виконання зупиняється, але з цим оператором у коді виконання код продовжується, оскільки він має набір інструкцій, які потрібно робити, коли виникає помилка.

Передбачаючи помилку в коді, ви робите професіонала в кодуванні VBA. Ви не можете зробити код на 100% ефективним, навіть якщо ви впевнені у своєму коді тим чи іншим чином, це може спричинити помилку.

Ідентифікувати та обробити будь-які помилки майже неможливо, але у нас є різні способи обробки помилок у VBA. Під час написання коду ви можете не передбачати, який тип помилки може видатися, але якщо з’явиться помилка, ви витратите більше часу на налагодження, ніж написання самого коду.

Що таке помилка?

Помилка - це не що інше, як рядок коду не може бути виконаний через функціональність або неправильний код. Тож спробуйте передбачити помилку та усунути її.

Наприклад, якщо ви спробуєте видалити аркуш, якого там немає, тоді, очевидно, ми не можемо виконати цей рядок коду.

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

Але у нас є заява у VBA, щоб обробляти всі ці види помилок, тобто заява "Про помилку".

Типи заяв про помилки

Ключовим моментом обробки помилок у VBA є твердження "Про помилку". Наприклад, про помилку “відновити наступний рядок”, “перейти або перейти до іншого рядка” тощо ...

У заяві про помилку є три типи заяв.

  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.

Тепер я додаю заяву «Про помилку відновлення наступного».

Код:

 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" і виконає решту двох обчислень, і результат буде таким.

Тепер замість “Про помилку Відновити далі” я додаю “Про помилку Перейти до 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.