Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Программирование в Microsoft Excel для пользователей
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

11. Типы ошибок в программах. Перехват ошибок времени выполнения

Лабораторная работа 11.1 Перехват ошибок времени выполнения

Обработка ошибок в макросах VBA в Excel, ошибки времени выполнения (run-time errors)

Подготовка:

1.     Создайте новый файл Excel и сохраните его как C:\ErrorHandling.xls.

2.     В ячейку A1 этого файла введите значение "Результат деления:".

3.     Щелкните правой кнопкой мыши по любой панели инструментов или меню и в открывшемся списке доступных панелей инструментов выберите Элементы управления.

4.     На панели инструментов Элементы управления нажмите кнопку Режим конструктора (верхняя левая кнопка) и в этом режиме поместите на лист Excel новую кнопку. Для этого нужно щелкнуть по объекту Кнопка на панели инструментов Элементы управления и на листе определить местонахождение и размеры этой кнопки.

5.     Щелкните по созданной вами кнопке правой кнопкой мыши и в контекстном меню выберите Свойства. Определите для нее свойства по вашему усмотрению.

6.     В режиме конструктора щелкните по кнопке правой кнопкой мыши и в контекстном меню выберите Исходный текст. Откроется редактор кода Visual Basic с созданной процедурой для события Click данной кнопки. Поместите в него следующий код:

Private Sub CommandButton1_Click()

    Dim nNum1 As Integer

    Dim nNum2 As Integer

    Dim nResult As Integer

    nNum1 = InputBox("Введите первое число")

    nNum2 = InputBox("Введите второе число")

    nResult = nNum1 / nNum2

    Range("B1").Value = nResult

End Sub

7.     Вернитесь на ваш лист Excel, выйдите из режима конструктора (щелкнув по кнопке Выход из режима конструктора на панели инструментов Элементы управления) и нажмите на созданную вами на листе кнопку. Убедитесь, что если вводить допустимые значения для делимого и делителя, то код работает правильно и выводит результат деления в ячейку B2.

Задание:

Измените эту программу таким образом, чтобы обеспечить защиту от ввода пользователем недопустимых значений (например, строковых значений делимого и делителя или значения делителя, равного 0).

Примечание

Не обязательно оставлять код по приему значений от пользователя и выполнению деления в обработчике события Click вашей кнопки. Этот код при желании можно перенести во внешние процедуры или функции.

Решение:

Существует множество вариантов решения этой задачи. Примеры приведены далее.

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

Option Explicit

Private Sub CommandButton1_Click()

    Call subPrepare

End Sub

Public Sub subPrepare()

    Dim nReturnCode As Integer

    Dim nAnswer As Integer

    nReturnCode = fDiv()

    Select Case nReturnCode

    Case 1

        MsgBox ("Делить на ноль нельзя!")

        nAnswer = MsgBox("Повторить?", vbYesNo)

        If nAnswer = vbYes Then

            Call subPrepare

        Else

            Application.Quit

        End If

    Case 2

        MsgBox ("Нужно число!")

        nAnswer = MsgBox("Повторить?", vbYesNo)

        If nAnswer = vbYes Then

            Call subPrepare

        Else

            Application.Quit

        End If

    Case 3

        MsgBox ("Неизвестная ошибка")

        nAnswer = MsgBox("Повторить?", vbYesNo)

        If nAnswer = vbYes Then

            Call subPrepare

        Else

            Application.Quit

        End If

    End Select

End Sub

Function fDiv()

    On Error Resume Next

    Dim nNum1 As Integer

    Dim nNum2 As Integer

    Dim nResult As Integer

    nNum1 = InputBox("Введите первое число")

    nNum2 = InputBox("Введите второе число")

    nResult = CInt(nNum1) / CInt(nNum2)

    Select Case Err.Number

    Case 0

        Range("B1").Value = nResult

        fDiv = 0

    Case 11

        fDiv = 1

    Case 13

        fDiv = 2

    Case Else

        fDiv = 3

    End Select

End Function

А вот решение с обработкой кода ошибки и циклом:

Private Sub CommandButton1_Click()

    Dim nNum1 As Variant

    Dim nNum2 As Variant

    Dim nResult As Integer

    Dim nError As Integer

    Do

        nNum1 = InputBox("Введите первое число:")

        On Error Resume Next

        nError = CInt(nNum1)

        If Err.Number = 13 Then

            MsgBox ("Нужно число")

            nNum1 = ""

        End If

        On Error GoTo 0

    Loop While (nNum1 = "")

    Do

        nNum2 = InputBox("Введите второе число:")

        On Error Resume Next

        nError = CInt(nNum2)

        If Err.Number = 13 Then

            MsgBox ("Нужно число")

            nNum2 = ""

        ElseIf nNum2 = 0 Then

            MsgBox ("Делить на ноль нельзя!")

            nNum2 = ""

        End If

        On Error GoTo 0

    Loop While (nNum2 = "")

    nResult = nNum1 / nNum2

    Range("B1").Value = nResult

End Sub

Еще один вариант решения вообще не допускает возникновения ошибок:

Private Sub CommandButton1_Click()

    Dim nNum1 As Variant

    Dim nNum2 As Variant

    Dim nResult As Integer

    Do

        nNum1 = InputBox("Введите первое число:")

        If IsNumeric(nNum1 & "") Then Exit Do

        MsgBox "Нужно число"

    Loop

    Do

        nNum2 = InputBox("Введите второе число:")

        If IsNumeric(nNum2 & "") Then

            If Int(nNum2) <> 0 Then Exit Do

            MsgBox "Делить на ноль нельзя!"

        Else

            MsgBox "Нужно число"

        End If

    Loop

    nResult = nNum1 / nNum2

    Range("B1").Value = nResult

End Sub

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 
© 2004-2016, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru