4. Обработка ошибок
До этого момента мы рассматривали ошибки, которые совершает программист. В настоящем разделе речь пойдет о методах обнаружения ошибок, которые допускает I пользователь. Несмотря на самые детальные объяснения, предоставляемые пользователям, никогда нельзя быть полностью уверенным во введении только правильных I данных. Конечно, некорректные входные данные приводят к получению совершен-1 но невообразимых результатов, даже если программа выполняется совершенно правильно. Частью обязанностей разработчика (стоит заметить, самая важная из обязанностей) является обнаружение и обработка ошибок пользователей.
Оператор OnError
Один из методов обработки ошибок заключается в использовании оператора On Error. Существует несколько его вариантов. Во всех случаях ошибки перехватываются, и реакция приложения на каждую из них программируется самым тща-1 тельным образом. В следующем коде приведен простой пример использования этого оператора.
OnErrorResumeNext
Application.DisplayAlerts = False
Worksheets("Результаты").Delete
MsgBox("Программа продолжает свое обычное выполнение")
Целью данного кода является удаление листа Результаты. Но такого листа может просто не существовать, в результате оператор вызова метода Delete приведет к возвращению ошибки выполнения. Оператор On Error Resume Next можно интерпретировать следующим образом: "в случае ошибки игнорировать ее и продолжать выполнение процедуры со следующей строки". Если лист Результаты отсутствует, сообщение об ошибке отображаться не будет, а выполняется оператор MsgBox.
Еще один вариант этой конструкции показан далее. Если программой обнаруживается ошибка, то управление и в этом случае передается следующему оператору, но свойство Number встроенного объекта Err устанавливается в ненулевое значение, что можно проверить с помощью оператора If. Каждому типу ошибки соответствует определенный код, который сохраняется во встроенном объекте Err. Например, рассмотренная ниже операция (удаление несуществующего листа) приводит к получению ошибки, имеющей код 9. Код ошибки можно получить с помощью приведенной ниже последовательности операторов. В результате выполнения этого фрагмента кода выводится окно сообщения, показанное на рис. 10. Если вы не планируете постоянно создавать большие приложения, то можете не изучать коды ошибок. Достаточно помнить, что в случае возникновения ошибки объект Err имеет ненулевое значение, и значение 0 — в противном случае.
On Error Resume Next
Application. DisplayAlerts = False
Worksheets ("Результаты") .Delete
If Err <> 0 Then MsgBox "Лист Результаты удалить нельзя!"
MsgBox("Программа продолжает свое обычное выполнение")
Рис. 10. Сообщение с кодом ошибки
Оператор On Error Resume Next используется в коде, если ошибку нужно проигнорировать. Но существуют ошибки, которые ни в коем случае нельзя проигнорировать. В следующем коде продемонстрирована типичная ситуация обработки ошибок, которая возникает при разработке большинства программ.
Sub TryToOpen ()
On Error GoTo ErrorHandling
Workbook.Open "C:\VBABook\Ranges.xls"
Операторы
Exit Sub
ErrorHandling
MsgBox "Файл Ranges.xls удалению не подлежит"
End
End Sub
Данная процедура предназначена для открытия файла Ranges.xls, расположенного в папке VBABook на диске С:. После открытия над файлом выполняется ряд операций (в коде, обозначенном словом Операторы). Всегда существует вероятность того, что интересующий программу файл не существует или существует, но в другой папке. Для обработки таких ситуаций используется оператор On Error GoTo ErrorHandling. Эта строка имеет следующее предписание: "Следить за ошибками. Если ошибка произошла, перейти по метке ErrorHandling к следующим операторам процедуры. В противном случае продолжить нормальное выполнение процедуры". В процедуре может использоваться любое количеством меток. После каждой метки вводится двоеточие, а сами метки имеют произвольные имена. Каждая метка используется в качестве закладки, указывая место в процедуре, к которому перенаправляет операторGoTo.
Обратите внимание, что при отсутствии ошибок в процедуру необходимо добавить оператор Exit Sub. Без него файл Results .xls будет открыт и при этом будут выполнены все операторы, обозначенные как Операторы— все правильно, как и рассчитывалось. Однако затем выполняется оператор MsgBox, и программа завершает свою работу, что является нежелательным результатом.
Если в процедуре присутствует оператор От\ Error GoTo, то он находится в "постоянной готовности", ожидая возникновения ошибки. Если необходимо отключить отслеживание ошибок, то воспользуйтесь оператором On Error GoTo 0. Это выражение предотвращает отслеживание любых ошибок.
Самостоятельное обнаружение ошибок
Кроме оператора On Error, явную проверку правильности введенных данных можно выполнять и вручную. В следующих главах проверка правильности введенных данных в пользовательской форме, как правило, выполняется в процедуре OKButton_Click. Ниже показан типичный пример такой проверки. Отображенное на рис..11 диалоговое окно содержит два текстовых поля, в которые пользователь должен ввести данные. Эти поля называются DatelBox и Date2Box. Существует несколько способов введения неправильных данных: поля могут остаться пустыми, введенные даты могут оказаться некорректными (или вообще не датами) или начальная дата более поздняя, чем конечная. Если надеяться, что пользователь не будет совершать такие глупые ошибки, то останется только полагаться на удачу.
Рис. 11. Диалоговое окно ввода дат
В следующей процедуре не выполняется проверка введенных данных. Введенные пользователем даты просто сохраняются в общедоступных переменных BegDate и EndDate в надежде, что они введены правильно. Если в диалоговом окне будут введены неправильные даты, о результате работы оставшейся части приложения можно только догадываться.
Private Sub OKButton_Click()
BegDate = DatelBox
EndDate = Date2Box
Unload Me
End Sub
Целесообразнее проверять некорректность полученных приложением дат так, как показано в приведенном ниже коде. Код анализирует все элементы управления на пользовательской форме и находит текстовые поля, в которые вводятся данные. После нахождения текстового поля процедура проверяет, не пустое ли оно; если поле не пустое, то правильная ли дата в него введена (для этого используется исключительно полезная функция VBA isDate). Если поле пустое или оно содержит некорректную дату, выводится сообщение об ошибке; в результате текстовое поле с ошибочными данными активизируется. После этого выполнение процедуры завершается без выгрузки формы(т.е. пользователю предлагается повторно ввести данные). ЕслиI ошибки не обнаружены, то выполняется вторая проверка. На этот раз анализируется ситуация, когда вторая дата оказывается более ранней, чем первая. Если это так, ю выводится сообщение об ошибке и активизируется первое поле ввода данных. I Процедура завершает работу без выгрузки пользовательской формы. К моменту выгрузки пользовательской формы программист может быть уверен, что переменные HDateиEndDateсодержат действительные даты.
Private Sub OKButton_Click()
Dim ctl As Control
For Each ctl In Me.Control
If TypeName(ctl) = "TextBox" Then
If ctl.Value = "" Or Not IsDate(ctl) Then
MsgBox"Введите в поля корректные даты", _
vblnformation, "Неправильные даты"
ctl.SetFocus
ExitSub
End If
End If Next
BegDate = DatelBox
EndDate = Date2Box
If BegDate >= EndDate Then
MsgBox"Начальная дата должна быть меньше конечной", _
vblnformation, "неправильные даты"
DatelBox.SetFocus
Exit Sub
End if
Unload Me
End Sub
Написание кода, в котором реализована проверка приложения на наличие в нем ошибок, является не очень увлекательным занятием, но такой код в обязательном порядке должен присутствовать в любой программе, имеющей статут профессионально разработанной и отказоустойчивой. В результате программа не только будет защищена от ввода некорректных данных, но также будет выводиться сообщение об ошибках, которые позволят пользователю правильно реагировать на запросы программы, Обычно невозможно предусмотреть возникновение всех возможных ошибочно перехватить очевидные просто необходимо.
Yandex.RTB R-A-252273-3- Курсовое проектирование 1- 10
- Практическое занятие № 1
- План практического занятия
- Указания по проведению практического занятия
- Организационно-методические указания по проведению практического занятия
- 1). Опрос по лекции 1,2.
- 2). Знакомство с vba в Excel
- Практическое занятие № 2
- План практического занятия
- Указания по проведению практического занятия
- 1). Опрос по теме предыдущего занятия по контрольным вопросам.
- 2). Первая программа.
- 5. Введите код. Введите код между строками Sub и End Sub.
- Практическое занятие № 3
- План практического занятия
- Указания по проведению практического занятия
- 1). Опрос по теме предыдущего занятия по контрольным вопросам.
- 2). Изучение нового материала. Выполнение упражнение.
- 1. Комментарии
- 2. Строковые данные
- 3. Функции управления строковыми данными
- 4. Определение объектов, свойств и методов
- Практическое занятие № 4
- План практического занятия
- Указания по проведению практического занятия
- Практическая часть
- Упражнения по программированию по теме «Запись макросов»
- Практическое занятие № 5
- План практического занятия
- Указания по проведению практического занятия
- Практическая часть упражнения по программированию по теме «Условные операторы и циклы»
- Практическое занятие №6
- План практического занятия
- Указания по проведению практического занятия
- Решение задач оптимизации с помощью процедуры «Поиск решения»
- 1. . Применение процедуры Поиск решения.
- Упражнения по программированию по теме «Работа с надстройкой Поиск решения»
- Упражнения по программированию по теме «Массивы»
- Подбор параметра – имитационное моделирование в Excel.
- Практическое занятие №7
- План практического занятия
- Указания по проведению практического занятия
- Практическая часть
- 1. Введение
- 2. Упражнение
- 3. Отладка
- 4. Обработка ошибок
- 5. Резюме
- Практическое занятие №8
- План практического занятия
- Указания по проведению практического занятия
- Упражнения по программированию
- Практическое занятие № 9
- План практического занятия
- Указания по проведению практического занятия
- Практическая часть.