Шаг 12 - Обработка ошибок VBA

Программирование это как хождение по минному полю. Неизвестно где взорвешься. Наверно так. Вы наслышаны о том, что Windows напичкан ошибками, о том, что среда разработки, любая при том - тоже. Мне попадались исследования на эту тему. Типа, что на каждые 1000 строк кода одна ошибка, у хорошего программиста естественно:-). В общем, это закон такой. Все равно ошибешься где-нибудь. Проводя аналогию между женщиной и компьютером:-))) В общем понятно.

Для обработки ошибок в VBA и VB есть специальный оператор On Error. Его задача при возникновении ошибки передать управление в то место (процедура или кусок кода), в котором это ждут. Посмотрим пример:

Sub Test()

On Error GoTo Errors1

Dim x As Integer

Dim a As Integer

Dim c As Double

x = 20

a = 0

c = x / a

MsgBox (" Этого не должно быть")

GoTo Ends:

Errors1:

MsgBox ("Ну ты блин Тикурила Даещь")

Ends:

End Sub

В данном примере при возникновении ошибки управление передается по метке Errors1 и дальше выполняется код. Я понимаю, что прерывать функцию из-за ошибки не всегда надо. И не только я так думаю, создатели VBA тоже так считали, и поэтому есть оператор Resume Next. Этот оператор реализует небезызвестный принцип - Ни шагу назад. Выполнение пойдет дальше, несмотря на ошибку.

Sub Test()

On Error GoTo Errors1

Dim x As Integer

Dim a As Integer

Dim c As Double

x = 20

a = 0

c = x / a

MsgBox ("Опаньки!!!")

GoTo Ends:

Errors1:

MsgBox ("Ну ты блин Тикурила Даещь")

Resume Next

Ends:

End Sub

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

Sub Test()

On Error Resume Next

Dim x As Integer

Dim a As Integer

Dim c As Double

x = 20

a = 0

c = x / a

x = 10

a = 3

c = 10 / 3

MsgBox ("Опаньки!!!")

End Sub

Над резюме можно немного поэкспериментировать, вот возможные описания:

Resume Next

Resune строка

Resume метка

Resume 0

Пример ниже будет упорно требовать, чтобы ввели число отличное от 0:

Sub Test()

On Error GoTo Error1

Dim x As Integer

Dim a As Integer

Dim c As Double

x = 20

a = Str(InputBox("введите число"))

c = x / a

x = 10

MsgBox ("Опаньки!!!")

GoTo Ends:

Error1:

MsgBox ("думай о программировании, а не о женщинах")

a = Str(InputBox("введите число"))

Resume 0

Ends:

End Sub

Шаг 13 - Объект Err

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

Sub Test()

On Error GoTo Error1

Sheets.Item(1000).Delete

GoTo Ends

Error1:

MsgBox "Error detected"

MsgBox (Str(Err.Number))

MsgBox (Err.Source)

MsgBox (Err.Description)

Ends:

End Sub

Итак, Number - это номер ошибки Source, где она появилась, а Description описание. В данном случае Вам скажут о выходе за гарницу массива. Вот это здорово. Особенно при создании программ. Получить такое сообщение пользователю не очень приятно, а вот программисту:-)) даже думать не надо.

У объекта Err есть метод очистки Clear, он все очишает. Вот в этом случае Вы не получите никаких сообщений. После обработки ошибки неплохо применить этот метод. Так, ради профилактики.

Sub Test()

On Error GoTo Error1

Sheets.Item(1000).Delete

GoTo Ends

Error1:

Err.Clear

MsgBox "Error detected"

MsgBox (Str(Err.Number))

MsgBox (Err.Source)

MsgBox (Err.Description)

Ends:

End Sub

Нельзя не сказать, что этот объект автоматически очистится после..

Resume

Exit Sub(Function)

On Error

При отладке или специально в программе вы и сами можете сгенирировать ошибку методом Raise, только надо знать, что ошибки до 1000 зарезервированы VBA, а максимальный код 65535. Любое правило подвержено изменениям и поэтому есть специальная константа, от которой вы можете сложением получать коды ошибок. Она называется vbObjectError.

Sub Test()

On Error GoTo Error1

Err.Raise 1001, "Test()", "Это я сделал"

Error1:

MsgBox "Error detected"

MsgBox (Str(Err.Number))

MsgBox (Err.Source)

MsgBox (Err.Description)

Ends:

End Sub


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: