Самоучитель VBA

Разработка процедур, предотвращающих появление ошибок



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

  • Предотвращение ошибок: программно анализировать вводимые или вычисляемые данные и в случае, если они могут приводить к ошибке, обеспечить, чтобы программа информировала пользователя о необходимости корректного задания данных.

  • Обработка ошибок: в случае появления ошибки, перехватить ее, обработать и программно откликнуться на возникшую ошибку.

  • При создании приложений надо сочетать оба подхода, применяя в каждом конкретном случае и для каждой возможной ошибки тот, который кажется разработчику наиболее эффективным.

  • В данном разделе рассмотрим процесс создания приложения, в котором предотвращается появление ошибок, на простейшем примере:

  • В диалоговом окне два поля (числитель и знаменатель) предусмотрены для ввода данных. Пользователь вводит в них по числу (рис. 12.1).

  • По нажатию кнопки Счет, программа делит число, введенное в поле Числитель, на число, введенное в поле знаменатель, и выводит полученный результат в поле ответ.

    Следующая программа производит деление числителя на знаменатель по нажатию кнопки Счет без контроля появления возможных ошибок:

    Private Sub CommandButtonl_Click()

    Dim Числитель, Знаменатель, Результат As Double

    Числитель = CDbl(TextBoxl.Text)



    Знаменатель = CDbl(TextBox2.Text)

    Результат = Числитель / Делитель

    TextBoxS.Text = CStr(Результат)

    End Sub

    Рис. 12.1. Диалоговое окно Деление

    Несмотря на то что рассматриваемая ситуация очень простая, она уже таит в себе множество подводных камней. Например, если пользователь по невнимательности забудет ввести в поле числитель или в поле Знаменатель число при нажатии кнопки счет происходит аварийное прерывание программы с малопонятным сообщением о несоответствии типов отображаемом в диалоговом окне Microsoft Visual Basic (рис. 12.2)





    Рис. 12.2. Диалоговое окно Microsoft Visual Basic с сообщением об ошибке

    Данное сообщение об ошибке связано с одной из следующих двух инструкций в программе:

    Числитель = CDbl(TextBoxl.Text)

    Знаменатель = CDbl(TextBox2.Text)

    где аргументом функции соы должна быть строка, преобразуемая в число. Если в какое-то из полей, числитель или Знаменатель, ничего не введено, по умолчанию из этого поля будет считываться пустая строка. Но пустая строка не может быть преобразована в число, и поэтому из-за функции CDbl происходит ошибка. Ошибка о несоответствии типов возникнет также, если в одно из полей пользователь по неосторожности введет число с десятичной запятой, а установками системы предусматривается десятичная точка и наоборот.

    Такие ошибки ввода легко избежать, если производить в программе предварительную проверку: преобразуются ли вводимые данные в числа? Эту предварительную проверку можно, например, сделать, как показано в следующей процедуре, в которой предусмотрены:

  • Проверка того, будет ли вводимая информация в поля ввода преобразовываться в числа.



    Рис. 12.3. Пример сообщения о некорректном вводе данных

  • Если вводимая информация не преобразуется в числа, то выдается сообщение о поле, в которое некорректно введены данные, и на него перемещается фокус. Например, в ситуации, показанной на рис. 12.3, в поле

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

    Private Sub CoramandButtonl_Click()

    Dim Числитель, Знаменатель, Результат As Single

    '

    If IsNumeric(TextBoxl.Text) = False Then MsgBox "Ошибка в числителе",

    vblnformation, "Деление" TextBoxl.SetFocus

    Exit Sub

    End If

    '

    If IsNumeric(TextBox2.Text) = False Then

    MsgBox "Ошибка в знаменателе",

    vblnformation, "Деление"

    TextBox2.SetFocus



    Exit Sub

    End If

    '

    Числитель = CDbl(TextBoxl.Text)

    Знаменатель = CDbl(TextBox2.Text)

    Результат = Числитель / Делитель

    TextBox3.Text = CStr(Результат)

    End Sub

    Но это еще не все подводные камни, которые подстерегают неосторожного пользователя при вводе данных даже в этом простом примере. Если пользователь в поле Знаменатель введет 0, то также произойдет аварийная остановка выполнения программы с отображением в диалоговом окне Microsoft Visual Basic сообщения: Деление на 0. Для избежания подобной ошибки будем проверять не только, являются ли введенные в поле данные числом, но и что это не ноль. Например, добавим перед расчетным блоком в процедуре следующую дополнительную проверку:

    If CDbl(TextBox2.Text) = 0 Then

    MsgBox "Знаменатель не может быть нулем", vblnformation, "Деление"

    TextBox2.SetFocus

    Exit Sub

    End If




    Содержание раздела