Если обработчик ошибок является частью той процедуры, в которой он размещен, VBA будет выполнять операторы обработчика ошибок при каждом выполнении процедуры. Ясно, что этого быть не должно. Нужно, чтобы обработчик ошибок выполнялся только тогда, когда в программе возникает ошибка.
Чтобы обработчик ошибок не выполнялся, когда это не нужно, необходимо добавить перед началом программного кода обработчика ошибок оператор Exit, как показано выше в примере из подраздела "Использование оператора On Error". Если это процедура типа Sub, то используйте оператор Exit Sub, а для процедуры типа Function используйте Exit Function.
Сам по себе обработчик ошибок состоит из следующих компонентов:
* метка, показывающая, где начинается программный код обработчика ошибок;
* программный код, призванный определить тип возникшей ошибки;
* программный код, обрабатывающий ошибку;
* оператор, дающий указание продолжить выполнение основной части процедуры (необязательный компонент).
Для идентификации начала программного кода обработчика ошибок поместите в первой строке обработчика ошибок стандартную метку VBA (напомню, что метка представляет собой любое допустимое слово, за которым следует двоеточие). Как уже объяснялось выше, в случае возникновения ошибки этой метке должен передать управление оператор On Error. В следующем примере такой меткой является ThisIsTheErrorHandler:
* * *
ThisIsTheErrorHandler:
* * *
( здесь размещаются операторы обработчика ошибок)
* * *
End Sub
Программный код обработчика ошибок почти всегда размешают в самом конце процедуры, поэтому и в данном примере обработчик ошибок завершается оператором End Sub.
Перед обработчиком ошибок ставятся две главные задачи- выяснение типа возникшей ошибки и выполнение некоторых действий по ее исправлению. По сути, эти задачи различны, но на практике они выполняются почти одновременно.
Как правило, при выяснении того, что произошло, используется объект Err VBA. Объект Err всегда доступен в любой VBA-программе. Его можно использовать сразу, без предварительного создания его экземпляра. В объекте Err VBA автоматически сохраняет информацию о последней из случившихся в программе ошибок. Вашей программе остается только выяснить значения свойств объекта Err, в частности значения свойств Number (Номер) и Description (Описание).
Свойство Number сообщает номер ошибки. Вы можете присвоить значение этого свойства переменной или использовать его непосредственно в условном выражении, как в следующем примере:
Sub ЕщеОдноСообщение()
On Error GoTo ПытаюсьДуматьНоНеВыходит
* * *
(склонные к ошибкам операторы )
Exit Sub
ПытаюсьДуматьНоНеВыходит:
Select Case Err.Number
Case 7 ' выход за пределы памяти
( обработка ошибки номер 7)
Case 11 ' деление на нуль
(обработка ошибки номер 11) .
... (и т.д.)
Case Else
( обработка всех остальных ошибок)
End Select
End Sub
В этом примере оператор Select Case сравнивает значение свойства Number с рядом фиксированных значений, для каждого из которых нужно создать обрабатывающий соответствующую ошибку фрагмент программного кода. Обработка ошибки может включать следующее.
* Информирование пользователя о том, что произошло, и получение от пользователя инструкций по этому поводу с помощью окна ввода или другой специальной формы.
* Попытка получить данные снова из того же или альтернативного источника.
* Изменение неподходящих данных на подходящие с одновременной записью в файл или выводом на экран сообщения о том, что для продолжения работы пришлось эти данные изменить.
Для эффективной работы со свойством Number нужно знать, каким именно ошибкам соответствуют возвращаемые этим свойством номера. Из-за недостатка места я не могу представить здесь соответствующий список. В некоторых VBA-приложениях - к ним относятся и приложения Office 97 - информация об ошибках, встречающихся чаше всего, имеется в разделе Trappable Errors (Распознаваемые ошибки) справки по VBA. Этот раздел можно найти, напечатав trappableerrors в поле ввода на вкладке Предметный указатель в окне справки. В справочной системе Office 2000 подобного раздела мне найти не удалось.
Даже если ваш программный код не может обработать какую-то ошибку или если вы просто не хотите утруждать себя, вы все равно можете не допустить появления стандартного сообщения VBA об ошибке, использовав свойство Description (Описание) объекта Err.
Читать дальше