Шаг 142.
VBA в MSExcel. Процедуры обработки ошибок и отладка программ. Разработка процедур, предотвращающих появление ошибок

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

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

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

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

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

Private Sub CommandButton1_Click()
  Dim Числитель, Знаменатель, Результат As Single

  Числитель = CDbl(TextBox1.Text)
  Знаменатель = CDbl(TextBox2.Text)
  Результат = Числитель / Знаменатель
  TextBox3.Text = CStr(Результат)
End Sub

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


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

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

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

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


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

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

Private Sub CommandButton1_Click()
  Dim Числитель, Знаменатель, Результат As Single

  If IsNumeric(TextBox1.Text) = False Then
    MsgBox "Ошибка в числителе", _
      vbInformation, "Деление"
    TextBox1.SetFocus
    Exit Sub
  End If

  If IsNumeric(TextBox2.Text) = False Then
    MsgBox "Ошибка в знаменателе", _
      vbInformation, "Деление"
    TextBox2.SetFocus
    Exit Sub
  End If

  Числитель = CDbl(TextBox1.Text)
  Знаменатель = CDbl(TextBox2.Text)
  Результат = Числитель / Знаменатель
  TextBox3.Text = CStr(Результат)
End Sub

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

  If CDbl(TextBox2.Text) = 0 Then
    MsgBox "Знаменатель не может быть нулем", _
      vbInformation, "Деление"
    TextBox2.SetFocus
    Exit Sub
  End If
Полный текст этого примера можно взять здесь.

    На следующем шаге мы рассмотрим перехват и обработку ошибок.




Предыдущий шаг Содержание Следующий шаг