Список ошибок vba excel

Номер

Сообщение

Описание

3

Return
without GoSub

Оператор Return без GoSub

5

Invalid
procedure call

Неверный вызов процедуры

6

Overflow

Переполнение

7

Out of
memory

Недостаточно памяти

9

Subscript
out of range

Индекс вне заданного диапазона

10

This
array is fixed or temporarily locked

Этот массив имеет фиксированную длину или он временно
заблокирован

11

Division
by zero

Деление на ноль

13

Type mismatch

Несоответствие типа

14

Out of
string space

Не хватает памяти для строки

16

Expression
too complex

Выражение слишком сложное

17

Can’t
perform requested operation

Невозможно выполнить требуемую операцию

18

User
interrupt occurred

Произошло прерывание по команде пользователя

20

Resume
without error

Оператор Resume применен за пределами кода, отвечающего за
обработку ошибки

28

Out of
stack space

В стеке не хватает памяти

35

Sub,
Function or Property not defined

Процедура Sub, Function или Property не определена

47

Too many
DLL application clients

Слишком много приложений обращаются к DLL

48

Error in
loading DLL

Ошибка при загрузке DLL

49

Bad DLL
calling convention

Неверный вызов DLL

51

Internal
error

Внутренняя ошибка

52

Bad file
name or number

Неверное имя или номер файла

53

File not
found

Файл не найден

54

Bad file
mode

Неверный тип доступа

55

File
already open

Файл уже открыт

57

Device
I/O error

Ошибка устройства ввода/вывода

58

File
already exists

Файл уже существует

59

Bad
record length

Неверный размер записи

61

Disk full

Диск переполнен

62

Input
past end of file

Чтение файла невозможно, т.к. достигнут его конец

63

Bad
record number

Неверный номер записи

67

Too many
files

Слишком много файлов

68

Device unavailable

Устройство недоступно

70

Permission
denied

Доступ запрещен

71

Disk not
ready

Диск не готов

74

Can’t
rename with different drive

Нельзя переименовать файл со сменой носителя

75

Path/File
access error

Ошибка доступа к каталогу/файлу

76

Path not
found

Каталог не найден

91

Object
variable or With block variable not set

Переменная объекта или переменная блока With не задана

92

For loop
not initialized

Цикл For не инициализирован

93

Invalid
pattern string

Неверная маска

94

Invalid
use or Null

Неверное использование Null

97

Can’t
call Friend procedure on an object that is not an instance of the defining
class

Нельзя вызвать процедуру Friend, т.к. она не является
экземпляром класса

98

A
property or method call cannot include a reference to a private object,
either as an argument or as a return value

Обращение к свойству или методу не может включать ссылку
на локальный объект. Этот объект также не может быть аргументом или
возвращаемым значением

260

No timer
available

Ни один таймер не доступен

282

No
foreign application responded to a DDE initiate

Ни одно внешнее приложение не ответило на инициативу DDE

288

Destination
is busy

Адресат занят

290

Data is
wrong format

Неправильный формат данных

294

Invalid
DDE Link format

Неверный формат данных в DDE-диалоге

296

PasteLink
already performed on this control

PasteLink для этого элемента управления уже выполнен

297

Can’t set
LinkMode; invalid LinkTopic

Нельзя установить LinkMode; неправильный LinkTopic

298

System
DLL could not be loaded

Системная DLL
(библиотека) не может быть загружена

320

Can’t use
character device names in specified file names

Нельзя использовать имя устройства в определении имени
файла

321

Invalid
file format

Неверный формат файла

322

Can’t
create necessary temporary file

Не могу создать необходимый временный файл

325

Invalid
format in resource file

Неверный формат файла ресурсов

327

Data
value named not found

Значение не найдено

328

Illegal
parameter; can’t write arrays

Неверный параметр; не могу записать массив

335

Could not
access system registry

Доступ к системному реестру невозможен

336

ActiveX
component not correctly registered

Компонент ActiveX зарегистрирован неправильно

337

ActiveX
component not found

Компонент ActiveX не найден

338

ActiveX
component did not run correctly

Компонент ActiveX не может быть корректно выполнен

340

Control
array element ‘item’ doesn’t exist

Элемент управления ‘имя’ не найден

341

Invalid
control array index

Неверный индекс массива элементов управления

342

Not
enough room to allocate control array ‘item’

Недостаточно памяти для создания элемента управления ‘имя’

343

Object
not an array

Объект не является массивом

344

Must
specify index for object array

Необходимо указать индекс массива

345

Reached
limit: cannot create any more controls on this form

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

360

Object
already loaded

Объект уже загружен

361

Can’t
load or unload this object

Невозможно загрузить или выгрузить данный объект

363

ActiveX
control specified not found

Элемент управления ActiveX не найден

364

Object
was unload

Объект был выгружен

365

Unable to
unload within this context

Нет возможности в данном контексте произвести выгрузку

366

No MDI
form available to load

Форма, не определенная как MDI, не может быть загружена

368

The
specified file is out of date. This program requires a later version

Данный файл устарел. Эта программа требует более новой
версии

371

The
specified object can’t be used as an owner form for Show

Данный объект не может быть использован как родитель формы
для ее показа

380

Invalid
property value

Неверное значение свойства

381

Invalid
property-array index

Неверный индекс массива свойств

382

Property
Set can’t be executed at run time

Процедура установки свойства (Property Set) не может быть запущена
во время выполнения программы

383

Property
Set can’t be used with
а read-only property

Процедура установки свойства (Property Set) не может быть
использована для свойств, доступных только для чтения

385

Need
property-array index

Для массива свойств надо указать индекс

387

Property
Set not permitted

Процедура установки свойства (Property Set) не разрешена

389

Invalid key

Нажата неверная клавиша

393

Property
Get can’t be executed at run time

Процедура чтения свойства (Property Get) не поддерживается
во время выполнения программы

394

Property
Get can’t be executed on write-only property

Процедура чтения свойства (Property Get) не может быть
использована для свойств, доступных только для записи

396

‘Item’
property cannot be set within a page

Свойство ‘имя’ нельзя установить для страницы (объект
Printer)

400

Form
already displayed; can’t show modally

Форма уже отображена, ее нельзя отобразить как модальную

401

Can’t
show non-modal form when modal form is displayed

Немодальную форму нельзя отобразить одновременно с модальной

402

Must
close or hide topmost modal form first

Сначала необходимо закрыть верхнюю модальную форму

403

HDI forms
cannot be shown modally

MDI-формы не могут быть отображены как модальные

404

MDI child
forms cannot be shown modally

Дочерние MDI-формы не могут быть отображены модальными

419

Permission
to use object denied

Использование объекта запрещено

422

Property
not found

Свойство не найдено

423

Property
or method not found

Свойство или метод не найдены

424

Object required

Необходим объект

425

Invalid
object use

Неверное использование объекта

427

Invalid
object type; Menu control required

Неверный тип объекта; требуется элемент управления типа
Menu

429

ActiveX
component can’t create object or return reference to this object

Компонент ActiveX
не может создать объект или возвратить ссылку на этот объект

430

Class
doesn’t support Automation

Класс не поддерживает программирование объектов
(Automation)

432

File name
or class name not found during Automation operation

Имя файла или класса не найдено в процессе операции
программирования объектов (Automation)

438

Object
doesn’t support this property or method

Объект не поддерживает данное свойство или метод

440

Automation error

Ошибка программирования объектов (Automation)

442

Connection
to type library or object library for remote process has been lost

Связь с библиотекой типов или объектов для удаленного
процесса была утеряна

443

Automation
object doesn’t have a default value

Объект Automation
не имеет значения по умолчанию

444

Method not applicable in this context

Метод в этом контексте недоступен

445

Object doesn’t support this action

Объект не поддерживает эту команду

446

Object
doesn’t support named arguments

Объект не поддерживает указанные аргументы

447

Object doesn’t support current locale setting

Объект не поддерживает текущие национальные стандарты

448

Name argument not found

Именованный аргумент не найден

449

Argument
not optional or invalid property assignment

Аргумент обязателен или неверное
назначение свойства

450

Wrong
number of arguments

Неправильное количество аргументов

451

Object not a collection

Объект не является коллекцией

452

Invalid ordinal

Неверный порядковый номер

453

Specified DLL function not found

Указанная функция DLL не найдена

454

Code
resource not found

Код ресурса не найден

457

This key
is already associated with an element of this collection

Этот ключ уже ассоциирован с элементом этой коллекции

458

Variable
uses a type not supported in Visual Basic

Переменная использует тип, не поддерживаемый Visual Basic

459

This
component doesn’t support the set of events

Этот компонент не поддерживает установку событий

460

Invalid Clipboard format

Неверный формат Буфера обмена

461

Specified
format doesn’t match format of data

Данный формат не совпадает с форматом данных

462

The
remote server machine does not exist or is unavailable

Удаленная машина сервера не существует или недоступна

463

Class not
registered on local machine

Класс не зарегистрирован на локальной машине

480

Can’t create AutoRedraw image

Нельзя создать автоматически восстанавливаемое изображение

481

Invalid picture

Неверный рисунок

482

Printer error

Ошибка принтера

483

Printer driver does not support specified property

Драйвер принтера не поддерживает указанное свойство

484

Problem
getting printer information from the system. Make sure the printer is set up
correctly

Проблема при чтении информации принтером из системы.
Убедитесь, что принтер установлен правильно

485

Invalid
picture type

Неверный тип рисунка

486

Can’t
print form image to this type of printer

Нельзя распечатать изображение формы на принтере такого
типа

520

Can’t empty Clipboard

Нельзя очистить буфер обмена

521

Can’t open Clipboard

Нельзя открыть буфер обмена

735

Can’t save file to TEMP directory

Нельзя сохранить файл в каталоге TEMP

744

Search text not found

Исходный текст не найден

746

Replacements too long

Слишком длинная замена

Номер

Сообщение

Описание

2420

Syntax error in number

Число содержит синтаксическую ошибку

2421

Syntax error in date

Дата содержит синтаксическую ошибку

2422

Syntax error in string

Строка содержит синтаксическую ошибку

2423

Invalid use of ‘.’, ‘!’ or ‘( )’

Неверное использование ‘.’, ‘!’ или ‘( )’

2424

Unknown name

Неизвестное имя

2425

Unknown function name

Неизвестное имя функции

2427

Object has no value

Объект не имеет значения

2428

Invalid arguments used with domain function

Неверные аргументы статистической функции по подмножеству

2431

Syntax error(missing operator)

Синтаксическая ошибка (отсутствует оператор)

2433

Syntax error

Синтаксическая ошибка

2439

Wrong number of arguments used with function

Неверное число аргументов функции

2442

Invalid use of parentheses

Неверное использование скобок

2443

Invalid use of Is operator

Неверное использование оператора Is

2445

Expression too complex

Слишком сложное выражение

2446

Out of memory during calculation

Недостаточно памяти при вычислениях

2448

Can’t set value

Не удается задать значение

3001

Invalid argument

Ошибочный аргумент

3005

<Database name> isn’t a valid database name

Имя базы данных не является допустимым именем базы данных

3006

Database <name> is exclusively locked

Для базы данных <name> установлен монопольный доступ

3007

Can’t open library database <name>

Не удается открыть библиотечную базу данных <name>

3011

The Microsoft Jet database engine could not find the
object <name>. Make sure the object exists and that you spell its name
and the path name correctly

Объект <name> не найден ядром базы данных Microsoft
Jet. Проверьте существование объекта и правильность имени и пути

3012

Object <name> already exists

Объект <name> уже существует

3017

The size of a field is too long

Слишком большая длина поля

3021

No current record

Текущая запись отсутствует

3024

Couldn’t find file <name>

Не удается найти файл <name>

3025

Can’t open any moor

Открытие дополнительных файлов невозможно

3027

Can’t update. Database or object is read-only

Обновление невозможно. База данных или объект доступны
только для чтения

3036

Database has reached maximum size

Достигнут максимальный размер базы данных

3037

Can’t open any more tables or queries

Открытие дополнительных таблиц или запросов невозможно

3042

Out of MS-DOS file handles

Не хватает дескрипторов файлов MS-DOS

3043

Disk or network error

Дисковая или сетевая ошибка

3046

Couldn’t save; currently locked by another user

Сохранение невозможно; блокировка другим пользователем

3056

Couldn’t repair this database

Не удается восстановить эту базу данных

3107

Record(s) can’t be added; no insert permission or
<name>

Записи не могут быть добавлены; отсутствует разрешение на
вставку данных для объекта <name>

3108

Record(s) can’t be edited; no update permission or
<name>

Записи не могут быть изменены; отсутствует разрешение на
обновление данных для объекта <name>

3109

Record(s) can’t be deleted; no delete permission or
<name>

Записи не могут быть удалены; отсутствует разрешение на
удаление данных для объекта <name>

3111

Couldn’t create; no modify design permission for table or
query <name>

Создание невозможно; отсутствует разрешение на изменение
макета для таблицы или запроса <name>

3117

Can’t sort on Memo or OLE Object <clause>

Невозможна сортировка по полю Memo или объекта ActiveX в
<clause>

3116

Can’t join on Memo or OLE Object <name>

Невозможно объединение с полем Memo или объекта ActiveX
<name>

3146

ODBC – call failed

ODBC – ошибка вызова

3154

ODBC – couldn’t find DLL <name>

ODBC – не удается найти DLL <name>

3197

The Microsoft Jet database engine stopped the process
because you and another user are attempting to change the same data at the
same time

Процесс остановлен ядром базы данных Microsoft Jet, так
как другой пользователь пытается одновременно изменить те же данные

3230

Out-of-date Paradox lock file

Устаревший файл блокировок Paradox

3231

ODBC – field would be too long; data truncated

ODBC – слишком большое поле; произошло усечение данных

3232

ODBC – couldn’t create table

ODBC – создание таблицы невозможно

3235

ODBC – data type not supported on server

ODBC – тип данных не поддерживается сервером

3238

ODBC – data out of range

ODBC – данные выходят за пределы допустимого диапазона

3276

Invalid database object reference

Неверная ссылка на объект Database

3322

Crosstab query contains one or more invalid fixed column
headings

Перекрестный запрос содержит один или несколько неверных
заголовков столбцов

3342

Invalid Memo or OLE Object in sub-query<name>

Ошибочное поле Memo или поле объекта ActiveX в подчиненном
запросе <name>

3360

Query is too complex

Слишком сложный запрос

3409

Invalid field name<name> in definition of index or
relationship

Неверное имя поля <name> при определении индекса или
связи

3411

Invalid entry. Can’t perform cascading operation in
table<name> because the value entered is too large for field
<name>

Ошибочное значение. Невозможно выполнить каскадную
операцию в таблице <name>; значение велико для поля <name>

3423

You cannot use ODBC to import from, export to, or link an
external Microsoft Jet or ISAM database table to your database

Не допускается использование ODBC для импорта, экспорта
или присоединения таблицы из внешней базы данных Microsoft Jet или базы
данных ISAM

3424

Can’t create database because the locale is invalid

Создание базы данных невозможно; неверная национальная
настройка

3436

Failure creating file

Ошибка при создании, файла

3462

Failure to load DLL

Сбой при загрузке библиотеки

3506

The Synchronizer is unable to open the Synchronizer log

Синхронизатору не удается открыть журнал

3507

Failure writing to the Synchronizer log

Сбой при записи в журнал синхронизатора

3517

Synchronizer could not find any messages to process

Синхронизатор не может найти сообщение для обработки

3519

Failed to send a message

Сбой при отправке сообщения

3558

Disk I/O error at destination dropbox folder

Ошибка ввода/вывода на диске для результирующего банка
данных

3581

Can’t open replication system table <name> because
the table is already in use

Невозможно открыть системную таблицу репликации
<name>, так как она уже используется

3584

Insufficient memory to complete operation

Не хватает памяти для завершения операции

3586

Syntax
error in partial filter expression

Ошибка синтаксиса в выражении фильтра для таблицы
<name> в частичной реплике

3613

Can’t
create a relationship on linked ODBC tables

Не допускается создание связи между присоединенными
таблицами ODBC

3614

GUID not allowed in Find method criteria expression

Не допускается использование типа GUID в выражениях для
условия поиска в методах Find

3621

Can’t change password on a shared open database

Невозможно изменение пароля базы данных, открытой для
общего доступа

3624

Couldn’t read the record; currently locked by another user

Чтение невозможно. Блокировка другим сеансом на данной
машине

3637

Cannot use the crosstab of as a non-fixed column a
subquery

Нельзя использовать составной или нефиксированный столбец
в качестве вторичного запроса

На чтение 25 мин. Просмотров 15.7k.

VBA Error Handling

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

Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.

Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.

Содержание

  1. Краткое руководство по обработке ошибок
  2. Введение
  3. Ошибки VBA
  4. Заявление об ошибке
  5. Err объект
  6. Логирование
  7. Другие элементы, связанные с ошибками
  8. Простая стратегия обработки ошибок
  9. Полная стратегия обработки ошибок
  10. Обработка ошибок в двух словах

Краткое руководство по обработке ошибок

Пункт Описание
On Error Goto 0 При возникновении ошибки код останавливается и отображает
ошибку.
On Error Resume Next Игнорирует ошибку и
продолжает.
On Error Goto [Label] Переход к определенной метке при возникновении ошибки.
Это позволяет нам справиться
с ошибкой.
Err Object При возникновении ошибки
информация об ошибке
сохраняется здесь.
Err.Number Номер ошибки.
(Полезно, только если вам
нужно проверить, произошла ли конкретная ошибка.)
Err.Description Содержит текст ошибки.
Err.Source Вы можете заполнить это, когда используете Err.Raise.
Err.Raise Функция, которая позволяет
генерировать вашу собственную ошибку.
Error Function Возвращает текст ошибки из
номера ошибки.
Вышло из употребления.
Error Statement Имитирует ошибку. Вместо этого используйте Err.Raise.

Введение

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

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

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

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

VBA Error Handling

Ошибки VBA

В VBA есть три типа ошибок

  1. Синтаксис
  2. Компиляция
  3. Время выполнения

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

Синтаксические ошибки

Если вы использовали VBA в течение какого-то времени, вы
увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return,
VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.

Например, если вы введете If и забудете ключевое слово Then,
VBA отобразит следующее сообщение об ошибке.

VBA Error Handling

Некоторые примеры синтаксических ошибок

' then отсутствует
If a > b

' не хватает = после i
For i 2 To 7

' отсутствует правая скобка
b = left("АБВГ",1

Синтаксические ошибки относятся только к одной строке. Они
возникают, когда синтаксис одной строки неверен.

Примечание. Диалоговое окно «Ошибка синтаксиса» можно отключить, выбрав «Сервис» -> «Параметры» и отметив «Автосинтаксическая проверка». Строка по-прежнему будет отображаться красным цветом в случае ошибки, но диалоговое окно не появится.

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

Ошибки компиляции происходят более чем в одной строке.
Синтаксис в одной строке правильный, но неверный, если учесть весь код проекта.

Примеры ошибок компиляции:

  • Оператор If без соответствующего оператора End If
  • For без Next
  •  Select без End Select
  • Вызов Sub или Function, которые не существуют
  • Вызов Sub или Function с неверными параметрами
  • Присвоение Sub или Function того же имени, что и для модуля
  • Переменные не объявлены (Option Explicit должен присутствовать в верхней части модуля)

На следующем снимке экрана показана ошибка компиляции,
которая возникает, когда цикл For не имеет соответствующего оператора Next.

VBA Error Handling

Использование Debug-> Compile

Чтобы найти ошибки компиляции, мы используем Debug->
Compile VBA Project из меню Visual Basic.

Когда вы выбираете Debug-> Compile, VBA отображает первую
обнаруженную ошибку.

Когда эта ошибка исправлена, вы можете снова запустить
Compile, и VBA найдет следующую ошибку.

Debug-> Compile также будет включать синтаксические
ошибки в поиск, что очень полезно.

Если ошибок не осталось и вы запускаете Debug-> Compile,
может показаться, что ничего не произошло. Однако «Компиляция» будет недоступна
в меню «Отладка». Это означает, что ваше приложение не имеет ошибок компиляции
в текущий момент.

Debug->Compile Error Summary

Debug-> Compile находит ошибки компиляции (проекта).

Он также найдет синтаксические ошибки.

Он находит одну ошибку каждый раз, когда вы ее используете.

Если нет ошибок компиляции, оставленная опция Компиляция
будет отображаться серым цветом в меню.

Debug-> Compile Usage

Вы должны всегда использовать Debug-> Compile, прежде чем
запускать свой код. Это гарантирует, что ваш код не будет иметь ошибок
компиляции при запуске.

Если вы не запускаете Debug-> Compile, то VBA может
обнаружить ошибки компиляции при запуске. Их не следует путать с ошибками
времени выполнения.

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

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

VBA Error Handling

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

Другие примеры ошибок времени выполнения

  • база данных недоступна
  • пользователь вводит неверные данные
  • ячейка, содержащая текст вместо числа

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

Ожидаемые и неожиданные ошибки

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

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

Sub OtkritFail()
    
    Dim sFile As String
    sFile = "C:ДокументыОтчет.xlsx"
    
    ' Используйте Dir, чтобы проверить, существует ли файл
    If Dir(sFile) = "" Then
        ' если файл не существует, отобразить сообщение
        MsgBox "Файл не найден" & sFile
        Exit Sub
    End If
    
    ' Код достигнет только если файл существует
    Workbooks.Open sFile
    
End Sub

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

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

Ошибки времени выполнения, которые не являются ошибками VBA

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

Позвольте мне объяснить это на примере. Представьте, что у
вас есть приложение, которое требует, чтобы вы добавили значения в переменные a
и b

Допустим, вы по ошибке используете звездочку вместо знака
плюс

Это не ошибка VBA. Ваш синтаксис кода является совершенно
законным. Однако, с вашей точки зрения, это ошибка.

Эти ошибки не могут быть обработаны с помощью обработки ошибок, поскольку они, очевидно, не будут генерировать никаких ошибок. Вы можете справиться с этими ошибками, используя Unit Testing and Assertions.

Заявление об ошибке

Как мы видели, есть два способа обработки ошибок во время
выполнения

  1. Ожидаемые ошибки — напишите конкретный код для
    их обработки.
  2. Неожиданные ошибки — используйте операторы
    обработки ошибок VBA для их обработки.

Оператор VBA On Error используется для обработки ошибок.
Этот оператор выполняет некоторые действия при возникновении ошибки во время
выполнения.

Есть четыре различных способа использовать это утверждение

  1. On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
  2. On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
  3. On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
  4. On Error Goto -1 — очищает текущую ошибку.

Давайте посмотрим на каждое из этих утверждений по очереди.

On Error Goto 0

Это поведение по умолчанию VBA. Другими словами, если вы не
используете On Error, это поведение вы увидите.

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

Давайте посмотрим на пример. В следующем коде мы не
использовали строку On Error, поэтому VBA будет использовать поведение On Error
Goto 0 по умолчанию.

Sub IspDefault()

    Dim x As Long, y As Long
    
    x = 6
    y = 6 / 0
    x = 7

End Sub

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

VBA Error Handling

Когда появляется ошибка, вы можете выбрать End или Debug

Если вы выберете Конец, то приложение просто остановится.

Если вы выберете Отладить, приложение остановится на строке
ошибки, как показано на скриншоте ниже.

VBA Error Handling

Это нормально, когда вы пишете код VBA, поскольку он
показывает вам точную строку с ошибкой.

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

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

Используя On Error Goto [label], мы можем дать пользователю
более контролируемое сообщение об ошибке. Это также предотвращает остановку
приложения. Мы можем заставить приложение работать предопределенным образом.

On Error Resume Next

Использование On Error Resume Next указывает VBA
игнорировать ошибку и продолжать работу.

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

Если мы добавим Resume Next к нашему примеру Sub, то VBA
проигнорирует ошибку деления на ноль

Sub UsingResumeNext()

    On Error Resume Next
    
    Dim x As Long, y As Long
    
    x = 6
    y = 6 / 0
    x = 7

End Sub

Это не очень хорошая идея, чтобы сделать это. Если вы
игнорируете ошибку, то поведение может быть непредсказуемым. Ошибка может
повлиять на приложение несколькими способами. Вы можете получить неверные
данные. Проблема в том, что вы не знаете, что что-то пошло не так, потому что
вы подавили ошибку.

Приведенный ниже код является примером использования Resume
Next.

Sub OtprSoobsch()

   On Error Resume Next
   
    ' Требуется ссылка:
    ' Библиотека объектов Microsoft Outlook 15.0
    Dim Outlook As Outlook.Application
    Set Outlook = New Outlook.Application

    If Outlook Is Nothing Then
        MsgBox " Не удается создать сеанс Microsoft Outlook." _
                   & " Письмо не будет отправлено."
        Exit Sub
    End If
    
End Sub

В этом коде мы проверяем, доступен ли Microsoft Outlook на компьютере. Все,
что мы хотим знать — это доступно или нет. Нас не интересует конкретная ошибка.

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

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

On Error Goto [label]

Вот как мы используем обработку ошибок в VBA. Это эквивалент функциональности Try and Catch, которую вы видите на
таких языках, как C # и
Java.

При возникновении ошибки вы отправляете ошибку на
определенный ярлык. Обычно это внизу саба.

Давайте применим это к подводной лодке, которую мы
использовали

Sub IspGotoLine()

    On Error Goto eh
    
    Dim x As Long, y As Long
    
    x = 6
    y = 6 / 0
    x = 7
    
Done:
    Exit Sub
eh:
    MsgBox "Произошла следующая ошибка: " & Err.Description
End Sub

Снимок экрана ниже показывает, что происходит при возникновении ошибки.

VBA Error Handling

VBA переходит на метку eh, потому что мы указали это в
строке «Перейти к ошибке».

Примечание 1: Метка, которую мы используем в операторе On… Goto, должна быть в текущей Sub / Function. Если нет, вы получите ошибку компиляции.

Примечание 2: Когда возникает ошибка при использовании On Error Goto [label], обработка ошибок возвращается к поведению по умолчанию, т.е. код остановится на строке с ошибкой и отобразит сообщение об ошибке. См. Следующий раздел для получения дополнительной информации об этом.

On Error Goto -1

Это утверждение отличается от других трех. Он используется
для очистки текущей ошибки, а не для настройки конкретного поведения.

При возникновении ошибки с помощью функции On Error Goto [label] поведение обработки ошибки возвращается к поведению по умолчанию, т.е. On Error Goto 0 . Это означает, что если произойдет другая ошибка, код остановится на текущей строке.

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

Посмотрите на код ниже. Первая ошибка приведет к переходу
кода на метку eh. Вторая ошибка остановится на строке с ошибкой 1034.

Sub DveOshibki()

    On Error Goto eh
        
    ' генерировать ошибку «Несоответствие типов»
    Error (13)

Done:
    Exit Sub
eh:
    ' генерировать «определенную приложением» ошибку
    Error (1034)
End Sub

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

В коде ниже мы добавили строку

после того как мы поймаем первую ошибку.

Это не имеет никакого эффекта, так как ошибка не была
очищена. Другими словами, код остановится на строке с ошибкой и отобразит
сообщение.

Sub DveOshibki()

    On Error Goto eh
        
    ' генерировать ошибку «Несоответствие типов»
    Error (13)

Done:
    Exit Sub
eh:
    On Error Goto eh_other
    ' генерировать «определенную приложением» ошибку
    Error (1034)
Exit Sub
eh_other:
    Debug.Print "ehother " & Err.Description
End Sub

Для устранения ошибки мы используем On Error Goto -1.
Думайте об этом как об установке ловушки для мыши. Когда ловушка сработает, вам
нужно установить ее снова.

В приведенном ниже коде мы добавляем эту строку, и вторая
ошибка теперь приведет к переходу кода на метку eh_other.

Sub DveOshibki()

    On Error Goto eh
        
    ' генерировать ошибку «Несоответствие типов»
    Error (13)

Done:
    Exit Sub
eh:
    ' явная ошибка
    On Error Goto -1
    
    On Error Goto eh_other
    ' генерировать «определенную приложением» ошибку
    Error (1034)
Exit Sub
eh_other:
    Debug.Print "ehother " & Err.Description
End Sub

Примечание 1. Вероятно, в редких случаях полезно использовать On Error Goto -1. Мне лично никогда не приходилось пользоваться этой линией. Помните, что как только вы выйдете из Sub, ошибка все равно будет очищена.

Примечание 2. у объекта Err есть член Clear. Использование Clear очищает текст и цифры в объекте Err, но НЕ сбрасывает ошибку.

Использование On Error

Как мы уже видели, VBA будет делать одну из трех вещей при возникновении ошибки:

  • Остановитесь и отобразите ошибку.
  • Игнорируйте ошибку и продолжайте.
  • Перейти к определенной строке.

VBA всегда будет настроен на одно из этих действий. Когда вы
используете On Error, VBA изменит ваше поведение и забудет о любом предыдущем.

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

Sub ErrorSostoyaniya()

    Dim x As Long
    
    ' Перейти на этикетке, если ошибка
    On Error Goto eh
    
    ' это проигнорирует ошибку в следующей строке
    On Error Resume Next
    x = 1 / 0
    
    ' это отобразит сообщение об ошибке в следующей строке
    On Error Goto 0
    x = 1 / 0
  
Done:  
   Exit Sub
eh:
    Debug.Print Err.Description
End Sub

Err объект

При возникновении ошибки вы можете просмотреть детали
ошибки, используя объект Err.

При возникновении ошибки времени выполнения VBA
автоматически заполняет объект Err деталями.

Приведенный ниже код выведет «Error Number: 13 Type
Mismatch», которое возникает, когда мы пытаемся поместить строковое значение в
длинное целое число.

Sub IspErr()

    On Error Goto eh
    
    Dim total As Long
    total = "aa"

Done:
    Exit Sub
eh:
    Debug.Print "Номер ошибки: " & Err.Number _
            & " " & Err.Description
End Sub

Err.Description предоставляет подробную информацию об ошибке, которая происходит. Это текст, который вы обычно видите, когда возникает ошибка, например, «Несоответствие типов»

Err.Number — это идентификационный номер ошибки, например, номер ошибки для «Несоответствие типов» — 13. Единственное время, когда вам действительно нужно это, если вы проверяете, что произошла конкретная ошибка, и это необходимо только в редких случаях.

Свойство Err.Source кажется отличной идеей, но оно не работает при ошибке VBA. Источник вернет имя проекта, которое вряд ли сузит место возникновения ошибки. Однако, если вы создаете ошибку с помощью Err.Raise, вы можете установить источник самостоятельно, и это может быть очень полезно.

Получение номера строки

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

Это часто вызывает путаницу. В следующем коде Erl вернет ноль.

Sub IspErr()

    On Error Goto eh
    
    Dim val As Long
    val = "aa"

Done:
    Exit Sub
eh:
    Debug.Print Erl
End Sub

Это потому, что нет номеров строк. Большинство людей не
понимают этого, но VBA позволяет вам иметь номера строк.

Если мы изменим подпрограмму, указав номер строки, она теперь выведет 20.

Sub IspErr()

10        On Error Goto eh
          
          Dim val As Long
20        val = "aa"

Done:
30        Exit Sub
eh:
40        Debug.Print Erl
End Sub

Добавление номеров строк в код вручную затруднительно.
Однако есть инструменты, которые позволят вам легко добавлять и удалять номера
строк в подпрограмме.

Когда вы закончите работу над проектом и передадите его
пользователю, в этот момент может быть полезно добавить номера строк. Если вы
используете стратегию обработки ошибок в последнем разделе этого поста, то VBA
сообщит строку, где произошла ошибка.

Использование Err.Raise

Err.Raise позволяет нам создавать ошибки. Мы можем
использовать его для создания пользовательских ошибок для нашего приложения,
что очень полезно. Это эквивалент оператора Throw в Java C #.

Формат следующий

Err.Raise [error number], [error source], [error description]

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

Public Const ERROR_INVALID_DATA As Long = vbObjectError + 513

Sub ReadWorksheet()

    On Error Goto eh
    
    If Len(Sheet1.Range("A1")) <> 5 Then
        Err.Raise ERROR_INVALID_DATA, "ReadWorksheet" _
            , "Значение в ячейке A1 должно иметь ровно 5 символов."
    End If
    
    ' продолжить, если ячейка имеет действительные данные
    Dim id As String
    id = Sheet1.Range("A1")
    

Done:
    Exit Sub
eh:
    ' Err.Raise отправит код сюда
    MsgBox " Обнаружена ошибка: " & Err.Description
End Sub

Когда мы создаем ошибку, используя Err.Raise, нам нужно присвоить ей номер. Мы можем использовать любое
число от 513 до 65535 для нашей ошибки. Мы должны использовать vbObjectError с номером,
например

Err.Raise vbObjectError + 513

Использование Err.Clear

Err.Clear используется для очистки текста и чисел из объекта
Err.Object. Другими словами, он очищает описание и номер.

Редко вам понадобится его использовать, но давайте
рассмотрим пример, где вы могли бы.

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

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

Sub IspErrClear()

    Dim count As Long, i As Long

    ' Продолжите, если ошибка, так как мы проверим номер ошибки
    On Error Resume Next
    
    For i = 0 To 9
        ' генерировать ошибку для каждого второго
        If i Mod 2 = 0 Then Error (13)
        
        ' Проверьте на ошибку
        If Err.Number <> 0 Then
            count = count + 1
            Err.Clear    ' Очистить Err, как только он считается
        End If
    Next

    Debug.Print " Количество ошибок было: " & count
End Sub

Примечание: Err.Clear сбрасывает текст и цифры в объекте ошибки, но не очищает ошибку — см. On Error Goto -1 для получения дополнительной информации об очистке фактической ошибки.

Логирование

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

Код ниже показывает очень простую процедуру регистрации

Sub Logger(sType As String, sSource As String, sDetails As String)
    
    Dim sFilename As String
    sFilename = "C:templogging.txt"
    
    ' Архивный файл определенного размера
    If FileLen(sFilename) > 20000 Then
        FileCopy sFilename _
            , Replace(sFilename, ".txt", Format(Now, "ddmmyyyy hhmmss.txt"))
        Kill sFilename
    End If
    
    ' Откройте файл для записи
    Dim filenumber As Variant
    filenumber = FreeFile 
    Open sFilename For Append As #filenumber
    
    Print #filenumber, CStr(Now) & "," & sType & "," & sSource _
                                & "," & sDetails & "," & Application.UserName
    
    Close #filenumber
    
End Sub

Вы можете использовать это так:

' Создать уникальный номер ошибки
Public Const ERROR_DATA_MISSING As Long = vbObjectError + 514

Sub CreateReport()

    On Error Goto eh
    
    If Sheet1.Range("A1") = "" Then
       Err.Raise ERROR_DATA_MISSING, "CreateReport", "Данные отсутствуют в ячейке A1"
    End If

    ' другой код здесь
Done:
    Exit Sub
eh:
    Logger "Error", Err.Source, Err.Description
End Sub

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

Ниже приведен пример регистрации. То, как вы реализуете
журналирование, зависит от характера приложения и его полезности.

Sub ReadingData()
    
    Logger "Information", "ReadingData()", "Starting to read data."
       
    Dim coll As New Collection
    ' Read data
    Set coll = ReadData
    
    If coll.Count < 10 Then
        Logger "Warning", "ReadingData()", "Number of data items is low."
    End If
    Logger "Information", "ReadingData()", "Number of data items is " & coll.Count
    
    Logger "Information", "ReadingData()", "Finished reading data."

End Sub

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

Другие элементы, связанные с ошибками

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

Функция ошибки

Функция Error используется для печати описания ошибки с
заданным номером ошибки. Он включен в VBA для обеспечения обратной
совместимости и не нужен, поскольку вместо него можно использовать описание
Err.Description.

Ниже приведены некоторые примеры

' Распечатать текст «Деление на ноль»
Debug.Print Error(11)
' Распечатать текст "Несоответствие типов"
Debug.Print Error(13)
' Распечатать текст "Файл не найден"
Debug.Print Error(53)

Заявление об ошибке

Заявление об ошибке позволяет имитировать ошибку. Он включен
в VBA для обратной совместимости. Вместо этого вы должны использовать
Err.Raise.

В следующем коде мы моделируем ошибку «Разделить на ноль».

Sub ZayavlObOshibke()

    On Error Goto eh
        
    ' Это создаст деление на ноль ошибок
    Error 11
    
    Exit Sub
eh:
    Debug.Print Err.Number, Err.Description
End Sub

Это утверждение включено в VBA для обратной совместимости.
Вместо этого вы должны использовать Err.Raise.

Простая стратегия обработки ошибок

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

Основная реализация

Это простой обзор нашей стратегии

  1. Поместите строку On Error Goto Label  в начале нашего верхнего Sub.
  2. Поместите Label у обработки ошибок в конце нашего верхнего
    Sub.
  3. Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
  4. Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
  5. В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.

На следующем рисунке показан обзор того, как это выглядит

error-handling

Следующий код показывает простую реализацию этой стратегии

Public Const ERROR_NO_ACCOUNTS As Long = vbObjectError + 514

Sub BuildReport()

    On Error Goto eh
    
    ' Если ошибка в ReadAccounts, то перейти к ошибке
    ReadAccounts
    
    ' Сделай что-нибудь с кодом
    
Done:
    Exit Sub
eh:
    ' Все ошибки будут прыгать сюда
    MsgBox Err.Source & ": Произошла следующая ошибка  " & Err.Description
End Sub

Sub ReadAccounts()
    
    ' ОЖИДАЕМАЯ ОШИБКА - Может обрабатываться кодом
    ' Приложение может обрабатывать A1 равным нулю
    If Sheet1.Range("A1") = 0 Then
        Sheet1.Range("A1") = 1
    End If
    
    ' ОЖИДАЕМАЯ ОШИБКА - не может быть обработана кодом
    ' Приложение не может быть продолжено, если нет учетной записи
    If Dir("C:ДокументыОтчет.xlsx") = "" Then
        Err.Raise ERROR_NO_ACCOUNTS, "UsingErr" _
                , "There are no accounts present for this month."
    End If

    ' НЕОЖИДАННАЯ ОШИБКА - не может быть обработана кодом
    ' Если ячейка B3 содержит текст, мы получим ошибку несоответствия типов
    Dim total As Long
    total = Sheet1.Range("B3")
    
    
    ' продолжить и читать счета
    
End Sub

Это хороший способ реализации обработки ошибок, потому что

  • Нам не нужно добавлять код обработки ошибок в
    каждую подпрограмму.
  • Если возникает ошибка, то VBA корректно
    завершает работу приложения.

Полная стратегия обработки ошибок

Стратегия выше имеет один недостаток. Он не сообщает вам,
где произошла ошибка. VBA не наполняет Err.Source чем-либо полезным, поэтому мы
должны сделать это сами.

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

Целью этой стратегии является предоставление вам стека * и
номера строки в случае возникновения ошибки.

* Стек — это список вспомогательных функций, которые
использовались в данный момент при возникновении ошибки.

Это наша стратегия

  1. Разместите обработку ошибок во всех
    подпрограммах.
  2. Когда происходит ошибка, обработчик ошибок
    добавляет подробности к ошибке и вызывает ее снова.
  3. Когда ошибка достигает самой верхней
    подпрограммы, она отображается.

Мы просто «всплываем» из-за ошибки. Следующая диаграмма
показывает простое визуальное представление о том, что происходит, когда в Sub3
возникает ошибка

Error Handling – bubbling

Единственная грязная часть этого — правильное форматирование
строк. Я написал две подводные лодки, которые справляются с этим, поэтому он
позаботится о вас.

Это две вспомогательные подводные лодки

Option Explicit

Public Const MARKER As String = "NOT_TOPMOST"

' Вызывает ошибку и добавляет номер строки и имя текущей процедуры
Sub RaiseError(ByVal errorno As Long, ByVal src As String _
                , ByVal proc As String, ByVal desc As String, ByVal lineno As Long)
    
    Dim sLineNo As Long, sSource As String
    
    ' Если маркера нет, тогда RaiseError вызывается впервые.
    If Left(src, Len(MARKER)) <> MARKER Then

        ' Добавить номер строки ошибки, если она есть
        If lineno <> 0 Then
            sSource = vbCrLf & "Line no: " & lineno & " "
        End If
   
        ' Добавить маркер и процедуру к источнику
        sSource = MARKER & sSource & vbCrLf & proc
        
    Else
        ' Если ошибка уже возникла, просто добавьте имя процедуры
        sSource = src & vbCrLf & proc
    End If
    
    ' Если код останавливается здесь, убедитесь, что DisplayError находится в верхней части Sub
    Err.Raise errorno, sSource, desc
    
End Sub

' Отображает ошибку, когда она достигает самого верхнего sub
' Примечание: вы можете добавить вызов для входа из этого подпункта
Sub DisplayError(ByVal src As String, ByVal desc As String _
                    , ByVal sProcname As String)

    ' Удалить маркер
    src = Replace(src, MARKER, "")
    
    Dim sMsg As String
    sMsg = " Произошла следующая ошибка: " & vbCrLf & Err.Description _
                    & vbCrLf & vbCrLf & " Расположение ошибки: "
    
    sMsg = sMsg + src & vbCrLf & sProcname
    
    ' Показать сообщение
    MsgBox sMsg, Title:="Ошибка "
    
End Sub

Пример использования этой стратегии

Вот простое кодирование, которое использует эти Sub. В этой стратегии мы не размещаем какой-либо код в верхнем подпрограмме. Мы только вызываем подводные лодки.

Sub Topmost()

    On Error Goto EH
    
    Level1

Done:
    Exit Sub
EH:
    DisplayError Err.source, Err.Description, "Module1.Topmost"
End Sub

Sub Level1()

    On Error Goto EH
    
    Level2

Done:
    Exit Sub
EH:
   RaiseError Err.Number, Err.source, "Module1.Level1", Err.Description, Erl
End Sub

Sub Level2()

    On Error Goto EH
    
    ' Ошибка здесь
    Dim a As Long
    a = "7 / 0"

Done:
    Exit Sub
EH:
    RaiseError Err.Number, Err.source, "Module1.Level2", Err.Description, Erl
End Sub

Результат выглядит так

error handling output

Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.

error handling output line

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

“Programmatic Access to Visual Basic Project is not trusted”

Чтобы решить эту проблему, выполните следующие действия.

  1. Перейдите в раздел «Разработчик» на ленте и
    нажмите «Macro Security», которая находится под кодом.
  2. Нажмите «Настройка макроса» в левом списке.
  3. Поставьте флажок в поле «Доверительный доступ к
    объектной модели проекта VBA».
  4. Нажмите Ok.

Обработка ошибок в двух словах

  • Обработка ошибок используется для обработки ошибок, возникающих во время работы приложения.
  • Вы пишете определенный код для обработки ожидаемых ошибок. Вы используете оператор обработки ошибок VBA
    On Error Goto [label] для отправки VBA на метку при возникновении непредвиденной ошибки.
  • Вы можете получить подробную информацию об ошибке из Err.Description.
  • Вы можете создать свою собственную ошибку, используя Err.Raise.
  • Использование одного оператора On Error в самой верхней подпрограмме перехватит все ошибки в подпрограммах, которые вызываются отсюда.
  • Если вы хотите записать имя Sub с ошибкой, вы можете обновить ошибку и сбросить ее.
  • Вы можете использовать журнал для записи информации о приложении, когда оно запущено.

Contains a searchable list of common (core) VBA error codes used by the intrinsic Err object, as well as a separate list of all other errors.

When an error is generated in your application—whether it’s handled or not—the properties of the  Err object are assigned values with information about the error that just occurred. You can access this information, or generate your own errors explicitly using the Err.Raise method.

Err.Raise Number, [Source], [Description], [HelpFile], [HelpContext]

This, of course, requires knowledge of the error codes understood by the Err object. These are listed in searchable tables below (with hyperlinks to associated MSDN pages where available) . Error codes and descriptions were obtained from the following sources:

  • Core Visual Basic Language Errors
  • Miscellaneous Visual Basic Errors
  • ActiveX Control Errors

You can also define your own errors to unify the error-handling process. For example, see the article: Organizing Unstructured Errors in VBA.

Add the vbObjectError constant to custom error codes to guaranteed that the resulting number is not already in use.

Common VBA Error Codes

Learn how to deal with and resolve VBA errors in Excel

Types of Errors in VBA for Excel

Users will often encounter different types of errors in VBA. Below, we offer several strategies for dealing with and resolving them. We will go through techniques you can use to interrogate your code during testing, as well as methods of catching errors at runtime.

Types of Errors in VBA for Excel

Testing and tracking down different types of errors in VBA code can be time-consuming and frustrating. It’s not uncommon to hear programmers say that well over 30% of their time is spent on testing.

Over time, you’ll get better at avoiding errors, but it’s unlikely you’ll ever write perfect code, first-time. By learning how to avoid, deal with, and track down VBA errors, you’ll save yourself a ton of time in the future.

Types of VBA Errors

To make things easier, we’ve categorized the types of coding errors into three groups. For each group, we’ll explore some examples, and then discuss how you might investigate and resolve them.

1. Syntax errors – A specific line of code is not written correctly

2. Compile errors – Issues that happen when putting together lines of code, though the individual lines of code seem to make sense

3. Runtime errors – When the code is usually correct in principle, but an action taken by the user or the data being used leads to unexpected errors.

What are Syntax Errors?

Syntax errors are VBA’s way of telling you if your code makes sense, at the most basic of levels. We can make a simple comparison to the rules of writing a sentence in English:

  • A subject is required.
  • A verb is required.
  • A capital letter is required at the beginning.
  • Punctuation is required at the end.
  • Objects, adjectives, and other grammatical features are optional.

Jane found 18 errors in her VBA code.

In a similar manner, VBA imposes certain rules over what is required in certain situations. For example, when initiating a basic conditional IF statement in your code, you must replicate the following syntax rules for the first line of an IF statement;

  • It must begin with If
  • Next must be a logical test, such as x>10
  • Finally, it must end with the word then

If NumberErrors>20 then

If you break the above rules of English or VBA, your grammar (English) or syntax (VBA)  is considered incorrect.

How to Identify a Syntax Error

The VBA editor highlights syntax errors in red, allowing you to easily identify and resolve them. In addition, if you try to run your code or start a new line, you’ll be presented with the syntax error message below.

Basic syntax error:

Basic syntax erro

Syntax error message box:

Syntax Error Message Box

To make sure the checks occur as you’re typing, enable the “Auto Syntax Check” in the Options menu.

Auto Syntax Check

How to Resolve Syntax Errors

Syntax errors represent mistakes in the way a specific line of your code is written. They must be fixed before you can run your code. With experience, the red text will be all you need to spot the error. But if you’re still stuck, just search online for “if statement syntax vba” or whichever variation suits your needs, and you’ll find plenty of examples of the specific line you’re trying to write.

What are Compile Errors?

Compile errors refer to a wider group of VBA errors, which include syntax errors. Compile errors also identify problems with your code when considered as a whole. The syntax of each individual line may be correct, but when put together, the lines of your code don’t make sense. Compile errors are highlighted when you compile or run your code.

How to Identify a Compile Error

When you run your VBA code, compile errors will be presented in a VBA dialog box as per the examples below.

Alternatively, if your project is long or complex and involves multiple routines, it can be helpful to compile your code before you run it. It prevents situations where half of your code runs successfully and then an error pops up. You can compile your VBA code by clicking Debug Menu →  Compile VBA Project.

Example 1

A compile error for a missing “End if” part of an IF statement. Every individual line in the code is correct, but together, they don’t represent a complete IF statement.

Compile Error - Example 1

Example 2

In this example, the VBA compile process has detected a syntax error, highlighted in red. VBA indicates that the code below is missing a closing bracket on the function.

Compile Error - Example 2

Example 3

Compile errors are common when using Option Explicit and occur when a variable has not been explicitly defined. With Option Explicit activated, a Dim statement is required to declare all variables before they can be used in your code.

Compile Error - Example 3

How to Resolve Compile Errors

VBA compile errors will prevent affected routines from running. Until you fix them, your code cannot be interpreted correctly by VBA. The error message boxes often provide more helpful advice than with syntax errors.

If it’s not immediately obvious to you what the issue is from the error message, try using Microsoft’s Help Center to get an idea of exactly how your statement or function should be written. Here’s an example of the “Block if without end if” error message on the Microsoft website.

Block if without end if" error message on Microsoft page

What are Runtime Errors?

Once you’ve fixed syntax errors and compile errors, you’re ready to start testing or running your code properly to see how well it executes your desired actions or calculations. We call the period of testing, or live execution of code, “runtime.”

Runtime errors cannot be detected by simply looking at the code; they are a result of your code interacting with the specific inputs or data at that time.

Runtime errors are often caused by unexpected data being passed to the VBA code, mismatching data types, dividing by unexpected zeros, and defined cell ranges not being available. Runtime errors are also the most varied and complex to track down and fix.

How to Identify Runtime Errors

The VBA Debug function highlights the problem code in yellow and gives us a small clue as to what is causing the problem.

Example 1

While the code below simply divides one number by the other, there are some instances where it won’t be possible. For example, if cell A1 = 2 and cell A2 = 0, it’s not possible to divide by zero. The runtime error box includes a debug button, which highlights the problem code.

Runtime Error - Example 1

Runtime Errors - Example 1a

Example 2

In this example, I created an array to collect the names of n companies in my worksheet. I then tried to reference the sixth item, which may or may not exist at run time. VBA presents a runtime error message and allows me to press Debug to investigate the issue.

Runtime Error - Example 2

Once I press Debug, VBA highlights the line of code that is causing the problem. Now it’s down to me to use the “Subscript out of range” message to work out what’s going wrong. The subscript out of range error generally means that your code is good in principle, but that the specific item you’re looking for can’t be found. Most commonly, it will happen when referencing cells or ranges in Excel, as well as arrays in your VBA code.

Runtime Error - Example 2a

To make sure the Debug function is enabled, in the Options > General > Error Trapping menu, the default state should be to “Break on Unhandled Errors.” Leave the option checked.

Break on Unhandled Errors

How to Resolve Runtime Errors

Since runtime errors are varied and complex in nature, the solutions are also varied. The two general methods to reduce runtime errors are:

Error Trapping

It’s a good idea to put some thought into what possible scenarios your code might encounter. Even better is testing your code on practice data or with real users. It will allow you to recognize such scenarios in your VBA, with code branching into different outcomes, depending on if errors exist.

Example 1

Here, the ‘On Error Resume Next’ line forces the code to continue, even if an error is detected. We then use the If Err > 0 test to create a warning message, only if the error exists. The ‘On Error Goto 0’ resets VBA to its default state.

Error Trapping - Example 1

Example 2

Here, the code is calculating income per day, based on a monthly income, and a defined number of days. If the number of days is not provided, we skip to a defined point in our code called “NoDaysInMonthProvided:,” where we use the average number of days in a month as a base assumption. While it is simplistic, it shows clearly how to trap an error and skip to a different point in your code.

Error Trapping - Example 2

Clear User Instructions

Clear documentation and worksheet labels will ensure that your users interact with your model in the way that you intended. It will help prevent them when inputting text, instead of numbers, or leaving zeros that may later impact your code.

Summary

There are three key types of errors in VBA that can affect your code in different ways. It’s important to activate VBA’s error-detecting options, such as the debugger and auto syntax checking. They will help you to establish the location and nature of the errors.

More Resources

CFI is the official provider of the global Commercial Banking & Credit Analyst (CBCA)™ certification program, designed to help anyone become a world-class financial analyst. To keep advancing your career, the additional resources below will be useful:

  • #REF Excel Errors
  • Excel VBA Examples
  • Tips for Writing VBA in Excel
  • VBA Methods
  • See all Excel resources

Содержание

  1. Cell Error Values
  2. Пример
  3. Поддержка и обратная связь
  4. Обработка ошибок Excel VBA — все, что вам нужно знать!
  5. Типы ошибок VBA в Excel
  6. Ошибка синтаксиса
  7. Ошибка компиляции
  8. Ошибки времени выполнения
  9. Логические ошибки
  10. Использование отладки для поиска ошибок компиляции / синтаксиса
  11. Настройка параметров ошибок (обработанные и необработанные ошибки)
  12. Обработка ошибок VBA с помощью операторов «при ошибке»
  13. При ошибке Возобновить Далее
  14. При ошибке GoTo 0
  15. При ошибке Перейти к [ярлык]
  16. При ошибке Goto -1
  17. Объект ошибки
  18. Свойства объекта Err
  19. Методы объекта Err
  20. Err Clear Method
  21. Err Raise Method
  22. Рекомендации по обработке ошибок VBA

Cell Error Values

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

Константа Номер ошибки Значение ошибки ячейки
xlErrDiv0 2007 #ДЕЛ/0!
xlErrNA 2042 #Н/Д
xlErrName 2029 #ИМЯ?
xlErrNull 2000 #NULL!
xlErrNum 2036 #ЧИСЛО!
xlErrRef 2023 #ССЫЛКА!
xlErrValue 2015 #ЗНАЧ!

Пример

В этом примере семь значений ошибок ячейки вставляются в ячейки A1:A7 на листе 1.

В этом примере отображается сообщение, если активная ячейка на Листе 1 содержит значение ошибки ячейки. Используйте этот пример в качестве платформы для обработчика ошибок типа «ячейка-ошибка-значение».

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Обработка ошибок Excel VBA — все, что вам нужно знать!

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

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

В этом руководстве я покажу вам различные способы эффективной обработки ошибок в Excel VBA.

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

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

В Excel VBA есть четыре типа ошибок:

  1. Синтаксические ошибки
  2. Ошибки компиляции
  3. Ошибки времени выполнения
  4. Логические ошибки

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

Ошибка синтаксиса

Синтаксическая ошибка, как следует из названия, возникает, когда VBA обнаруживает что-то не так с синтаксисом в коде.

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

В приведенном ниже коде, как только я нажимаю Enter после второй строки, я вижу ошибку компиляции. Это потому, что Заявление ЕСЛИ необходимо иметь «Затем‘, Которая отсутствует в приведенном ниже коде.

Примечание: Когда вы вводите код в Excel VBA, он проверяет каждое предложение, как только вы нажимаете клавишу ВВОД. Если VBA обнаруживает, что в синтаксисе чего-то не хватает, он мгновенно отображает сообщение с текстом, который может помочь вам понять недостающую часть.

Чтобы убедиться, что вы видите синтаксическую ошибку всякий раз, когда чего-то не хватает, вам необходимо убедиться, что проверка автосинтаксиса включена. Для этого нажмите «Инструменты», а затем «Параметры». Убедитесь, что в диалоговом окне параметров включена опция «Автоматическая проверка синтаксиса».

Если опция «Автоматическая проверка синтаксиса» отключена, VBA по-прежнему будет выделять строку с синтаксической ошибкой красным цветом, но не будет отображать диалоговое окно с ошибкой.

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

Ошибки компиляции возникают, когда что-то отсутствует, что необходимо для запуска кода.

Например, в приведенном ниже коде, как только я попытаюсь запустить код, он покажет следующую ошибку. Это происходит, поскольку я использовал оператор IF Then, не закрывая его обязательным «End If».

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

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

Ниже приведены несколько сценариев, при которых вы столкнетесь с ошибкой компиляции:

  1. Использование оператора IF без конечного IF
  2. Использование оператора For с оператором Next
  3. Использование оператора Select без использования End Select
  4. Не объявлять переменную (это работает только при включенном Option Explicit)
  5. Вызов несуществующей подпрограммы / функции (или с неправильными параметрами)

Примечание о «Option Explicit»: Когда вы добавляете «Option Explicit», вам нужно будет объявить все переменные перед запуском кода. Если есть переменная, которая не была объявлена, VBA выдаст ошибку. Это хорошая практика, поскольку она показывает ошибку, если у вас есть переменная с ошибкой. Вы можете узнать больше о Option Explicit здесь.

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

Ошибки времени выполнения — это те, которые возникают во время выполнения кода.

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

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

Когда возникает ошибка времени выполнения, код останавливается и отображается диалоговое окно ошибки.

Сообщение в диалоговом окне «Ошибка выполнения» немного более полезно. Он пытается объяснить проблему, что может помочь вам ее исправить.

Если вы нажмете кнопку «Отладка», будет выделена часть кода, которая приводит к ошибке.

Если вы исправили ошибку, вы можете нажать кнопку «Выполнить» на панели инструментов (или нажать F5), чтобы продолжить выполнение кода с того места, где он был оставлен.

Или вы также можете нажать кнопку «Конец», чтобы выйти из кода.

Важный: Если вы нажмете кнопку «Конец» в диалоговом окне, код будет остановлен на той строке, в которой он встречается. Однако все предыдущие строки кода были бы выполнены.

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

Логические ошибки не остановят ваш код, но могут привести к неверным результатам. Это также могут быть самые сложные типы ошибок для устранения.

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

Один из примеров логической ошибки (с которой я часто сталкиваюсь) — это бесконечный цикл.

Другой пример может быть, когда он дает неправильный результат. Например, вы можете использовать неправильную переменную в коде или добавить две переменные, если одна из них неверна.

Я использую несколько способов устранения логических ошибок:

  1. Вставьте окно сообщения в какое-либо место в коде и выделите значения / данные, которые могут помочь понять, идет ли eberything, как ожидалось.
  2. Вместо того, чтобы запускать код за один раз, просматривайте каждую строку одну за другой. Для этого щелкните в любом месте кода и нажмите F8. вы могли бы заметить, что каждый раз, когда вы нажимаете F8, выполняется одна строка. Это позволяет просматривать код по одной строке за раз и определять логические ошибки.

Использование отладки для поиска ошибок компиляции / синтаксиса

Когда вы закончите работу с кодом, рекомендуется сначала скомпилировать его перед запуском.

Чтобы скомпилировать код, выберите параметр «Отладка» на панели инструментов и нажмите «Скомпилировать VBAProject».

Когда вы компилируете проект VBA, он просматривает код и выявляет ошибки (если таковые имеются).

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

Если в вашем коде нет ошибок, параметр Compile VBAProject будет неактивен.

Обратите внимание, что при компиляции будут обнаружены только ошибки «Синтаксис» и «Компиляция». Он НЕ найдет ошибок времени выполнения.

Когда вы пишете код VBA, вы не хотите, чтобы ошибки возникали. Чтобы избежать этого, вы можете использовать множество методов обработки ошибок.

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

Настройка параметров ошибок (обработанные и необработанные ошибки)

Прежде чем вы начнете работать со своим кодом, вам необходимо проверить один параметр в Excel VBA.

Перейдите на панель инструментов VBA и нажмите Инструменты, а затем нажмите Параметры.

В диалоговом окне «Параметры» перейдите на вкладку «Общие» и убедитесь, что в группе «Перехват ошибок» установлен флажок «Прерывание по необработанным ошибкам».

Позвольте мне объяснить три варианта:

  1. Прервать все ошибки: Это остановит ваш код на всех типах ошибок, даже если вы использовали методы для обработки этих ошибок.
  2. Модуль Break in Class: Это остановит ваш код на всех необработанных ошибках, и в то же время, если вы используете такие объекты, как пользовательские формы, он также сломается внутри этих объектов и выделит точную строку, вызвавшую ошибку.
  3. Перерыв в связи с необработанными ошибками: Это остановит ваш код только для тех ошибок, которые не обрабатываются. Это настройка по умолчанию, так как она обеспечивает уведомление о любых необработанных ошибках. Если вы используете такие объекты, как пользовательские формы, при этом не будет выделена строка, вызывающая ошибку в объекте, а будет выделена только строка, относящаяся к этому объекту.

Примечание: Если вы работаете с такими объектами, как пользовательские формы, вы можете изменить этот параметр на «Прерывание по модулям класса». Разница между №2 и №3 заключается в том, что при использовании Break в модуле класса вы перейдете к определенной строке в объекте, вызывающем ошибку. Вы также можете выбрать этот вариант вместо «Прерывание по необработанным ошибкам».

Вкратце: если вы только начинаете работу с Excel VBA, убедитесь, что установлен флажок «Прерывание при необработанных ошибках».

Обработка ошибок VBA с помощью операторов «при ошибке»

Когда ваш код обнаруживает ошибку, вы можете сделать следующее:

  1. Игнорируйте ошибку и позвольте коду продолжить
  2. Имейте код обработки ошибок и запускайте его при возникновении ошибки.

Оба этих метода обработки ошибок гарантируют, что конечный пользователь не увидит ошибку.

Есть несколько операторов «При ошибке», которые вы можете использовать для этого.

При ошибке Возобновить Далее

Когда вы используете в своем коде «Возобновить после ошибки», любая обнаруженная ошибка будет проигнорирована, и код продолжит работу.

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

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

Это происходит потому, что вы не можете разделить число на ноль.

Но если я использую в этом коде оператор «On Error Resume Next» (как показано ниже), он проигнорирует ошибку, и я не узнаю, что есть проблема, которую необходимо исправить.

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

Например, ниже приведен код события VBA, который мгновенно добавит значение даты и времени в ячейку A1 только что вставленного листа (этот код добавляется на лист, а не в модуль).

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

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

Примечание. Оператор «Возобновить следующее при ошибке» лучше всего использовать, когда вы знаете, с какими ошибками вы, скорее всего, столкнетесь. А затем, если вы считаете, что эти ошибки можно игнорировать, вы можете использовать это.

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

В приведенном ниже коде будет отображаться окно сообщения, которое будет информировать пользователя о том, что рабочий лист не вставлен.

«Err.Number» используется для получения номера ошибки, а «Err.Description» используется для получения описания ошибки. Они будут рассмотрены позже в этом руководстве.

При ошибке GoTo 0

«On Error GoTo 0» остановит код в строке, которая вызывает ошибку, и отобразит окно сообщения, описывающее ошибку.

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

Тогда зачем вообще его использовать?

Обычно вам не нужно использовать «On Error Goto 0», но это может быть полезно, когда вы используете его вместе с «On Error Resume Next».

Позволь мне объяснить!

Приведенный ниже код выберет все пустые ячейки в выделенном фрагменте.

Но он покажет ошибку, если в выбранных ячейках нет пустых ячеек.

Поэтому, чтобы не отображать ошибку, вы можете использовать «Возобновить при ошибке».

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

Все идет нормально!

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

Например, в приведенном ниже коде не будет сообщения об ошибке:

В приведенном выше коде есть два места, где может произойти ошибка. В первом месте мы выбираем все пустые ячейки (используя Selection.SpecialCells), а во втором — оставшийся код.

Хотя ожидается первая ошибка, никаких ошибок после нее нет.

Здесь на помощь приходит On Error Goto 0.

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

Например, в приведенном ниже коде не будет ошибки, если нет пустых ячеек, но будет сообщение об ошибке из-за ’10 / 0 ‘

При ошибке Перейти к [ярлык]

Два вышеуказанных метода — «При ошибке возобновить следующее» и «При ошибке перейти к 0» — не позволяют нам по-настоящему обработать ошибку. Один заставляет код игнорировать ошибку, а второй возобновляет проверку ошибок.

On Error Go [Label] — это способ, с помощью которого вы можете указать, что вы хотите делать, если в вашем коде есть ошибка.

Ниже приведена структура кода, в которой используется этот обработчик ошибок:

Обратите внимание, что перед меткой обработки ошибок находится подпрограмма выхода. Это гарантирует, что в случае отсутствия ошибок подпрограмма будет закрыта, а код «Label» не будет выполнен. Если вы не используете Exit Sub, он всегда будет выполнять код «Label».

В приведенном ниже примере кода при возникновении ошибки код перескакивает и выполняет код в разделе обработчика (и показывает окно сообщения).

Обратите внимание, что при возникновении ошибки код уже был запущен и выполнил строки перед строкой, вызвавшей ошибку. В приведенном выше примере код устанавливает значение X как 12, но поскольку ошибка возникает в следующей строке, он не устанавливает значения для Y и Z.

Как только код перейдет к коду обработчика ошибок (ErrMsg в этом примере), он продолжит выполнение всех строк в коде обработчика ошибок и ниже и завершит выполнение подпрограммы.

При ошибке Goto -1

Это немного сложно, и в большинстве случаев вы вряд ли им воспользуетесь.

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

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

Предположим, у вас есть код, в котором обнаружена ошибка. Но все в порядке, поскольку у вас есть один обработчик ошибок. Но что происходит, когда в коде обработчика ошибок появляется еще одна ошибка (да… что-то вроде начального фильма).

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

В этом сценарии вы можете использовать On Error Goto -1.

Он очищает ошибку и освобождает память VBA для обработки следующей ошибки.

Теперь позвольте мне объяснить на примерах.

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

Чтобы справиться с этим, я использую код обработчика ошибок (с именем ErrMsg), как показано ниже:

Теперь все снова хорошо. Как только возникает ошибка, используется обработчик ошибок и отображается окно сообщения, как показано ниже.

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

Поскольку первая ошибка была обработана, а вторая нет, я снова вижу ошибку, как показано ниже.

По-прежнему все хорошо. Код ведет себя так, как мы и ожидали.

Поэтому для обработки второй ошибки я использую другой обработчик ошибок (ErrMsg2).

И вот где это не работает должным образом.

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

Это происходит из-за того, что мы не удалили первую ошибку из памяти VBA.

Да, мы справились! Но все еще остается в памяти.

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

Чтобы очистить память VBA и удалить предыдущую ошибку, вам необходимо использовать «On Error Goto -1».

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

Примечание: Ошибка автоматически очищается после завершения подпрограммы.Таким образом, «On Error Goto -1» может быть полезен, когда вы получаете две или более двух ошибок в одной и той же подпрограмме.

Объект ошибки

Когда в коде возникает ошибка, для получения подробных сведений об ошибке (например, номера ошибки или описания) используется объект Err.

Свойства объекта Err

Объект Err имеет следующие свойства:

Свойство Описание
Номер Число, представляющее тип ошибки. Если ошибки нет, это значение равно 0.
Описание Краткое описание ошибки
Источник Название проекта, в котором произошла ошибка
HelpContext Идентификатор контекста справки для ошибки в файле справки
HelpFile Строка, представляющая расположение папки и имя файла справки.

Хотя в большинстве случаев вам не нужно использовать объект Err, иногда он может быть полезен при обработке ошибок в Excel.

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

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

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

Вы можете использовать объект Err, чтобы сделать эти сообщения об ошибках более значимыми.

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

Приведенный выше код предоставит вам гораздо больше информации, чем простое «Несоответствие типов», особенно адрес ячейки, чтобы вы знали, где произошла ошибка.

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

Следующий код сделает это:

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

Методы объекта Err

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

Метод Описание
Прозрачный Очищает все настройки свойств объекта Err
Поднимать Генерирует ошибку времени выполнения

Давайте быстро узнаем, что это такое и как / зачем их использовать с VBA в Excel.

Err Clear Method

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

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

Обратите внимание, что я использовал метод Err.Clear в операторе If Then.

После того, как ошибка возникла и была перехвачена условием If, метод Err.Clear сбрасывает номер ошибки обратно на 0. Это гарантирует, что условие IF перехватывает ошибки только для тех ячеек, в которых оно возникло.

Если бы я не использовал метод Err.Clear, при возникновении ошибки она всегда была бы истинной в условии IF, и номер ошибки не был сброшен.

Другой способ сделать это — использовать On Error Goto -1, который полностью сбрасывает ошибку.

Примечание: Err.Clear отличается от On Error Goto -1. Err.Clear очищает только описание ошибки и номер ошибки. он не сбрасывает его полностью. Это означает, что если в том же коде есть еще один экземпляр ошибки, вы не сможете обработать его до его сброса (что можно сделать с помощью «On Error Goto -1», а не «Err.Clear»).

Err Raise Method

Метод Err.Raise позволяет вызвать ошибку времени выполнения.

Ниже приведен синтаксис использования метода Err.Raise:

Err.Raise [номер], [источник], [описание], [файл справки], [контекст помощи]

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

Но зачем вам самому создавать ошибку?

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

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

В приведенном выше коде будет отображаться сообщение об ошибке с указанным описанием и файлом контекста.

Лично я никогда не использовал Err.Raise, так как в основном работаю только с Excel. Но для тех, кто использует VBA для работы с Excel вместе с другими приложениями, такими как Outlook, Word или PowerPoint, это может быть полезно.

Вот подробная статья о методе Err.Raise, если вы хотите узнать больше.

Рекомендации по обработке ошибок VBA

Независимо от того, насколько квалифицированно вы пишете код VBA, ошибки всегда будут его частью. Лучшие кодировщики — это те, кто умеет правильно обрабатывать эти ошибки.

Вот несколько рекомендаций, которые вы можете использовать при обработке ошибок в Excel VBA.

  1. Используйте «On Error Go [Label]» в начале кода. Это гарантирует, что любая ошибка, которая может произойти оттуда, будет обработана.
  2. Используйте «Возобновить при ошибке» ТОЛЬКО в том случае, если вы уверены в том, какие ошибки могут произойти. Используйте его только с ожидаемой ошибкой. Если вы используете его с неожиданными ошибками, он просто проигнорирует его и двинется вперед. Вы можете использовать «On Error Resume Next» с «Err.Raise», если хотите игнорировать определенный тип ошибки и улавливать остальные.
  3. При использовании обработчиков ошибок убедитесь, что вы используете Exit Sub перед обработчиками. Это гарантирует, что код обработчика ошибок будет выполняться только при возникновении ошибки (иначе он будет выполняться всегда).
  4. Используйте несколько обработчиков ошибок для перехвата различных типов ошибок. Наличие обработчика множественных ошибок гарантирует, что ошибка будет исправлена ​​должным образом. Например, вы хотите обрабатывать ошибку «несоответствие типа» иначе, чем ошибку времени выполнения «Деление на 0».

Надеюсь, вы нашли эту статью в Excel полезной!

Вот еще несколько руководств по Excel VBA, которые могут вам понравиться:

  • Типы данных Excel VBA — полное руководство
  • Циклы Excel VBA — для «Далее», «Сделать пока», «Сделать до», «Для каждого»
  • События Excel VBA — простое (и полное) руководство
  • Редактор Excel Visual Basic — как открыть и использовать в Excel

Источник

0 / 0 / 0

Регистрация: 25.03.2010

Сообщений: 210

1

Полный список ошибок

28.12.2010, 12:37. Показов 4976. Ответов 3


Студворк — интернет-сервис помощи студентам

где можно найти полный список описания всех ошибок, типа —

2500 Invalid value.
2501 Invalid page.
2502 Missing or invalid snapshot file.
2503 Property is read-only…

меня интересут ошибка 3129

спасибо



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.12.2010, 12:37

Ответы с готовыми решениями:

MPI. полный чайник. разбор ошибок
Еще код не дописан, ну запуталась как мне для матрицы правильно MPI_Scatterv передать… а точнее…

Программа, разворачивающая список типа a-z в полный список abc.xyz
Буду благодарен, если кто-то объяснит, как работает данная программа построчно (отлично будет, если…

Полный ДАМП ошибок. Не могу понять что делать
Приветствую форумчане.
Помогите с решением ошибок.
Дамп прилагается. Не знаю как читать его и…

Составить базу данных об учащихся. Составить программу позволяющую выводить полный список учащихся, список выбравших предмет, список лучших учеников
Составить базу данных об учащихся, предусмотрев поля: Ф.И.О., предметы по выбору, экзаменационные…

3

0 / 0 / 0

Регистрация: 22.10.2009

Сообщений: 50

29.12.2010, 21:06

2

Весь список перехватываемых ошибок:

Код Сообщение
3 Инструкция Return без GoSub
5 Недопустимый вызов процедуры
6 Переполнение
7 Не хватает памяти
9 Индекс выходит за пределы допустимого диапазона
10 Массив имеет фиксированную длину или временно блокирован
11 Деление на 0
13 Несоответствие типа
14 Не хватает памяти для строки
16 Слишком сложное выражение
17 Невозможно выполнение требуемой операции
18 Произошло прерывание, вызванное пользователем
20 Инструкция Resume не в программе обработки ошибок
28 Не хватает стековой памяти
35 Процедура Sub, Function или Property не определена
47 Слишком много клиентов библиотеки приложения
48 Ошибка при загрузке библиотеки
49 Неверное соглашение о вызовах библиотеки
51 Внутренняя ошибка
52 Неверное имя или номер файла
53 Файл не найден
54 Неверный режим файла
55 Файл уже открыт
57 Ошибка устройства ввода/вывода
58 Файл уже существует
59 Неверная длина записи
61 Переполнение диска
62 Ввод за пределами конца файла
63 Неверный номер записи
67 Слишком много файлов
68 Устройство недоступно
70 Нет разрешения
71 Диск не готов
74 Невозможно переименование с другим именем диска
75 Ошибка доступа к файлу/каталогу
76 Путь не найден
91 Не задана объектная переменная или переменная блока With
92 Цикл For не инициализирован
93 Недопустимая строка шаблона
94 Недопустимое использование Null
97 Невозможен вызов процедуры Friend для объекта, не являющегося экземпляром определяющего класса
298 Системная библиотека DLL не загружается
320 Нельзя использовать имена символьных устройств в именах данных файлов
321 Недопустимый формат файла
322 Невозможно создание требуемого временного файла
325 Недопустимый формат файла ресурсов
327 Не найдено значение данных по имени
328 Недопустимый параметр. Невозможна запись массивов
335 Невозможен доступ к системному реестру
336 Компонент ActiveX неправильно зарегистрирован
337 Компонент ActiveX не найден
338 Компонент ActiveX выполняется неправильно
360 Объект уже загружен
361 Невозможно загрузить или выгрузить данный объект
363 Указанный элемент ActiveX не найден
364 Объект выгружен
365 Невозможна выгрузка в данном контексте
368 Истек срок действия данного файла. Программе требуется файл более новой версии
371 Данный объект не может использоваться в качестве формы-владельца метода Show
380 Недопустимое значение свойства
381 Недопустимый индекс массива свойств
382 Инструкция Property Set не поддерживается во время выполнения
383 Инструкция Property Set не поддерживается (свойство доступно только для чтения)
385 Требуется индекс массива свойств
387 Инструкция Property Set не разрешена
393 Инструкция Property Get не поддерживается во время выполнения
394 Инструкция Property Get не поддерживается (свойство доступно только для записи)
400 Форма уже отображается; модальное отображение невозможно
402 Сначала необходимо закрыть самую верхнюю модальную форму
419 Нет разрешения на использование объекта
422 Свойство не найдено
423 Не найдено свойство или метод
424 Требуется объект
425 Недопустимое использование объекта
429 Невозможно создание объекта или возвращение ссылки на этот объект компонентом ActiveX
430 Класс не поддерживает программирование объектов
432 Не найдено имя файла или класса при программирования объектов
438 Объект не поддерживает это свойство или метод
440 Ошибка программирования объектов
442 Потеряна связь с библиотекой типов или библиотекой объектов для удаленного доступа
443 Программируемый объект не имеет значения по умолчанию
445 Объект не поддерживает эту команду
446 Объект не поддерживает именованные аргументы
447 Объект не поддерживает текущую нацио



0



0 / 0 / 0

Регистрация: 22.10.2009

Сообщений: 50

29.12.2010, 21:08

3

Извиняюсь про Ваши ошибки не учел, их в списке нет.



0



14 / 14 / 2

Регистрация: 23.03.2010

Сообщений: 635

30.12.2010, 13:41

4

Добавлю для полноты
1004 — ошибка, определённая приложением или объектом и переданная в VBA.



0



Понравилась статья? Поделить с друзьями:
  • Список основных функций excel
  • Список основных формул excel
  • Список определенных значений в excel
  • Список обучающихся в excel
  • Список обозначений в excel