Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Макросы.doc
Скачиваний:
28
Добавлен:
21.11.2018
Размер:
16.91 Mб
Скачать

Написание процедуры обработки ошибся

При возникновении ошибки VBA ищет метку, указанную в операторе On Error GoTo, и начинает исполнять код, следующий за этой меткой. Этот код определяет тип ошибки и в соответствии с этим выполняет те или иные действия. Обычно идентификация ошибок осуществляется с помощью операторов If и Select. В эти операторы необходимо всегда включать пункт Else, который будет отвечать за неопознанные ошибки.

Выход из обработчика ошибок

В процедуре обработки ошибок для идентификации ошибок используются оператор If и Select и, следовательно, соответствующие условные выражения. В этих условных выражениях обычно проверяется значение свойства Number (Номер) объекта Err (Ошибка). Объект Err содержит информацию об ошибке, возникшей во время выполнения приложения, а свойство Number возвращает числовое значение, указывающее на тип ошибки. После определения типа ошибки и, возможно, выполнения каких-либо действий процедура обработки ошибок должна заканчиваться одним из следующих операторов.

  • Resume - возвращает управление оператору, при выполнении которого во: никла ошибка.

  • Resume Next - возвращает управление оператору, следующему за оператором, при выполнении которого возникла ошибка.

  • Resume метка - осуществляет переход к указанной метке.

  • End - завершает выполнение процедуры или приложения.

Пример обработчика ошибок

После небольшого экскурса в теорию обработки ошибок приступим к практическим занятиям. Вставьте новый модуль в рабочую книгу. Ниже приведены инструкции для создания процедуры, содержащей обработчик ошибок.

  1. Создайте новую процедуру под именем ПримерОбработчик.

  2. Введите код процедуры.

Dim sngValue As Single, sngDivideBy As Single

Dim sngAnswer As Single

Dim iResponse As Integer

On Error GoTo ErrorZone

sngValue = InputBox("Введите делимое")

sngDivideBy = InputBox("Введите делитель")

sngAnswer = sngValue / sngDivideBy

MsgBox "Результат деления = " & sngAnswer

Exit Sub

ErrorZone:

 Select Case Err

  Case 7

   MsgBox "He хватает памяти" & _

    Chr(13) & "Закройте неиспользуемые приложения"

   Resume

  Case 35 To 51

   MsgBox "Обратитесь к справочной системе"

  Case 11

   MsgBox "Деление на ноль"

  Case Else

   MsgBox "Неопознанная ошибка. Приложение завершается"

   End

End Select

  1. Начните выполнение процедуры. Введите число 10 в первое окно ввода.

  2. Введите 0 во второе окно ввода. После нажатия клавиши <Enter> отобразится окно с сообщением о делении на ноль.

  3. Щелкните на кнопке ОК для закрытия окна сообщения.

С помощью функции Error можно выводить текст, соответствующий возникшей ошибке. Измените процедуру ПримерОбработчик, как показано ниже (новый оператор выделен полужирным шрифтом).

Private Sub ПримерОбработчик()

 Dim sngValue As Single, sngDivideBy As Single

 Dim sngAnswer As Single

 Dim iResponse As Integer

 On Error GoTo ErrorZone

 sngValue = InputBox("Введите делимое")

 sngDivideBy = InputBox("Введите делитель")

 sngAnswer = sngValue / sngDivideBy

 MsgBox "Результат деления = " & sngAnswer

Exit Sub

ErrorZone:

 Select Case Err

  Case 7

   MsgBox "He хватает памяти" & Chr(13) & _

    "Закройте неиспользуемые приложения"

   Resume

  Case 35 To 51

   MsgBox "Обратитесь к справочной системе"

  Case 11

   MsgBox "Ошибка выполнения: " & Error

  Case Else

   MsgBox "Неопознанная ошибка. Приложение завершается"

   End

 End Select

End Sub

Начните выполнение процедуры. Введите число 5 в первое окно ввода и число 0 - во второе. Появится окно сообщения, показанное на рис. 13.1.

У вас может возникнуть мысль, что писать свой обработчик ошибок для каждой процедуры или функции не очень рационально. И вы будете совершенно правы. В следующем разделе я покажу, как создать централизованный обработчик ошибок.

Рис. 13.1. Текст сообщения, предложенный функцией Error