Шаг 1 Первый макрос
Вид материала | Лекции |
- Е о конкурсе научных эссе «Первый шаг в науку» в Филиале спбгиэу в г. Череповце Общие, 166.97kb.
- Сочинение на тему: Учитель, школьный учитель!, 37.93kb.
- Социальная программа «Шаг в будущее, Электросталь», городская тематическая конференция, 600.58kb.
- Новый курс Новое понимание препятствий Проблема! Гипотетический вопрос Ваш первый шаг, 2221.82kb.
- Формируем и отправляем первый отчет, 218.56kb.
- Районная научно практическая конференция школьников «первый шаг в науку 2011», 141.76kb.
- Тема: Биография Ф. М. Достоевского (1821-1881) как первый шаг к пониманию творчества, 132.49kb.
- Содержани е первый шаг: Что такое интеллектуальная собственность и ее значение в бизнесе, 1773.65kb.
- Проект «Мой первый шаг в бизнес» как путь реализации региональной программы «Шкільна, 32.98kb.
- План мероприятий по здоровьесбережению моу «Основная общеобразовательная школа №19», 68.72kb.
Шаг 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
|