|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
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
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||