Объект Err
Объект Err содержит информацию о последней ошибке выполнения. Объект Err является внутренним объектом с глобальной областью определения. Нет необходимости в создании этого объекта. Он создается вместе с проектом. Вот список свойств объекта Err и их значений:
Таблица 10.1. Описание свойств объекта Err | |
Свойство | Значение |
Number | Номер (код) ошибки. Это свойство по умолчанию. |
Source | Строковое выражение, представляющее источник, в котором возникла ошибка. При ошибках в стандартном модуле оно содержит имя проекта. При ошибках в модуле класса свойство Source получает имя вида проект.класс. Конечно, хотелось бы, чтобы Source указывал источник возникновения ошибки более точно, хотя бы с точностью до имени процедуры, а лучше бы до оператора. Однако, этого пока не сделано. |
Description | Строка с кратким описанием ошибки, если такая строка для кода, указанного в Number, существует. Для собственных ошибок значение этого свойства следует задавать. |
HelpFile | Полное имя (включая диск и путь) файла справки VBA. Опять таки для собственных ошибок следует подготовить справочную систему и задавать путь к ней в этом свойстве. |
HelpContext | Контекстный идентификатор файла справки, соответствующий ошибке с кодом, указанным в свойстве Number. |
LastDLLError | Содержит системный код ошибки для последнего вызова DLL. Значение свойства LastDLLError доступно только для чтения. В лекции, посвященной работе с функциями Win32 API, подробно рассматривалось использование этого свойства. |
Рассмотрим пример, в котором возникает ошибка периода выполнения. Обработчик ошибки выдает сообщение о ней, используя свойства объекта Err. Затем в обработчике устраняется причина возникновения ошибки и управление возвращается оператору, инициировавшему запуск процедуры, приведшей к ошибке. Вся эта ситуация демонстрируется на примере работы с уже известной функцией fact2, вычисляющей корректно значение факториала для ограниченного диапазона значений входного параметра.
Public Function Fact2(ByVal N As Integer) As Integer
'Функция спроектирована для вычисления факториалов чисел, не больших 7
#If conDebug Then
Debug.Assert (N >= 0) And (N < 8)
#End If
If (N = 0) Or (N = 1) Then ' базис индукции.
Fact2 = 1 ' 0! =1.
Else ' рекурсивный вызов в случае N > 0.
Fact2 = Fact2(N - 1) * N
End If
#If conDebug Then
Debug.Assert Fact2 <= 5040
#End If
End Function
Заметьте, поскольку флаг отладки (conDebug) уже отключен, то Assert - утверждения не работают. Приведем процедуру, вызывающую функцию fact2 первый раз корректно, второй - нет, что приведет к ошибке, ее перехвату и исправлению ситуации:
Public Sub TestFact2()
Dim Msg As String
Dim VictoryCount As Integer, Prize As Long
On Error GoTo ErrHandler1
VictoryCount = 5
Prize = Fact2(VictoryCount) * 5
Debug.Print VictoryCount, Prize
VictoryCount = 10
Prize = Fact2(VictoryCount) * 5
Debug.Print VictoryCount, Prize
Exit Sub
ErrHandler1:
Msg = "Ошибка # " & Err.Number & " возникла в " & Err.Source _
& vbCrLf & " Описание: " & Err.Description _
& vbCrLf & " HelpFile: " & Err.HelpFile _
& vbCrLf & " HelpContext: " & Err.HelpContext
MsgBox Msg, vbMsgBoxHelpButton, "Error", Err.HelpFile, Err.HelpContext
'Грубое устранение причин ошибки
Err.Clear
If VictoryCount < 0 Then VictoryCount = 0
If VictoryCount > 7 Then VictoryCount = 7
Resume
End Sub
Пример 10.3. (html, txt)
Вот как выглядит окно сообщения, выведенное в обработчике ошибки.
Рис. 10.16. Сообщение, сформированное в обработчике ошибки
Заметьте, после выдачи сообщения процедура нормально завершает свою работу и в окне проверки Immediate появятся следующие результаты:
5 600
7 25200
Объект Err специально спроектирован для работы на этапе обнаружения и исправления ошибок периода выполнения. Он заменил ранее существовавшие функцию и оператор Err. Для совместимости с ними свойство Number реализовано, как свойство по умолчанию и его можно не указывать. Если в борьбе с ошибками на этапе отладки важную роль играет объект Debug, то не менее важна роль объекта Err при борьбе с ошибками периода выполнения. Также как и объект Debug, объект Err имеет всего два метода - Clear и Raise. Рассмотрим их подробнее.
- Объект Debug и его методы
- Метод Print
- Метод Assert
- Доказательство правильности программ
- Условная компиляция и отладка
- Директива #const
- #If … Then … #Else директива
- Ошибки периода выполнения и их обработка
- Модель управления ошибками в языке vba.
- Оператор On Error
- Оператор Resume
- Объект Err
- Метод Clear
- Метод Raise
- Класс и обработка ошибок
- Обработчики ошибок и вложенные вызовы процедур
- Структура обработчика ошибок
- Функция CvErr
- Оптимизация программ
- Приемы оптимизации кода
- Объявление переменных
- Математические операции
- Строковые операции
- Проектирование интерфейса. Меню
- Общие объекты Office 2000
- Коллекция CommandBars
- Свойства и методы коллекции CommandBars
- Свойства и методы объекта CommandBar
- Коллекция CommandBarControls и ее элементы
- О роли интерфейса
- Создание собственных и модификация встроенных меню
- Немного терминологии
- Возможности настройки и изменения системы меню
- Создание собственного головного меню
- Использование диалогового окна Настройка
- Создание меню с помощью vba
- Добавление выпадающих меню
- Использование диалогового окна Настройка
- Как добавить встроенное меню
- Добавление выпадающего меню с помощью vba
- Добавление подменю
- Вставка и группировка команд
- Добавление встроенной команды с помощью окна Настройка
- Добавление собственной команды с помощью окна Настройка
- Добавление команд с помощью vba
- Пример построения документа с собственным меню
- Группировка команд меню
- Удаление команд меню
- Удаление команды с помощью окна Настройка
- Удаление команды с помощью vba
- Как восстановить удаленные встроенные компоненты меню
- Изменение меню во время работы программы
- Вывод собственной панели меню
- Динамическое изменение видимости команд меню
- Управление доступом к командам меню
- Переименование команды меню
- Диалоговые окна и элементы управления
- Общие сведения и применение
- Встроенные диалоговые окна Коллекция Dialogs и объект Dialog
- Вывод сообщений. Функция MsgBox
- Окно ввода данных. Функция InputBox
- Создание пользовательских диалоговых окон
- Создание страниц и вкладок в диалоговых окнах
- Добавление дополнительных элементов управления
- Пример создания диалогового окна
- Разработка процедур, обрабатывающих события диалогового окна и его устройств
- Вызов собственного диалогового окна
- Установка начальных значений свойств элементов управления
- Использование Me в качестве имени текущего диалогового окна
- Модификация управляющих элементов во время работы
- Управление доступом к элементу
- Перемещение фокуса на элемент управления
- Изменение размеров диалогового окна
- Проверка корректности данных
- Обмен данными с диалоговым окном
- Закрытие диалогового окна
- Объект UserForm (диалоговое окно), коллекция UserForms (диалоговые окна)
- Коллекция Controls
- Объекты - элементы управления Перечень основных элементов управления
- Общие свойства элементов управления Объект-родитель
- Имя объекта
- Значение объекта
- Расположение объекта
- Параметры внешнего вида объекта
- Свойства поведения объекта
- Другие свойства
- CheckBox - флажок (кнопка выбора)
- ComboBox - комбинированный список
- CommandButton - командная кнопка
- Frame - рамка (группы)
- Image - изображение
- Label - метка (надпись, статический текст)
- ListBox - список
- MultiPage - набор страниц
- OptionButton - кнопка-переключатель
- ScrollBar - полоса прокрутки
- SpinButton - счетчик
- TabStrip - полоса вкладок
- TextBox - поле ввода (окно редактирования)
- ToggleButton - выключатель
- Объект DataObject
- Перемещение объектов. Как реализовать технику DragAndDrop
- События Событие AddControl (добавился элемент)
- Событие AfterUpdate (После модификации)
- Событие BeforeDragOver (Перед завершением перетаскивания)
- Событие BeforeDropOrPaste (Перед опусканием или вставкой)
- Событие BeforeUpdate (Перед модификацией)
- Событие Change (Изменение)
- Событие Click (Щелчок)
- Событие DblClick (Двойной щелчок)
- Событие DropButtonClick (Щелчок кнопки списка)
- События Enter, Exit (Вход, Выход)
- Событие Error (Ошибка)
- События KeyDown, KeyUp (Клавиша нажата, Клавиша отпущена)
- Событие KeyPress (Клавиша нажата)
- Событие Layout (Расположение)
- События MouseDown, MouseUp (Мышь нажата, Мышь отпущена)
- Событие MouseMove (Мышь движется)
- Событие RemoveControl (Удаление элемента)
- Событие Scroll (Прокрутка)
- События SpinDown (Уменьшить счетчик), SpinUp (Увеличить счетчик)
- Событие Zoom (Расширение)
- Методы Метод Add (Добавить)
- Метод AddItem (Добавить элемент)
- Метод Clear (Очистить)
- Метод Copy (Копировать)
- Метод Cut (Вырезать)
- Метод DropDown (Вывести список)
- Метод Move (Сдвинуть)
- Метод Paste (Вставить)
- Реализация операций Cut, Copy, Paste в диалоговых окнах
- Метод RedoAction (Повторить действие)
- Метод Remove (Удалить)
- Метод RemoveItem (Удалить элемент)
- Метод Repaint (Перерисовать)
- Метод Scroll (Прокрутить)
- Метод SetDefaultTabOrder (Установить стандартный порядок обхода)
- Метод SetFocus (Установить фокус)
- Метод UndoAction (Отменить действие)
- Реализация операций Undo и Redo в диалоговых окнах
- Метод zOrder (z-упорядочить)
- Основные виды файлов в Office 2000
- Открытие и создание файлов
- Закрытие файлов
- Запись в файлы последовательного доступа
- Чтение файлов последовательного доступа
- Ввод-вывод для файлов произвольного доступа и бинарных файлов
- Работа с данными переменной длины
- Один пример работы с Binary файлом