Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba коды ошибок

Vba коды ошибок

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

Подпрограмма обработки ошибки обычно включает объект Err , который содержит информацию об ошибках выполнения. Приведем свойства и методы объекта Err .

Таблица 1. Свойства объекта Err
СвойствоНазначение
NumberВозвращает код ошибки
SourceИмя текущего проекта VBA
DescriptionВозвращает строковое выражение, содержащее текст сообщения об ошибке
HelpFileПолное имя (включая диск и путь) файла справки VBA
HelpContextКонтекстный идентификатор файла справки VBA , соответствующий ошибке с кодом, указанным в свойстве Number
LastDLLErrorСодержит системный код ошибки для последнего вызова библиотеки динамической компоновки ( DLL )

Таблица 2. Методы объекта Err
МетодНазначение
ClearОчищает все значения свойств объекта Err . Метод Clear используется для явной очистки значений свойств объекта Err после завершения обработки ошибки. Это необходимо, например, при отложенной обработке ошибки, которая задается инструкцией On Error Resume Next
RaiseСоздает ошибку выполнения. Используется при моделировании ситуаций ошибки.

Аргументы:

  • number — номер ошибки, т.е. целое число от 0 до 65535;
  • source — строковое выражение, определяющее имя объекта или приложения, в котором возникла ошибка;
  • description — строковое выражение, содержащее описание ошибки;
  • helpfile — полное имя (включая диск и путь) файла справки Microsoft Windows , содержащего описание данной ошибки;
  • helpcontext — контекстный идентификатор, определяющий соответствующий обрабатываемой ошибке раздел в файле, указанном в аргументе helpfile .

На конкретном примере покажем, как применяется объект Err при создании обработчика ошибок. На предыдущем шаге в процессе создания диалогового окна Деление и связанной с ним программы, на первый взгляд были предусмотрены все возможные ошибки. Но это только на первый взгляд. Введем, например, в поле Знаменатель значение 1е-40. Это число ничем не лучше или не хуже любого другого числа типа Single . Тем не менее, вместо вывода результата произойдет аварийное прерывание выполнения программы с отображением сообщения об ошибке переполнения. Усовершенствуем программу с учетом возможности обработки подобной ошибки. В обработчике ошибок предусмотрим два отклика:

  • пользователь информируется программой в случае появления ошибки переполнения, знаменателю и числителю присваиваются 1 и с этими данными проводятся вычисления;
  • при появлении ошибки, отличной от ошибки переполнения, выполнение программы прерывается с информированием пользователя об ошибке (рисунок 1).

Рис.1. Диалоговое окно с указанием типа ошибки

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

Со следующего шага мы начнем рассматривать отладку программ .

Типы ошибок в VBA

При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:

Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.

Ошибки компиляции

Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.

Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.

Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.

В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.

Например, сообщение “Compile error: Variable not defined” при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).

Ошибки выполнения

Ошибки выполнения возникают в процессе выполнения кода и приводят к остановке выполнения программы. Этот тип ошибок VBA, как правило, также не сложно обнаружить и исправить, так как сообщается информация о характере ошибки и место в коде, где произошла остановка.

Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение “Run-time error ’11’: Division by zero“.

В зависимости от структуры проекта VBA, может быть предложено выполнить отладку кода (как показано на рисунке ниже). В этом случае при нажатии на кнопку Debug (в окне сообщения о необходимости отладки) будет выделена цветом строка кода, которая стала причиной ошибки VBA.

Получив такое сообщение и видя выделенную строку кода, как в приведённом выше примере, обнаружить причину ошибки будет совсем не сложно.

В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).

Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:

5Недопустимый вызов процедуры (Invalid procedure call)
7Недостаточно памяти (Out of memory)
9Индекс вне заданного диапазона (Subscript out of range)

Эта ошибка возникает при попытке обратиться к элементу массива за пределами заданного размера массива – например, если объявлен массив с индексами от 1 до 10, а мы пытаемся обратиться к элементу этого же массива с индексом 11.

11Деление на ноль (Division by zero)
13Несоответствие типа (Type mismatch)

Эта ошибка возникает при попытке присвоить переменной значение не соответствующего типа – например, объявлена переменная i типа Integer, и происходит попытка присвоить ей значение строкового типа.

53Файл не найден (File not found)

Иногда возникает при попытке открыть не существующий файл.

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

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

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

В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.

Логические ошибки

Логические ошибки (или баги) возникают в процессе выполнения кода VBA, но позволяют ему выполняться до самого завершения. Правда в результате могут выполняться не те действия, которые ожидалось, и может быть получен неверный результат. Такие ошибки обнаружить и исправить труднее всего, так как компилятор VBA их не распознаёт и не может указать на них так, как это происходит с ошибками компиляции и выполнения.

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

Редактор Excel VBA предоставляет набор инструментов отладки, которые помогут найти и исправить логические ошибки в коде VBA. В данной статье мы не будем рассматривать подробно эти инструменты. Любознательный пользователь может найти обзор инструментов отладки VBA на сайте Microsoft Help & Support (на английском).

Обработка ошибок в VBA

В каждую функция или процедуру следует включать обработку ошибок. Без нее пользователь может оказаться глядящим на дефектный код в открытом редактороме VBA в полной версии Аксесс, а в рантайм версии приложение просто падает.. Более подробно обработка ошибок изложена в статье FMS Error Handling and Debugging.

Простейший подход состоит в том, чтобы показать сообщение об ошибке и выйти из процедуры. Каждая процедура, таким образом, будет иметь такой формат (без номеров строк):

Для задач, где есть возможность нескольких ошибок, строки 7-8 нужно заменить более подробным вариантом:

Ветка Case Else в этом примере вызывает пользовательскую функцию записи деталей ошибки в таблицу. Это позволит подробнее разобраться уже после того, как ошибка будет очищена. Таблицу можно назвать «tLogError» и состоять она будет из следующих полей:

Имя поляТип данныхОписание
ErrorLogIDСчетчикПервичный ключ.
ErrNumberЧислоДлинное целое. Номер ошибки, сгенерированный Аксессом.
ErrDescriptionТекстРазмер=255. Сообщение об ошибке, сгенерированное Аксессом.
ErrDateДата/времяСистемная дата и время ошибки. По умолчанию: =Now()
CallingProcТекстИмя процедуры, вызвавшей LogError()
UserNameТекстИмя пользователя.
ShowUserЛогическийБудет или нет показан диалоговое сообщение (MsgBox) c описанием ошибки
ParametersТекст255. Опционально. Любые параметры, которые сочтете нужным записать.

Below is a procedure for writing to this table. It optionally allows recording the value of any variables/parameters at the time the error occurred. You can also opt to suppress the display of information about the error.

Ниже процедура для записи в эту таблицу. Она опционально позволяет записывать значения переменных/параметров во время возникновения ошибки. Можно также подавить вывод информации об ошибке на экран.

Замечания по функции:

  1. Для Аксесса 1 или 2, используйте Access Basic error handler.
  2. Возвращаемое значение служит только с целью показать, успешно ли функция записала в лог ошибку.
  3. Возможные расширения: Поскольку таблица tErrorLog у вас уже открыта, вы могли бы посчитать последние ошибки и подавить вывод на экран одного и того же сообщения несколько раз, или отменить повторные ошибки блокировки.

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

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

nNum 1 = InputBox («Введите первое число»)

nNum 2 = InputBox («Введите второе число»)

nResult = nNum1 / nNum2

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

Задание:

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

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

Решение:

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

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

Private Sub CommandButton1_Click()

Public Sub subPrepare()

Dim nReturnCode As Integer

Dim nAnswer As Integer

Select Case nReturnCode

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

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

If nAnswer = vbYes Then

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

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

If nAnswer = vbYes Then

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

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

If nAnswer = vbYes Then

On Error Resume Next

Dim nNum1 As Integer

Dim nNum2 As Integer

Dim nResult As Integer

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

nNum 2 = InputBox («Введите второе число»)

nResult = CInt(nNum1) / CInt(nNum2)

Select Case Err.Number

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

Private Sub CommandButton1_Click()

Dim nNum1 As Variant

Dim nNum2 As Variant

Dim nResult As Integer

Dim nError As Integer

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

On Error Resume Next

If Err.Number = 13 Then

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

On Error GoTo 0

Loop While (nNum1 = «»)

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

On Error Resume Next

If Err.Number = 13 Then

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

ElseIf nNum 2 = 0 Then

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

On Error GoTo 0

Loop While (nNum2 = «»)

nResult = nNum1 / nNum2

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

Private Sub CommandButton1_Click()

Dim nNum1 As Variant

Dim nNum2 As Variant

Dim nResult As Integer

nNum 1 = InputBox («Введите первое число:»)

If IsNumeric(nNum1 & «») Then Exit Do

MsgBox «Нужно число»

nNum 2 = InputBox («Введите второе число:»)

Читать еще:  Ошибка авторизации ошибка rpc xiaomi
Ссылка на основную публикацию
Adblock
detector