Отладка и обнаружение ошибок в программах VBA, ошибки времени выполнение (runtime errors), обработка ошибок времени выполнения, команда On Error GoTo, объект Err
Самое тяжелые для разработчика ошибки — это ошибки времени выполнения, которые могут возникнуть по самым разным причинам: пользователь ввел недопустимое значение, файл с таким именем уже существует, сервер баз данных отказывается вставлять введенные пользователем данные, разорвано сетевое соединение и т.п. При возникновении ошибок времени выполнения обычно работа приложения аварийно завершается, а пользователю выдается встроенное сообщение, которое он вряд ли сможет расшифровать. Поэтому одна из самых трудоемких частей при создании программы на VBA — предусмотреть, какие ошибки могут возникнуть при работе пользователя и реализовать их обработку.
Общий принцип обработки ошибки выглядит так:
Dim a As Integer, b As Integer, c As Integer
On Error GoTo ErrorHandlerDivision
c = a / b
Далее в коде программы помещается метка обработчика ошибки и программный код обработки:
ErrorHandlerDivision:
MsgBox "Ошибка при делении"
Поскольку в такой ситуации код обработчика ошибки будет выполняться даже в том случае, если ошибки не было, есть смысл поставить перед меткой обработчика команду Exit Sub (если это подпроцедура) или Exit Function (если это — функция). Полный код нашей мини-программы может выглядеть так:
Private Sub UserForm_Click()
Dim a As Integer, b As Integer, c As Integer
On Error GoTo ErrorHandlerDivision
c = a / b
Exit Sub
ErrorHandlerDivision:
MsgBox "Ошибка при делении"
End Sub
Как правило, если есть возможность исправить ошибку — в обработчике ошибок ее исправляют (или предоставляют такую возможность пользователю), если нет — то выдают пользователю сообщение с объяснением и прекращают работу программы.
После выполнения кода обработчика ошибки вам нужно будет сделать выбор — либо продолжить выполнение той процедуры, в которой возникла ошибка, либо прекратить ее выполнение и передать управление вызвавшей ее процедуре. В вашем распоряжении три варианта:
Resume метка
Синтаксис работы с меткой — такой же, как в GoTo.
Еще несколько моментов, которые связаны с обработкой ошибок:
On Error GoTo 0
Чуть подробнее о специальном объекте Err. У этого объекта — два главных свойства и два метода:
Надо сказать, что обработка ошибок — это очень надежный, но и очень ресурсоемкий метод работы. Если в вашей программе есть возможность обойтись без генерации и перехвата ошибок (например, проверить вводимое пользователем значение при помощи встроенных функций), то лучше так и делать. В то же время наличие обработчиков ошибок для того, чтобы справиться с действительно аварийными ситуациями — это большой плюс вашей программе (а зачастую и просто необходимость).