Майкрософт визуал базик ошибка

Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:

  • Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы);
  • Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
  • Ошибка приложения Excel возникает при сохранении файла с макросами;

Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен, с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:

excel ошибка макроса

При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения (*.hdmp) обычно можно увидеть подобную информацию исключения (вывод урезан):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

. . .

EXCEPTION_RECORD:  (.exr 1)

ExceptionAddress: 00007ff86a1e05ac (VBE7+0x00000000001405ac)

   ExceptionCode: c0000005 (Access violation)

  ExceptionFlags: 00000000

NumberParameters: 2

   Parameter[0]: 0000000000000001

   Parameter[1]: 0000000000000010

Attempt to write to address 0000000000000010

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_WRITE

PROCESS_NAME:  EXCEL.EXE

ERROR_CODE: (NTSTATUS) 0xc0000005 <Unable to get error code text>

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 <Unable to get error code text>

EXCEPTION_CODE_STR:  c0000005

EXCEPTION_PARAMETER1:  0000000000000001

EXCEPTION_PARAMETER2:  0000000000000010

WRITE_ADDRESS:  0000000000000010

. . .

обычно это NTSTATUS с кодом c0000005 — Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):

. . .

STACK_TEXT:  

000000b9`1acfdd00 000001d3`2fb24e90 : 000001d3`5a0e0ef0 00000000`00000000 : VBE7+0x1405ac

000000b9`1acfdd08 000001d3`24c1fe20 : 00000000`00000000 000001d3`2fda9640 : 0x000001d3`2fb24e90

000000b9`1acfdd10 000001d3`6cf35760 : 000001d3`2fda9640 000001d3`045c9b30 : 0x000001d3`24c1fe20

000000b9`1acfdd18 000001d3`5a0e0ef0 : 000001d3`045c9b30 000001d3`2fcbb2b0 : 0x000001d3`6cf35760

000000b9`1acfdd20 00000000`00000000 : 000001d3`2fcbb2b0 000001d3`2fcbb318 : 0x000001d3`5a0e0ef0

. . .

из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.

НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?

VBA

Так что же такое VBA и для чего он предназначается?

VBA (Visual Basic for Application) — язык макропрограммирования, основанный на языке Visual Basic.

В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin, который располагается внутри *.xslm-файла в директории /xl, представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.

Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.

Решение 1: вставка нового листа

Выполните приведенную последовательность действий:

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → ВставитьЛист.
  4. Сохраняем электронную таблицу. Закрываем Excel.
  5. Открываем проблемный файл заново и включаем макросы.

Решение 2: перекомпиляция проекта

Выполните последовательность действий:

  1. Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
  2. Открываем меню Файл — выбираем Параметры — далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью.
  3. В разделе Параметры макросов — выставляем чекбокс Отключить все макросы с уведомлением.
  4. В разделе Надежные расположения — выставляем чекбокс Отключить все надежные расположения.
  5. В разделе Надежные документы — выставляем чекбокс Отключить надежные документы.
  6. Жмем везде OK. Закрываем Excel.

  7. Открываем [проблемный] .xlsm-файл (файл с макросами).
  8. Не нажимаем кнопку Включить содержимое.
  9. Открывает редактор Visual Basic при помощи комбинации клавиш Alt+F11. Либо можно использовать обходной маневр: в настройках включаем меню Разработчик, после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic.
  10. В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl+S).
  11. Выбираем из меню Debug — выбираем пункт меню Compile VBA Project:

    recompile vba project

  12. Еще раз сохраняем проект кнопкой Сохранить.
  13. Закрываем редактор Visual Basic.

  14. Сохраняем файл Excel через меню Файл — опцию Сохранить (или нажатием на значок дискетки в левом верхнем углу, либо комбинация клавиш Ctrl+S).
  15. Возвращаем все установки безопасности, сделанные на предыдущих шагах (пункты 2-5).
  16. Закрываем xlsm-файл.
  17. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

Решение 3: добавление модуля

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

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Открывает редактор Visual Basic (при помощи комбинации клавиш Alt+F11).
  4. Открываем меню Tools → пункт Options. В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand:

    compile on demand

    Закрываем окно Опции нажатием клавиши OK.

  5. В левом фрейме окна проекта (Project) спускаемся вниз, находим раздел Modules, жмем на нём правую кнопку → пункт InsertModule:

    vba insert module

  6. Далее просто закрываем окно редактора Visual Basic, сохраняем основной xslm-документ и закрываем Excel.
  7. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

Номер

Сообщение

Описание

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 мин. Просмотров 16.6k.

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 с ошибкой, вы можете обновить ошибку и сбросить ее.
  • Вы можете использовать журнал для записи информации о приложении, когда оно запущено.

Make sure you double-check your code as errors can easily creep in.

by Vlad Turiceanu

Passionate about technology, Windows, and everything that has a power button, he spent most of his time developing new skills and learning more about the tech world. Coming… read more


Updated on August 18, 2022

Reviewed by
Radu Tyrsina

Radu Tyrsina

Radu Tyrsina has been a Windows fan ever since he got his first PC, a Pentium III (a monster at that time). For most of the kids of… read more

  • Excel Macro represents a set of commands and actions that are triggered by a VBA code.
  • As handy as it has proven to be, VBA is no stranger to errors especially if you write the code yourself.
  • The VBA error 400 is quite common and usually appears if your Macro fails or crashes whilst it’s running.
  • Don’t worry, we have prepared 3 easy fixes for you to try in order to remove this pesky error for good.

how to resolve VBA error 400

When you have a set of actions that you do constantly, creating a Macro in Excel is crucial.

Once you create it, it runs on its own and delivers great reports. That is if you don’t get any error.

Some users seem to be getting a VBA error 400 when trying to run their Macro in Excel. There are no further indications only a box with an OK button.

How can I solve VBA error 400 in Excel?

Either way, don’t worry we have some simple solutions for you.

We suggest that you follow the steps mentioned in this article in the presented order. Hopefully, they will help you solve your problem.

1. Fix VBA error 400 by moving your Macros to another Module

If you are getting the VBA error 400 in Excel while trying to run your Macros, moving them to a new Module can fix it.

There could be a problem with the old Module, therefore switching to a new one might fix the error.

1. Open Microsoft Excel.

2. We need to create the new Module to transfer your Macros to. Click on the Developer tab from the Ribbon menu.

how to fix vba error 404 developer tab

3. Select Visual Basic from the options.

visual basics how to fix vba error 400

4. In the VBA menu, click Module on the Insert menu.

fix vba error 400 select module

5. Paste the VBA code that you want to use.

6. Navigate to the File menu and click Save Global. Now your Macros are successfully moved to the new Module.

7. Delete the old module.

2. Fix VBA error 400 by turning on the trusted access

how to resolve excel VBA error message
  1. Go to the Developer tab (If this is not available click File > Options > Customise Ribbon > choose the Developer checkbox).
  2. In the  Code group – go to the Developer tab.
  3. Click Macro Security.
  4. Select Developer Macro Settings – choose Trusted access to the VBA project.
Read more about this topic

  • Fix: FileType Selected Not Supported by This App
  • Runtime Error 5: Invalid Procedure Call or Argument [Fix]
  • Runtime Error 32809: How to Quickly Fix it

3. Check your code for mistakes to fix VBA error 400

how to fix VBA error in excel macros

Make sure to always check your code for any mistakes. Additionally, checking for any macros corruption is necessary as well.

That’s about it. We hope that doing these confirmed solutions will fix your VBA 400 Error. In case you have other confirmed suggestions please let us know in a comment below.

Still experiencing issues?

SPONSORED

If the above suggestions have not solved your problem, your computer may experience more severe Windows troubles. We suggest choosing an all-in-one solution like Fortect to fix problems efficiently. After installation, just click the View&Fix button and then press Start Repair.

newsletter icon

Не так давно очередной раз столкнулся с ошибками приложения Excel при попытке включения макросов после открытия файлов .xlsm. Вспомнил, что подобные проблемы преследуют пользователей довольно давно, но чаще всего они наблюдались с Excel 2013 и Excel 2016. Характерные особенности этой группы ошибок следующие:

  • Приложение Excel закрывается при открытии файла с макросами (при включенном режиме безопасности Включить все макросы);
  • Ошибка приложения Excel возникает при попытке включить содержимое (нажатии соответствующей кнопки);
  • Ошибка приложения Excel возникает при сохранении файла с макросами;

Ну и по горячим следам очередного инцидента, дабы не откладывать на потом, решил для себя собрать небольшой хаб по ошибкам приложения Excel с последующей модификацией, дабы опять не терять время на поиск информации в Сети и на составление облака причин.
Суть в том, что в процессе открытия файла xlsm, и при отключенных макросах, в верхней части основного окна (над таблицей), высвечивается строка уведомления: ПРЕДУПРЕЖДЕНИЕ СИСТЕМЫ БЕЗОПАСНОСТИ Запуск макросов отключен, с кнопкой включения содержимого (макросов). Как только пользователь её нажимает, Excel попросту аварийно завершается (падает) с ошибкой Программа Microsoft Excel не работает и характерным окном уведомления:

excel ошибка макроса

При этом было замечено, что непосредственно перед возникновением ошибки приложения Excel никаких системных обновлений и обновлений пакета Office не устанавливалось. Возможно, каким-то образом задействованы последние обновления на Office, но прямой связи я не заметил, а подробного исследования проблемы не проводил. При этом зависимости от версии операционной системы (мною лично сбои наблюдались на Windows 10 LTSC и Windows 7 Professional) так же выявлено не было. При анализе аварийного дампа приложения (*.hdmp) обычно можно увидеть подобную информацию исключения (вывод урезан):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

. . .

EXCEPTION_RECORD:  (.exr 1)

ExceptionAddress: 00007ff86a1e05ac (VBE7+0x00000000001405ac)

   ExceptionCode: c0000005 (Access violation)

  ExceptionFlags: 00000000

NumberParameters: 2

   Parameter[0]: 0000000000000001

   Parameter[1]: 0000000000000010

Attempt to write to address 0000000000000010

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_WRITE

PROCESS_NAME:  EXCEL.EXE

ERROR_CODE: (NTSTATUS) 0xc0000005 <Unable to get error code text>

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 <Unable to get error code text>

EXCEPTION_CODE_STR:  c0000005

EXCEPTION_PARAMETER1:  0000000000000001

EXCEPTION_PARAMETER2:  0000000000000010

WRITE_ADDRESS:  0000000000000010

. . .

обычно это NTSTATUS с кодом c0000005 — Access violation, доступ запрещен. И чаще всего в дампе можно увидеть такой вот стек потока (вывод оптимизирован для улучшения представления):

. . .

STACK_TEXT:  

000000b9`1acfdd00 000001d3`2fb24e90 : 000001d3`5a0e0ef0 00000000`00000000 : VBE7+0x1405ac

000000b9`1acfdd08 000001d3`24c1fe20 : 00000000`00000000 000001d3`2fda9640 : 0x000001d3`2fb24e90

000000b9`1acfdd10 000001d3`6cf35760 : 000001d3`2fda9640 000001d3`045c9b30 : 0x000001d3`24c1fe20

000000b9`1acfdd18 000001d3`5a0e0ef0 : 000001d3`045c9b30 000001d3`2fcbb2b0 : 0x000001d3`6cf35760

000000b9`1acfdd20 00000000`00000000 : 000001d3`2fcbb2b0 000001d3`2fcbb318 : 0x000001d3`5a0e0ef0

. . .

из которого единственное что понятно, так это то, что падение Excel происходит в недрах функций библиотеки vbe7.dll (среда исполнения VBA), подгруженной в адресное пространство процесса. Это указывает на проблемы с обработчиком VBA-скриптов, в контексте Excel чаще именуемых макросами.

НЕРЕШЕННОЕ: при отладке приложений из комплекта MS Office, вы не увидите имен функций в стеке вызовов, поскольку отсутствуют отладочные символы как к основным исполняемым файлам (Excel/Word/Outlook), так и к многочисленным библиотекам. Интересно, есть ли какое-либо решение?

VBA

Так что же такое VBA и для чего он предназначается?

VBA (Visual Basic for Application) — язык макропрограммирования, основанный на языке Visual Basic.

В приложениях, входящих в комплект MS Office, таких как Excel, Word, PowerPoint и Access, VBA используется для автоматизации множества рутинных задач (напр.: повторяющихся однотипных действий), позволяет создавать формы для общения с пользователем и предлагает множество иного богатого функционала. При помощи VBA доступно управление электронной таблицей посредством объектно-ориентированной модели кода/данных, при помощи VBA-кода входные данные таблиц могут быть обработаны и представлены в итоговых (результирующих) таблицах и диаграммах (графиках). Таблица становится интерфейсом кода, позволяя легко работать, изменять его и управлять расчётами. На выходе VBA проект, используемый в структурах описанных выше приложений (электронные таблицы Excel, презентации PowerPoint, базы Access), компилируется в специальный бинарный исполняемый файл, который размещается внутри файла основного формата. Применительно к Excel это файл vbaProject.bin, который располагается внутри *.xslm-файла в директории /xl, представляющий собой бинарный исполняемый файл проекта, содержащий макрос в откомпилированном (готовом к исполнению) виде.

Наиболее вероятной причиной сбоя является повреждение блока кода VBA, содержащегося в книге Excel. Об истоках этого остается только догадываться, возможно что в структуре .xlsm-файла, в процессе работы с документом, происходят какие-то [непредвиденные разработчиками] изменения, способные приводить блок кода в неработоспособное состояние.

Решение 1: вставка нового листа

Выполните приведенную последовательность действий:

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Добавляем в книгу Excel новый лист: правая кнопка мыши на ярлыках Лист1/Лист2/Лист3 → ВставитьЛист.
  4. Сохраняем электронную таблицу. Закрываем Excel.
  5. Открываем проблемный файл заново и включаем макросы.

Решение 2: перекомпиляция проекта

Выполните последовательность действий:

  1. Запускаем и открываем новую книгу Excel (не ваш проблемный файл).
  2. Открываем меню Файл — выбираем Параметры — далее открываем Центр управления безопасностью и заходим в Параметры центра управления безопасностью.
  3. В разделе Параметры макросов — выставляем чекбокс Отключить все макросы с уведомлением.
  4. В разделе Надежные расположения — выставляем чекбокс Отключить все надежные расположения.
  5. В разделе Надежные документы — выставляем чекбокс Отключить надежные документы.
  6. Жмем везде OK. Закрываем Excel.

  7. Открываем [проблемный] .xlsm-файл (файл с макросами).
  8. Не нажимаем кнопку Включить содержимое.
  9. Открывает редактор Visual Basic при помощи комбинации клавиш Alt+F11. Либо можно использовать обходной маневр: в настройках включаем меню Разработчик, после этого в появившемся сверху в ленте меню Разработчик выбираем пункт Visual Basic.
  10. В открывшемся окне редактора Visual Basic (VBA редактор) пересохраняем проект: для этого жмем на панели инструментов кнопку Сохранить (изображение дискетки или комбинация Ctrl+S).
  11. Выбираем из меню Debug — выбираем пункт меню Compile VBA Project:

    recompile vba project

  12. Еще раз сохраняем проект кнопкой Сохранить.
  13. Закрываем редактор Visual Basic.

  14. Сохраняем файл Excel через меню Файл — опцию Сохранить (или нажатием на значок дискетки в левом верхнем углу, либо комбинация клавиш Ctrl+S).
  15. Возвращаем все установки безопасности, сделанные на предыдущих шагах (пункты 2-5).
  16. Закрываем xlsm-файл.
  17. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

Решение 3: добавление модуля

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

  1. Открываем [проблемный] .xlsm-файл (файл с макросами).
  2. Не нажимаем кнопку Включить содержимое.
  3. Открывает редактор Visual Basic (при помощи комбинации клавиш Alt+F11).
  4. Открываем меню Tools → пункт Options. В открывшемся окне переходим на вкладку General и деактивируем чекбокс Compile on Demand:

    compile on demand

    Закрываем окно Опции нажатием клавиши OK.

  5. В левом фрейме окна проекта (Project) спускаемся вниз, находим раздел Modules, жмем на нём правую кнопку → пункт InsertModule:

    vba insert module

  6. Далее просто закрываем окно редактора Visual Basic, сохраняем основной xslm-документ и закрываем Excel.
  7. Заново открываем [проблемный] файл, в верхней части, в строке статуса — включаем макросы посредством кнопки Включить содержимое.

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

  • Ошибки компиляции
  • Ошибки выполнения
  • Логические ошибки (баги)

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

Содержание

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

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

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

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

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

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

Ошибки в Excel VBA

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

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

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

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

Ошибки в Excel VBA

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

Ошибки в Excel 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, в котором происходит обработка ошибки. После выполнения кода обработки ошибки, работа программы может быть продолжена с того места, где возникла ошибка, или макрос может быть остановлен полностью. Далее это показано на примере.

'Процедура Sub присваивает переменным Val1 и Val2 значения,
'хранящиеся в ячейках A1 и B1 рабочей книги Data.xlsx расположенной в каталоге C:Documents and Settings

Sub Set_Values(Val1 As Double, Val2 As Double)

   Dim DataWorkbook As Workbook

   On Error GoTo ErrorHandling

      'Открываем рабочую книгу с данными

      Set DataWorkbook = Workbooks.Open("C:Documents and SettingsData")

      'Присваиваем переменным Val1 и Val2 данные из рабочей книги DataWorkbook

      Val1 = Sheets("Лист1").Cells(1, 1)
      Val2 = Sheets("Лист1").Cells(1, 2)

      DataWorkbook.Close

   Exit Sub

ErrorHandling:

   'Если файл не найден, предлагаем пользователю разместить его в
   'нужном месте и продолжить работу

   MsgBox "Рабочая книга не найдена! " & _
      "Пожалуйста добавьте книгу Data.xlsx в каталог C:Documents and Settings и нажмите OK."

   Resume

End Sub

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

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

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

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

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

Оцените качество статьи. Нам важно ваше мнение:

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

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

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

Типы ошибок

Существуют три типа ошибок в программе:

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

Инструкция On Error

Ошибки времени выполнения можно перехватывать внутри подпрограммы. Для этого используется инструкция On Error, которая имеет три формата:

  • On Error GoTo <Метка> — при возникновении ошибки управление передается инструкции, помеченной меткой <Метка>. Метка должна быть допустимым идентификатором, к которому предъявляются такие же требования как и к переменным. Внутри подпрограммы метка указывается в самом начале помечаемой строки и после метки ставится двоеточие. В качестве примера создадим функцию для деления двух целых чисел. Внутри функции предусмотрим обработку ошибки деления на 0:
Function Деление(x As Integer, y As Integer) As Double
   On Error GoTo ПриОшибке
   Деление = x / y
   Exit Function
ПриОшибке:
   Деление = 0
End Function

Если при вызове функции во втором параметре передать значение 0, то управление будет передано в строку, помеченную с помощью метки ПриОшибке. Обратите внимание на то, что метка расположена после инструкции Exit Function. В этом случае код после инструкции Exit Function будет выполнен только в том случае, если возникнет ошибка;

  • On Error Resume Next — при возникновении ошибки управление передается следующей инструкции;
  • On Error GoTo 0 — отключает перехват ошибок.

Если внутри подпрограммы не предусмотрен перехват ошибки, то при возникновении ошибки работа программы прерывается и выводится стандартное окно с описанием и несколькими кнопками: Continue (продолжить), End (завершить выполнение программы), Debug (перейти в режим отладки) и Help (вывод справки).

Инструкция Resume

Инструкция Resume позволяет указать куда следует переходить после обработки ошибки. Инструкция имеет несколько форматов:

  • Resume [0] — управление передается инструкции, вызвавшей ошибку;
  • Resume Next — управление передается инструкции, следующей за инструкцией, вызвавшей ошибку;
  • Resume <Метка> — управление передается инструкции, помеченной меткой <Метка>.

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

Получение информации об ошибке и генерация ошибки

Вся информация о последней ошибке доступна через объект Err. Объект содержит следующие свойства:

  • Number — код ошибки, например, код 11 для ошибки деления на 0. Если ошибки не произошло, то свойство содержит значение 0;
  • Description — описание ошибки, например, строка "Division by zero" для ошибки деления на 0. Пример вывода кода и описания ошибки:
Debug.Print Err.Number; Err.Description
  • Source — название текущего проекта;
  • HelpFile — путь к файлу справки;
  • HelpContext — идентификатор раздела в справочном файле;
  • LastDLLError — системный код ошибки при работе с DLL.

Объект Err содержит следующие методы:

  • Clear() — очищает всю информацию о последней ошибке. Этот метод следует вызвать после успешной обработки ошибки. Информация об ошибке автоматически очищается при выходе из подпрограммы и ряде других случаев;
  • Raise() — позволяет сгенерировать ошибку в программе. Формат метода:
Raise Number[, Source][, Description][, HelpFile][, HelpContext]

В параметре Number указывается код генерируемой ошибки (целое число от 0 до 65 535). Коды от 0 до 512 зарезервированы под системные ошибки, а остальные коды можно использовать под пользовательские ошибки. Чтобы сгенерировать ошибку с пользовательским кодом необходимо сложить код с константой vbObjectError. Остальные параметры являются необязательными и полностью аналогичны одноименным свойствам объекта Err. Пример генерации и обработки пользовательской ошибки:

Sub ГенерацияОшибки()
   On Error GoTo ПриОшибке
   Err.Raise vbObjectError + 513
   Exit Sub
ПриОшибке:
   Debug.Print Err.Number; Err.Description
   ' -2147220991 Automation error
End Sub

Способы поиска ошибок в программе

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

Первое, на что следует обратить внимание, — на объявления переменных. Например, рассмотрим простой пример:

Как вы думаете, какое значение отобразится в окне Immediate после выполнения этого кода? Думаете, что число 10? Не факт! Вот тут-то и кроется проблема не видная на первый взгляд. В первой инструкции присваивается значение переменной x, имя которой набрано на английской раскладке клавиатуры, а вот во второй инструкции выводится значение переменной x, имя которой набрано на русской раскладке клавиатуры. В результате значение присваивается одной переменной, а выводится значение другой переменной. Такие ситуации очень часто встречаются в программах на языке VBA, так как объявлять переменную не обязательно. Чтобы избежать такой ситуации следует обязательно объявлять переменные явным образом. Контроль за соблюдением этого правила можно возложить на компилятор, добавив в начале модуля следующую инструкцию:

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

Option Explicit
...
Dim x As Integer
x = 10
Debug.Print x ' 10

Далее следует обратить внимание на форматирование кода. Начинающие программисты обычно не обращают на это никакого внимания, считая этот процесс лишним. А на самом деле зря! Компилятору абсолютно все равно, разместите вы все инструкции на одной строке или выполните форматирование кода. Однако, при поиске ошибок форматирование кода позволит найти ошибку гораздо быстрее.

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

Dim Массив As Variant, i As Integer, j As Integer
Массив = Array(Array(0, 1), Array(2, 3), Array(4, 5))
For i = 0 To 2
   For j = 0 To 1
      Debug.Print Массив(i)(j)
   Next
Next

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

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

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

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

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

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

Проверить значение константы позволяет следующая конструкция:

#If MY_DEBUG Then
   ' Здесь размещаем инструкции вывода значений
#End If

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

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

Прежде чем начать отладку необходимо пометить строки внутри программы с помощью точек останова. Для добавления точки останова делаем строку активной, а затем из меню Debug выбираем пункт Toggle Breakpoint. Слева от строки появится кружок, обозначающий точку останова. Добавить точку останова можно еще быстрее. Для этого достаточно щелкнуть слева от строки левой кнопкой мыши. Повторный щелчок позволяет удалить точку останова. Кроме того, для добавления или удаления точки отстанова можно воспользоваться клавишей <F9>. Чтобы удалить все точки останова следует из меню View выбрать пункт Clear All Breakpoints.

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

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

При отладке можно контролировать значения отдельных переменных, а не всех сразу. Для этого следует выделить название переменной и из меню Debug выбрать пункт Add Watch. Можно также выделить название переменной и из контектного меню выбрать пункт Add Watch. В открывшемся окне устанавливаем флажок Watch Expression и нажимаем кнопку OK. Значение переменной будет отображаться в окне Watches. Чтобы отобразить окно Watches из меню View выбираем пункт Watch Window. Чтобы отменить отслеживание нужно выделить строку в окне Watches и нажать клавишу <Delete>.

Для пошагового выполнения программы предназначены следующие пункты в меню Debug или соответствующие кнопки на панели инструментов Debug (View | Toolbars | Debug):

  • Step Into (клавиша <F8>) — выполняет переход к следующей инструкции;
  • Step Over — выполняет одну инструкцию. Если в этой инструкции производится вызов подпрограммы, то подпрограмма выполняется за один шаг и отладчик переходит в режим ожидания после выхода из подпрограммы;
  • Step Out — при заходе в подпрограмму этот пункт позволяет выполнить подпрограмму за один шаг и выйти из нее. Отладчик переходит в режим прерывания после выхода из подпрограммы;
  • Run To Cursor — выполняет переход к инструкции, в которой расположен курсор.

Если необходимо посмотреть последовательность вызова подпрограмм, то следует открыть окно Call Stack, выбрав в меню View пункт Call Stack.

Подача звукового сигнала

При возникновении ошибки или при неправильном вводе данных имеет смысл привлечь внимание пользователя звуковым сигналом. Сгенерировать звуковой сигнал позволяет инструкция Beep. Пример:

Dim Результат
Beep
Результат = InputBox("Необходимо ввести значение")

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

№ На английском языке На русском языке 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 Деление на 0 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 ftill Переполнение диска 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 of Null Недопустимое использование Null 260 No timer available Ни один таймер недоступен 282 No foreign application responded to a DDE initiate Ни одно внешнее приложение не ответило на инициативу DDE 285 Foreign application won’t perform DDE method or operation Внешнее приложение не может выполнить метод или операцию DDE 286 Timeout while waiting for DDE response Простой при ожидании ответа DDE 287 User pressed Escape key during DDE ope ratio Во время операции DDE пользователь нажал клавишу [Esc] 288 Destination is busy Адресат занят 290 Data in wrong format Неправильный формат данных 293 DDE Method invoked with no channel open Метод DDE вызван без открытого канала 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 ‘dll’ could not be loaded Системная DLL не может быть загружена 320 Can’t use character device names in specified file names Нельзя использовать имя устройства в определении имени файла 321 Invalid file format Недопустимый формат файла 325 Invalid format in resource file Недопустимый формат файла ресурсов 326 Resource with identifier ‘item’ not found Ресурс с идентификатором ‘имя’ не найден 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 Невозможно загрузить или выгрузить данный объект 362 Can’t unload controls created at design time Нельзя выгрузить элементы управления 363 ActiveX control specified not found Элемент управления ActiveX не найден 364 Object was unloaded Объект был выгружен 365 Unable to unload within this context Нет возможности в данном контексте произвести выгрузку 366 No MDI form available to load Форма, не определенная как MDI, не может быть загружена 380 Invalid property value Недопустимое значение свойства 381 Invalid property-array index Недопустимый индекс массива свойств 382 Property Set can’t be executed at : time Инструкция Property Set не может использоваться во время выполнения 383 Property Set can’t be used with a read-only property Инструкция Property Set не поддерживается (свойство доступно только для чтения) 384 A form can’t be moved or sized while minimized or maximized Если форма максимизирована или минимизирована, ее нельзя переместить или изменить ее размер 385 Need property-array index Для массива свойств надо указать индекс 387 Property Set not permitted Применение Property Set не разрешено 388 Can’t set Visible property from a parent menu Для команды подменю нельзя установить свойство Visible из программного кода, относящегося к обработке команд родительского меню 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 не поддерживается (свойство доступно только для записи) 395 Cannot use separator bar as menu name for this Разделительная линия не может использоваться как имя команды меню 396 ‘Item’ property cannot be set within a page Свойство ‘имя’ нельзя установить для страницы (объект Printer) 397 Can’t load, unload, or set Visible property for top level menus while they are merged Свойство Visible нельзя устанавливать пока элемент управления типа меню находится в контейнере формы 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 MDI forms cannot be shown modally MDI-формы не могут быть отображены как модальные 404 MDI child forms cannot be shown modally Дочерние MDI-формы формы не мо- гут быть отображены модальными 419 Permission to use object denied Использование объекта запрещено 423 Property or method not found Свойство или метод не найдены 424 Object required Требуется объект 426 Only one MDI Form allowed Допустима только одна форма MDI 427 «Invalid object type; Menu control required» «Недопустимый тип объекта; требуется элемент управления типа «»меню» 428 Popup menu must have at least one submenu Всплывающее меню должно иметь хотя бы один элемент 429 ActiveX component can’t create object or return reference to this object Невозможно создание объекта или возвращение ссылки на этот объект компонентом ActiveX 430 Class doesn’t support Automation Класс не поддерживает программирование объектов 432 File name or class name not found during Automation operation Не найдено имя файла или класса при программировании объектов 438 Object doesn’t support this property or method Объект не поддерживает это свойство или метод 440 Automation error Ошибка программирования объектов 443 Automation object doesn’t have a default value Программируемый объект не имеет значения по умолчанию 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 Named argument not found Именованный аргумент не найден 449 Argument not optional Аргумент обязателен 450 Wrong number of arguments Неправильное количество аргументов 451 Object not a collection Объект не является коллекцией 452 Invalid ordinal Недопустимый порядковый номер 453 Specified DLL function not found Указанная функция DLL не найдена 457 This key is already associated with an element of this collection Запись уже связана с элементом данной коллекции 460 Invalid Clipboard format Недопустимый формат буфера обмена 461 Specified format doesn’t match format of data Указанный формат не соответствует формату данных 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 Недопустимый тип рисунка 520 Can’t empty Clipboard Нельзя очистить буфер обмена 521 Can’t open Clipboard Нельзя открыть буфер обмена 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 Неизвестное имя функции 2426 Function isn’t available in expressions Функция недоступна в выражениях 2427 Object has no value Объект не имеет значения 2428 Invalid arguments used with domain function Недопустимые аргументы статистической функции по подмножеству 2429 In operator without () Оператор In требует наличия скобок: () 2430 Between operator without And За оператором Between отсутствует оператор And 2431 Syntax error (missing operator) Ошибка синтаксиса (отсутствует оператор) 2432 Syntax error (comma) Ошибка синтаксиса (запятая) 2433 Syntax error Ошибка синтаксиса 2434 Syntax error (missing operator) Ошибка синтаксиса (отсутствует оператор) 2435 Extra ) Непарная правая скобка: ) 2436 Missing ), ], or Item Отсутствует ), ] или элемент 2437 Invalid use of vertical bars Недопустимое использование символов вертикальной черты 2438 Syntax error Ошибка синтаксиса 2439 Wrong number of arguments used with function Неверное число аргументов функции 2440 IIF function without () Требуются скобки после функции IIF:() 2442 Invalid use of parentheses Недопустимое использование скобок 2443 Invalid use of Is operator Недопустимое использование оператора Is 2445 Expression too complex Слишком сложное выражение 2446 Out of memory during calculation Недостаточно памяти при вычислениях 2447 Invalid use of’.’, ‘!’, or ‘()’ Недопустимое использование ‘.’, ‘!’ или ‘()’ 2448 Can’t set value Не удается задать значение 3000 «Reserved error <Item>;» Зарезервированная ошибка элемента 3001 Invalid argument Ошибочный аргумент 3002 Couldn’t start session Запуск сеанса невозможен 3003 «Couldn’t start transaction;» Транзакция не может быть запущена 3005 < Database name> isn’t a valid database name Имя базы данных не является допустимым именем базы данных 3006 Database <name> is exclusively locked Для базы данных <name> установлен монопольный доступ 3007 Can’t open library database <name> Не удается открыть библиотечную базу данных <name> 3008 The table <name> is already opened exclusively by another user, or it is already open through the user interface and cannot be manipulated program Таблица <name> уже открыта другим пользователем для монопольного доступа или открыта в интерактивном режиме и не может быть изменена в программе 3009 You tried to lock a table while opening it, but the table can’t be locked because it is currently in use. Wait a moment, and then try the operation again «Не удается блокировать таблицу<name> при открытии; она в данное время используется. Подождите немного и повторите операцию» 3010 Table <name> already exists Таблица <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> уже существует 3013 Couldn’t rename installable ISAM file Не удается переименовать файл устанавливаемого драйвера ISAM 3014 Can’t open any more tables Открытие большего числа таблиц невозможно 3015 <Index name > isn’t an index in this table. Look in the Indexes collection of the TableDef object to determine the valid index names <Index name > не является индексом данной таблицы. Для определения допустимых имен индексов просмотрите семейство Indexes объекта TableDef 3016 Field won’t fit in record Поле не помещается в записи 3017 The size of a field is too long Слишком большая длина поля 3018 Couldn’t find field <name> Не удается найти поле <name> 3019 Operation invalid without a current index Недопустимая операция без текущего индекса 3020 Update or CancelUpdate without Попытка вызвать метод Update или 3021 No current record Текущая запись отсутствует 3022 The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index Изменения не были успешно завершены из-за повторяющихся значений в индексе, ключевых полях или связях. Измените, данные в поле или полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения 3023 AddNew or Edit already used Методы AddNew или Edit уже используются 3024 Couldn’t find file <name> Не удается найти файл <name> 3025 Can’t open any more files Открытие дополнительных файлов невозможно 3026 Not enough space on disk Недостаточно места на диске 3027 Can’t update. Database or object is read-only Обновление невозможно. База данных или объект доступны только для чтения 3028 Can’t start your application. The workgroup information file is missing or opened exclusively by another user Не удается запустить приложение. Системная база данных отсутствует или открыта с монопольным доступом другим пользователем 3029 Not a valid account name or password Недопустимое имя учетной записи или пароль 3030 <Account name> isn’t a valid account name <Account name> не является допустимым именем учетной записи 3031 Not a valid password Неверный пароль 3032 Can’t perform this operation Невозможно выполнение данной операции. 3033 You don’t have the necessary permissions to use the <name> object. Have your system administrator or the person who created this object establish the appropriate permissions for you Отсутствуют разрешения на использование объекта <name>. Необходимые разрешения должны быть предоставлены системным администратором или пользователем, создавшим объект 3034 You tried to commit or roll back a transaction without first using Begin- Trans Попытка занесения или свертывания транзакции без предварительного вызова BeginTrans 3036 Database has reached maximum size Достигнут максимальный размер базы данных 3037 Can’t open any more tables or queries Открытие дополнительных таблиц или запросов невозможно 3039 «Couldn’t create index; too many indexes already defined» «Не удается создать индекс; уже определено слишком много индексов» 3040 Disk I/O error during read Ошибка ввода/вывода при чтении диска 3041 Can’t open a database created with a previous version of your application Не удается открыть базу данных, созданную в предыдущей версии приложения 3042 Out of MS-DOS file handles Не хватает дескрипторов файлов MS-DOS 3043 Disk or network error Дисковая или сетевая ошибка 3044 <Path> isn’t a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides Строка <Path> задает ошибочный путь. Проверьте, что путь задан правильно и имеется подключение к серверу, на котором находятся файлы 3045 «Couldn’t use <name>; file already in use» «Невозможно использовать <name>; файл уже используется» 3046 «Couldn’t save; currently locked by another user» «Сохранение невозможно; блокировка другим пользователем» 3047 Record is too large Слишком большая длина записи 3048 Can’t open any more databases Открытие дополнительных баз данных невозможно 3049 Can’t open database <name>. It may not be a database that your application recognizes, or the file may be corrupt Открытие базы данных <name> невозможно. Вероятно, это не база данных приложения пользователя, или ее файл поврежден 3051 The Microsoft Jet database engine cannot open the file <name>. It is already opened exclusively by another user, or you need permission to view its data Файл <name> не может быть открыт ядром базы данных Microsoft Jet. Файл уже открыт другим пользователем для монопольного доступа или требуется разрешение на просмотр данных 3052 MS-DOS file sharing lock count exceeded. You need to increase the number of locks installed with SHARE.EXE Достигнуто максимальное число блокировок файлов общего доступа MS- DOS. Необходимо увеличить число блокировок, установленных при запуске файла SHARE.EXE 3053 Too many client tasks Запущено слишком много задач- клиентов 3054 Too many Memo or OLE Object fields Слишком много полей Memo или объектов ActiveX 3055 Not a valid file name Недопустимое имя файла 3056 Couldn’t repair this database Не удается восстановить эту базу данных 3057 Operation not supported on linked tables Невозможно выполнение данной операции для присоединенных или связанных таблиц 3058 Index or primary key can’t contain a Null value Индекс или ключ не может содержать пустое значение (Null) 3059 Operation canceled by user Операция прервана пользователем 3060 Wrong data type for parameter<parameter> Недопустимый тип данных для параметра <parameter> 3061 Too few parameters. Expected <number> Слишком мало параметров. Требуется <number> 3062 Duplicate output alias <name> Повторение выходного псевдонима<name> 3063 Duplicate output destination <name> Повторение получателя <name> 3064 Can’t open action query <name> Не удается открыть запрос на изменение <name> 3065 Can’t execute a select query Невозможен запуск запроса на выборку 3066 Query must have at least one destination field Запрос должен иметь хотя бы одно поле для вывода 3067 Query input must contain at least one table or query В качестве входных данных запрос должен иметь хотя бы одну таблицу или запрос 3068 Not a valid alias name Недопустимое имя псевдонима 3069 The action query <name> cannot be used as a row source Не допускается применение запроса на изменение <name> в качестве источника строк 3070 The Microsoft Jet database engine does not recognize <name> as a valid field name or expression <name> не распознается ядром базы данных Microsoft Jet как допустимое имя поля или выражение 3071 This expression is typed incorrectly, or it is too complex to be evaluated. For example, a numeric expression may contain too many complicated elements. Try simplifying the expression by assigning parts of the expression to variables Выражение неверно введено или является слишком сложным для расчета. Например, числовое выражение может содержать слишком много элементов. Попытайтесь упростить выражение, определив его части как переменные 3073 Operation must use an updatable query В операции должен использоваться обновляемый запрос 3074 Can’t repeat table name <name> in FROM clause Невозможно повторение имени таблицы <name> в предложении FROM 3075 <Message> in query expression<expression> <Message> в выражении запроса<expression> 3076 <Name> in criteria expression <Name> в выражении для условия отбора 3077 <Message> in expression <Message> в выражении 3078 The Microsoft Jet database engine cannot find the input table or query<name>. Make sure it exists and that its name is spelled correctly Ядро базы данных Microsoft Jet не может найти входную таблицу или запрос <name>. Проверьте существование таблицы или запроса и правильность имени 3079 The specified field reference could refer to more than one table listed in the FROM clause of your SQL statement Ссылка на поле <пате> может относиться к полям нескольких таблиц, перечисленных в предложении FROM инструкции SQL 3080 Joined table <name> not listed in FROM clause Связанная таблица <name> отсутствует в предложении FROM 3081 Can’t join more than one table with the same name <name> Объединение не может содержать несколько таблиц с одинаковым именем <name> 3082 JOIN operation <operation> refers to a field that isn’t in one of the joined tables Операция JOIN <operation> содержит ссылку на несвязанную таблицу 3083 Can’t use internal report query Невозможно использование внутреннего запроса отчета 3084 Can’t insert data with action query Невозможно добавление данных с помощью запроса на изменение 3085 Undefined function <name> in expression Неопределенная функция <name> в выражении 3086 Couldn’t delete from specified tables Невозможно удаление записей из указанных таблиц 3087 Too many expressions in GROUP BY clause Слишком много выражений в предложении GROUP BY 3088 Too many expressions in ORDER BY clause Слишком много выражении в предложении ORDER BY 3089 Too many expressions in DISTINCT output Слишком много выражении в предложении DISTINCT 3090 Resultant table not allowed to have more than one AutoNumber field Результирующая таблица не должна иметь более одного поля счетчика 3092 Can’t use HAVING clause in TRANSFORM statement Нельзя использовать предложение HAVING в инструкции TRANS- FORM 3093 ORDER BY clause <clause> conflicts with DISTINCT Предложение ORDER BY <clause> конфликтует с DISTINCT 3094 ORDER BY clause <clause> conflicts with GROUP BY clause Предложение ORDER BY <clause> конфликтует с предложением GROUP BY 3095 Can’t have aggregate function in expression <expression> Невозможно использование статистической функции в выражении<expression> 3096 Can’t have aggregate function in WHERE clause <clause> Невозможно использование статистической функции в предложении WHERE <clause> 3097 Can’t have aggregate function in ORDER BY clause <clause> Невозможно использование статистической функции в предложении ORDER BY <clause> 3098 Can’t have aggregate function in GROUP BY clause <clause> Невозможно использование статистической функции в предложении GROUP BY <clause> 3099 Can’t have aggregate function in JOIN operation <operation> Невозможно использование статистической функции в операции JOIN <operation> 3100 Can’t set field <name> in join key to Null Для поля ключа связи <name> невозможно задание значения Null 3101 The Microsoft Jet database engine can’t find a record in the table <name> with key matching field(s) <name> В таблице <name> ядром базы данных Microsoft Jet не найдены записи с совпадающим ключевым полем<name> 3102 Circular reference caused by <query reference> Циклическая ссылка, связанная с<query reference> 3103 Circular reference caused by alias<name> in query definition’s SELECT list Псевдоним <name> из списка определений SELECT запроса привел к возникновению циклической ссылки 3104 Can’t specify fixed column heading<value> in a crosstab query more than once Невозможно более одного раза задать заголовок столбца <value> перекрестного запроса 3105 Missing destination field name in SELECT INTO statement <statement> В инструкции SELECT INTO <statement> пропущено имя результирующего поля 3106 Missing destination field name in UPDATE statement <statement> В инструкции UPDATE <statement пропущено имя результирующего поля 3107 «Record(s) can’t be added; no insert permission on <name>» «Записи не могут быть добавлены; отсутствует разрешение на вставку данных для объекта <name>» 3108 «Record(s) can’t be edited; no update permission on <name>» «Записи не могут быть изменены; отсутствует разрешение на обновление данных для объекта <name>» 3109 «Record(s) can’t be deleted; no delete permission on <name>» «Записи не могут быть удалены; отсутствует разрешение на удаление данных для объекта <name>» 3110 «Couldn’t read definitions; no read definitions permission for table or query<name>» «Не удается прочитать описания; отсутствует разрешение на чтение описания для объекта <name>» 3111 «Couldn’t create; no modify design permission for table or query <name>» «Создание невозможно; отсутствует разрешение на изменение макета для таблицы или запроса <name>» 3112 «Record(s) can’t be read; no read permission on <name>» «Записи не могут быть прочитаны; отсутствует разрешение на чтение данных для <name>» 3113 «Can’t update <field name>; field not updatable» «Невозможно обновить поле <field name>; не обновляемое поле» 3114 Can’t include Memo or OLE Object when you select unique values <statement> При отборе уникальных значений в<statement> нельзя использовать поле Memo или объекта ActiveX 3115 Can’t have Memo or OLE Object fields in aggregate aigument <statement> Поле Memo или объекта ActiveX не может присутствовать в аргументе статистической функции в <statement> 3116 Can’t have Memo or OLE Object fields in criteria <criteria> for aggregate function Поле Memo или объекта ActiveX не может присутствовать в условии отбора <criteria> для статистической функции 3117 Can’t sort on Memo or OLE Object<clause> Невозможна сортировка по полю Memo или объекта ActiveX в <clause> 3118 Can’t join on Memo or OLE Object<name> Невозможно объединение с полем Memo или объекта ActiveX <name> 3119 Can’t group on Memo or OLE Object<clause> Невозможна группировка по полю Memo или объекта ActiveX в <clause> 3120 Can’t group on fields selected with ‘*’»table name» Невозможна группировка по полям, выбранным с помощью символа ‘*'<table name> 3121 Can’t group on fields selected with ‘*’ Невозможна группировка по полям, выбранным с помощью символа ‘*’ 3122 You tried to execute a query that doesn’t include the specified expression <name> as part of an aggregate function Попытка выполнить запрос, который не включает указанное выражение <name> как часть статистической функции или группы 3123 Can’t use ‘*’ in crosstab query Невозможно использование символа ‘*’ в перекрестном запросе 3124 Can’t input from internal report query<name> Невозможен ввод из внутреннего запроса отчета <name> 3125 The database engine can’t find <name>. Make sure it is a valid parameter or alias name, that it doesn’t include invalid characters or punctuation, and that the name isn’t too long <Name> не найдено ядром базы данных. Проверьте, что оно представляет допустимый параметр или псевдоним, не содержит недопустимые символы или знаки препинания, а также не является слишком длинным 3126 Invalid bracketing of name <name> Недопустимое использование скобок с именем <name> 3127 The INSERT INTO statement contains the following unknown field name: <field name>. Make sure you’ve typed the name correctly, and try the ope- ration again Инструкция INSERT INTO содержит неизвестное имя <field name>. Проверьте, что имя задано без ошибок, и повторите операцию 3128 Specify the table containing the records you want to delete Необходимо указать таблицу, содержащую удаляемые записи 3129 «Invalid SQL statement; expected DE- LETE, INSERT, PROCEDURE, SE- LECT, or UPDATE» «Ошибочная инструкция SQL; предполагалось DELETE, INSERT, PRO- CEDURE, SELECT или UPDATE» 3130 Syntax error in DELETE statement Ошибка синтаксиса в инструкции DELETE 3131 Syntax error in FROM clause Ошибка синтаксиса в предложении FROM 3132 Syntax error in GROUP BY clause Ошибка синтаксиса в предложении GROUP BY 3133 Syntax error in HAVING clause Ошибка синтаксиса в предложении HAVING 3134 Syntax error in INSERT INTO statement Ошибка синтаксиса в инструкции INSERT INTO 3135 Syntax error in JOIN operation Ошибка синтаксиса в операции JOIN 3136 The LEVEL clause includes a reserved word or argument that is misspelled or missing, or the punctuation is incorrect Ошибочное или пропущенное зарезервированное слово или аргумент в предложении LEVEL или неверная пунктуация 3138 Syntax error in ORDER BY clause Ошибка синтаксиса в предложении ORDER BY 3139 Syntax error in PARAMETER clause Ошибка синтаксиса в предложении PARAMETER 3140 Syntax error in PROCEDURE clause Ошибка синтаксиса в предложении PROCEDURE 3141 The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect Ошибочное или пропущенное зарезервированное слово или аргумент в инструкции SELECT или неверная пунктуация 3143 Syntax error in TRANSFORM statement Ошибка синтаксиса в инструкции TRANSFORM 3144 Syntax error in UPDATE statement Ошибка синтаксиса в инструкции UPDATE 3145 Syntax error in WHERE clause Ошибка синтаксиса в предложении WHERE 3146 ODBC — call failed ODBC — ошибка вызова 3151 ODBC — connection to <name> failed ODBC — ошибка подключения к<name> 3154 ODBC — couldn’t find DLL <name> ODBC — не удается найти DLL<name> 3155 ODBC — insert on a linked table failed ODBC — вставка для присоединенной (связанной) таблицы <name> не выполнена 3156 ODBC — delete on a linked table failed ODBC — удаление для присоединенной (связанной) таблицы не выполнено 3157 ODBC — update on a linked table failed ODBC — обновление для присоединенной (связанной) таблицы не выполнено 3158 «Couldn’t save record; currently locked by another user» «Сохранение записи невозможно; установлена блокировка другим пользователем» 3159 Not a valid bookmark Недопустимая закладка 3160 Table isn’t open Таблица не открыта 3161 Couldn’t decrypt file Не удается дешифровать файл 3162 You tried to assign the Null value to a variable that isn’t a Variant data type Попытка присвоить значение Null переменной, не принадлежащей к типу Variant 3163 The field is too small to accept the amount of data you attempted to add. Try inserting or pasting less data «Выполнение операции невозможно; объем данных велик для поля» 3164 The field can’t be updated because another user or process has locked the corresponding record or table Не удается обновить поле, поскольку соответствующая запись или таблица блокирована другим пользователем или процессом 3165 Couldn’t open .inf file Не удается открыть INF-файл 3166 Cannot locate the requested Xbase memo file Не удается найти затребованный файл Memo Xbase 3167 Record is deleted Запись удалена 3168 Invalid .inf file Недопустимый INF-файл 3169 The Microsoft Jet database engine could not execute the SQL statement because it contains a field that has an invalid data type Инструкция SQL не может быть выполнена ядром базы данных Microsoft Jet, так как содержит поле с недопустимым типом данных 3170 Couldn’t find installable ISAM Невозможно найти устанавливаемый драйвер ISAM 3171 Couldn’t find network path or user name Невозможно найти сетевой путь или имя пользователя 3172 Couldn’t open Paradox.net Невозможно открыть файл Paradox.net 3173 Couldn’t open table ‘MsysAccounts’ in Не удается открыть таблицу MsysAccounts 3174 Couldn’t open table ‘MSysGroups’ in the workgroup information file Не удается открыть таблицу MSysGroups в файле системной базы данных 3175 Date is out of range or is in an invalid format Дата выходит за пределы допустимого диапазона или имеет ошибочный формат 3176 Couldn’t open file <name> Не удается открыть файл <name> 3177 Not a valid table name Недопустимое имя таблицы 3179 Encountered unexpected end of file Обнаружен ошибочный конец файла 3180 Couldn’t write to file <name> Невозможна запись в файл <name> 3181 Invalid range Недопустимый диапазон 3182 Invalid file format Недопустимый формат файла 3183 Not enough space on temporary disk Недостаточно места на временном диске 3184 «Couldn’t execute query; couldn’t find linked table» «Выполнение запроса невозможно; не удается найти присоединенную (связанную) таблицу» 3185 SELECT INTO on a remote database tried to produce too many fields Инструкция SELECT INTO для удаленной базы данных осуществляет попытку создать слишком много полей 3186 «Couldn’t save; currently locked by user<name> on machine <name>» «Сохранение невозможно; блокировка пользователем <name> на машине <name>» 3187 «Couldn’t read; currently locked by user<name> on machine <name>» «Чтение невозможно; блокировка пользователем <name> на машине<name>» 3188 «Couldn’t update; currently locked by another session on this machine» «Обновление невозможно; блокировка другим сеансом данной машины» 3189 Table <name> is exclusively locked by user <name> on machine <name> Таблица <name> открыта с монопольным доступом пользователем<name> на машине <name> 3190 Too many fields defined Определено слишком много полей 3191 Can’t define field more than once Нельзя определить поле более одного раза 3192 Couldn’t find output table <name> Не удается найти выходную таблицу<name> 3196 The database <database name> is already in use by another person or proccess. When the database is available, try the operation again База данных <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, так как другой пользователь пытается одновременно изменить те же данные 3198 Couldn’t start session. Too many sessions already active Невозможно начать сеанс. Уже запущено слишком много сеансов 3199 Couldn’t find reference Не удается найти ссылку 3200 The record cannot be deleted or changed because table <name> includes related records Удаление или изменение записи невозможно. В таблице <name> имеются связанные записи 3201 You can’t add or change a record because a related record is required in table <name> Невозможно добавление или изменение записи. Для обеспечения целостности данных необходимо наличие связанной записи в таблице <name> 3202 «Couldn’t save; currently locked by another user» «Сохранение невозможно; блокировка другим пользователем» 3203 Subqueries cannot be used in the expression <expression> В выражении <expression> нельзя указывать подчиненный запрос 3204 Database already exists База данных уже существует 3205 Too many crosstab column headers<value> Слишком много заголовков столбцов <value> для перекрестной таблицы 3206 Can’t create a relationship between a field and itself Невозможно создать связь поля с этим же полем 3207 Operation not supported on a Paradox table with no primary key Операция не поддерживается для таблиц Paradox без ключевых полей 3208 Invalid Deleted setting in the Xbase key of the Windows Registry Недопустимое значение параметра Deleted в записи Xbase реестра Windows 3210 The connection string is too long Слишком длинная строка подключения 3211 The database engine couldn’t lock table<name> because it’s already in use by another person or process Таблица <name> не может быть заблокирована ядром базы данных. Она уже используется другим пользователем или процессом 3212 «Couldn’t lock table <name>; currently in use by user <name> on machine<name>» «Не удается блокировать таблицу<name>; она используется пользователем <name> на машине <name>» 3213 Invalid Date setting in the Xbase key of the Windows Registry Недопустимое значение параметра ‘Date’ в записи Xbase реестра Windows 3214 Invalid Mark setting in the Xbase key of the Windows Registry Недопустимое значение параметра ‘Mark’ в записи Xbase реестра Windows 3215 Too many Btrieve tasks Слишком много задач Btrieve 3216 Parameter <name> specified where a table name is required Параметр <name> задан вместо имени таблицы 3217 Parameter <name> specified where a database name is required Параметр <name> задан вместо имени базы данных 3218 «Couldn’t update; currently locked» «Обновление невозможно; установлена блокировка» 3219 Invalid operation Недопустимая операция 3220 Incorrect collating sequence Ошибочная таблица сортировки 3221 Invalid settings in the Btrieve key of the Windows Registry Недопустимые значения параметров в записи Btrieve реестра Windows 3222 Query can’t contain a Database parameter Запрос не может иметь параметр ‘База данных’ (Database) 3223 <Parameter name> is invalid because it’s longer than 64 characters or contains invalid characters Недопустимое имя параметра < Parameter name>, имеющее слишком большую длину или содержащее недопустимые символы 3224 Can’t read Btrieve data dictionary Невозможно прочитать словарь данных Btrieve 3225 Encountered a record locking deadlock while performing a Btrieve operation Данная блокировка записи накладывает условие взаимоблокировки при выполнении операции Btrieve 3226 Errors encountered while using the Btrieve DLL Ошибки при использовании библиотеки Btrieve 3227 Invalid Century setting in the Xbase key of the Windows Registry Недопустимое значение параметра Century в записи Xbase реестра Windows 3228 Invalid CollatingScqucnce setting in the Paradox key of the Windows Registry Недопустимое значение параметра CollatingScquence в записи Paradox реестра Windows 3229 Btrieve — can’t change field Btrieve — изменение значения поля невозможно 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 — создание таблицы невозможно 3234 ODBC — remote query timeout expired ODBC — время ожидания для выполнения удаленного запроса истекло 3235 ODBC — data type not supported on server ODBC — тип данных не поддерживается сервером 3238 ODBC — data out of range ODBC — данные выходят за пределы допустимого диапазона 3239 Too many active users Слишком много пользователей 3240 Btrieve — missing Btrieve engine Btrieve — отсутствует ядро Btrieve 3241 Btrieve — out of resources Btrieve — недостаток ресурсов 3242 Invalid reference in SELECT statement Недопустимая ссылка в инструкции SELECT 3243 None of the import field names match fields in the appended table Ни одно из имен импортируемых полей не совпадает с именами полей таблицы-получателя 3244 Can’t import password-protected spreadsheet Невозможен импорт электронной таблицы, защищенной паролем 3245 Couldn’t parse field names from the first row of the import table Невозможно выделить имена полей из первой строки, импортируемой таблицы 3246 Operation not supported in transactions Операция не поддерживается в транзакциях 3247 ODBC — linked table definition has changed ODBC — было изменено описание связанной таблицы 3248 Invalid NetworkAccess setting in the Windows Registry Недопустимое значение параметра NetworkAccess в записи реестра Windows 3249 Invalid PageTimeout setting in the Windows Registry Недопустимое значение параметра PageTimeout в записи реестра Windows 3250 Couldn’t build key Невозможно построение ключа 3251 Operation is not supported for this type of object Операция не поддерживается для объектов этого типа 3252 Can’t open a form whose underlying query contains a user-defined function that attempts to set or get the form’s RecordsetClone property Невозможно открыть форму: базовый запрос содержит определяемую пользователем функцию, задающую или получающую значение свойства RecordsetClone 3254 ODBC — can’t lock all records ODBC — блокировка всех записей невозможна 3256 Index file not found Не найден индексный файл 3257 Syntax error in WITH OWNER- ACCESS OPTION declaration Ошибка синтаксиса в описании WITH OWNERACCESS OPTION 3258 The SQL statement couldn’t be executed because it contains ambiguous outer joins. To force one of the joins to be performed first, create a separate query that performs the first join and then include that query in your SQL statement Невозможно выполнить инструкцию SQL, так как запрос содержит неоднозначные внешние связи. Для указания связи, выполняемой первой, создайте отдельный запрос и включите его в инструкцию SQL 3259 Invalid field data type Недопустимый тип данных поля 3260 «Couldn’t update; currently locked by user <name> on machine <name>» «Обновление невозможно; блокировка установлена пользователем<name> на машине <name>» 3261 Table <name> is exclusively locked by user <name> on machine <name> Таблица <name> блокирована с монопольным доступом пользователем<name> на машине <name> 3262 «Couldn’t lock table <name>; currently in use by user <name> on machine<name>» «Блокировка таблицы <name> невозможна; используется пользователем<name> на машине <name>» 3263 Invalid Database object Недопустимый объект Database 3264 No field defined — cannot append TableDef or Index Поля не определены — невозможно добавление объектов TableDef или Index 3265 Item not found in this collection Элемент не обнаружен в данном семействе 3266 Can’t append a Field that is already a part of a Fields collection Добавление невозможно. Поле является частью семейства Fields 3267 Property can be set only when the Field is part of a Recordset object’s Fields collection Свойство может быть определено, только если это поле является частью семейства Fields объекта Recordset 3268 Can’t set this property once the object is part of a collection Невозможно задание данного свойства, если объект является частью семейства 3269 Can’t append an Index that is already a part of an Indexes collection Добавление невозможно. Индекс является частью семейства Indexes 3270 Property not found Свойство не найдено 3271 Invalid property value Недопустимое значение свойства 3272 Object isn’t a collection Объект не является семейством 3273 Method not applicable for this object Метод неприменим к данному объекту 3274 External table isn’t in the expected format Внешняя таблица не имеет предполагаемый формат 3275 Unexpected error from external database driver <error number> Непредвиденная ошибка драйвера внешней базы данных <error number> 3276 Invalid database object reference Недопустимая ссылка на объект Database 3277 Can’t have more than 10 fields in an index Индекс не может содержать более десяти полей 3278 The Microsoft Jet database engine has not been initialized Не выполнена инициализация ядра базы данных Microsoft Jet 3279 The Microsoft Jet database engine has already been initialized Инициализация ядра базы данных Microsoft Jet уже выполнена 3280 Can’t delete a field that is part of an index or is needed by the system Невозможно удаление поля, являющегося частью индекса или необходимого системе 3281 Can’t delete this index or table. It is either the current index or is used in a relationship Удаление индекса или таблицы невозможно. Объект является текущим индексом или используется для 3282 Operation not supported on a table that contains data Операция не поддерживается для таблицы, содержащей данные 3283 Primary key already exists Ключ уже существует 3284 Index already exists Индекс уже существует 3285 Invalid index definition Недопустимое определение индекса 3286 Format of memo file doesn’t match specified external database format Формат файла Memo не соответствует указанному формату внешней базы данных 3287 Can’t create index on the given field Невозможно создание индекса для данного поля 3288 Paradox index is not primary Индекс Paradox не является первичным 3289 Syntax error in CONSTRAINT clause Ошибка синтаксиса в предложении CONSTRAINT 3290 Syntax error in CREATE TABLE statement Ошибка синтаксиса в инструкции CREATE TABLE 3291 Syntax error in CREATE INDEX statement Ошибка синтаксиса в инструкции CREATE INDEX 3292 Syntax error in field definition Ошибка синтаксиса при определении поля 3293 Syntax error in ALTER TABLE statement Ошибка синтаксиса в инструкции ALTER TABLE 3294 Syntax error in DROP INDEX statement Ошибка синтаксиса в инструкции DROP INDEX 3295 Syntax error in DROP TABLE or DROP INDEX Ошибка синтаксиса в инструкции DROP TABLE или DROP INDEX 3296 Join expression not supported Не поддерживается выражение объединения 3297 Couldn’t import table or query. No records found, or all records contain errors Невозможен импорт таблицы или запроса. Записи не обнаружены, или все записи содержат ошибки 3298 There are several tables with that name. Please specify owner in the format’owner.table’ Существует несколько таблиц с данным именем. Укажите владельца в формате ‘owner.table’ 3299 ODBC Specification Conformance Error <message>. Report this error to the developer of your application Ошибка согласования спецификации ODBC <message>. Сообщите о данной ошибке разработчику используемого приложения 3300 Can’t create a relationship Не удается установить связь 3301 «Can’t perform this operation; features in this version are not available in databases with older formats» «Выполнение операции невозможно; возможности данной версии недоступны в базах данных старого формата» 3303 Can’t delete this field. It’s part of one or more relationships Удаление данного поля невозможно. Оно участвует в одной или нескольких связях 3304 You must enter a personal identifier(PID) consisting of at least 4 and no more than 20 characters and digits Необходимо ввести код учетной записи, содержащий от 4 до 20 символов и цифр 3305 Invalid connection string in pass-through query Недопустимая строка подключения в запросе к серверу 3306 You’ve written a subquery that can return more than one field without using the EXISTS reserved word in the main query’s FROM clause. Revise the SELECT statement of the subquery to request only one field Из подчиненного запроса, который не использует ключевое слово EXISTS, возвращается не более одного поля. Укажите в инструкции SELECT подчиненного запроса возвращение только одного поля 3307 The number of columns in the two selected tables or queries of a union query don’t match В таблицах или запросах, выбранных в запросе на объединение, не совпадает число столбцов 3308 Invalid TOP argument in select query Недопустимый аргумент ТОР запроса на выборку 3309 Property setting can’t be larger than 2K Размер значения свойства не должен превышать 2 Кбайт 3310 This property isn’t supported for external data sources or for databases created with a previous version of Microsoft Jet Данное свойство не поддерживается для внешних источников данных или для баз данных, созданных в предыдущей версии ядра Microsoft Jet 3311 Property specified already exists Указанное свойство уже определено 3312 Validation rules and default values can’t be placed on system or linked tables Нельзя задавать условия на значения или значения по умолчанию для системных или присоединенных (связанных) таблиц 3313 Can’t place this validation expression on this field Невозможно задать выражение условия на значения для этого поля 3314 The field <name> can’t contain a Null value because the Required property for this field is set to True. Enter a value in this field Поле <name> не может содержать значение Null, так как свойство Required имеет значение True. Введите значение в поле 3315 Field <name> can’t be a zero-length string Поле <name> не допускает ввод пустых строк 3316 <Tablelevel validation text> Текст условия на значение уровня таблицы 3317 One or more values are prohibited by the validation rule <rule> set for <name>. Enter a value that the expression for this field can accept Одно или несколько из введенных значений нарушают условие на значение <rule>, заданное для <name>. Введите значение, допускаемое выражением для данного поля 3318 Values specified in a TOP clause are not allowed in delete queries or reports Значения, указанные в предложении ТОР, не допускаются в запросах на удаление записей или в отчетах 3319 Syntax error in union query Ошибка синтаксиса в запросе на объединение 3320 <Error> in table-level validation expression <Еггог> в выражении условия на значение уровня таблицы 3321 No database specified in connection string or IN clause He задана база данных в строке подключения или в предложении IN 3322 Crosstab query contains one or more invalid fixed column headings Перекрестный запрос содержит один или несколько недопустимых заголовков столбцов 3323 The query cannot be used as a row source Не допускается использование этого запроса в качестве источника строк 3324 The query is a DDL query and cannot be used as a row source Данный запрос является управляющим запросом и его нельзя использовать в качестве источника строк 3325 Pass-through query with Returns- Records property set to True did not return any records Запрос к серверу, свойство ReturnsRecords которого имеет значение True, не вернул ни одной записи 3326 This Recordset is not updatable Объект Recordset не является обновляемым 3334 Can be present only in version 1.0 format Возможно представление только в формате версии 1.0 3336 Btrieve: Invalid IndexDDF option in initialization setting Btrieve: недопустимое значение параметра инициализации IndexDDF 3337 Invalid DataCodePage option in initialization setting Недопустимое значение параметра инициализации DataCodePage 3338 Btrieve: Xtrieve options aren’t correct in initialization setting Btrieve: не исправлены параметры инициализации Xtrieve 3339 Btrieve: Invalid IndexDeleteRenumber option in initialization setting Btrieve: недопустимое значение параметра инициализации IndexDeleteRenumber 3340 Query <name> is corrupt Запрос <name> поврежден 3341 The current field must match the join key <name> in the table that serves as the ‘one’ side of one-to-many relationship. Enter a record in the ‘one’ side table with the desired key value, and then make the entry with the desired join key in the ‘many’ side Текущее поле после обновления должно содержать подходящий ключ связи <name> со стороны ‘один’ внешнего объединения. Введите на стороне ‘один’ запись с требуемым значением ключа связи, а затем создайте запись с тем же значением ключа в таблице на стороне ‘многие’ 3342 Invalid Memo or OLE Object in sub- query <name> Ошибочное поле Memo или поле объекта ActiveX в подчиненном запросе <name> 3343 Unrecognized database format<filename> Нераспознаваемый формат базы данных <filename> 3344 The database engine does not recognize either the field <name> in a validation expression, or the default value in the table <name> Имя поля <name> в выражении для условия на значение или в значении по умолчанию в таблице <name> не распознается ядром базы данных 3345 Unknown or invalid field reference<name> Недопустимая или неизвестная ссылка на поле <name> 3346 Number of query values and destination fields aren’t the same Не совпадает число значении запроса и число результирующих полей 3349 Numeric field overflow Переполнение числового поля 3350 Object is invalid for operation Недопустимый объект для данной операции 3351 The ORDER BY expression <expression> includes fields that aren’t selected by the query. Only those fields requested in the first query can be in- cluded in an ORDER BY expression В выражение ORDER BY <expression> включены поля, не выбранные в запросе. Выражение ORDER BY может содержать только поля, затребованные в первом запросе 3352 No destination field name in INSERT INTO statement <statement> В инструкции INSERT INTO <statement> отсутствует имя результирующего поля 3353 Btrieve: Can’t find file RELD.DDF Btrieve: He удается найти файл FIELD.DDF 3354 At most one record can be returned by this subquery Данный подчиненный запрос должен возвращать не более одной записи 3355 Syntax error in default value Ошибка синтаксиса в значении по умолчанию 3356 You attempted to open a database that is already opened exclusively by user<name> on machine <name>. Try again when the database is available Попытка открыть базу данных, открытую пользователем <name> на машине <name> для монопольного доступа. Повторите попытку, когда база данных освободится 3357 This query is not a properly formed data-definition query Данный запрос не является правильно заданным управляющим запросом 3358 Can’t open the Microsoft Jet engine workgroup information file Не удается открыть системную базу данных ядра Microsoft Jet 3359 Pass-through query must contain at least one character Запрос к серверу должен содержать, по крайней мере, один символ 3360 Query is too complex Слишком сложный запрос 3361 Unions not allowed in a subquery В подчиненном запросе не допускаются объединения 3362 Single-row update/delete affected more than one row of a linked table. Unique index contains duplicate values Обновление/удаление строки влияет на несколько строк присоединенной таблицы. Повтор значений в уникальном индексе 3364 Can’t use Memo or OLE Object field<name> in the SELECT clause of a union query В предложении SELECT запроса на объединение не допускается использование поля Memo или поля объекта ActiveX <name> 3365 Can’t set this property for remote objects Невозможно установить значение данного свойства для внешних объектов 3366 Can’t append a relation with no fields defined Невозможно добавить связь, не определив поля 3367 Can’t append. An object with that name already exists in the collection Добавление объекта невозможно. Он уже входит в семейство 3368 Relationship must be on the same number of fields with the same data types Отношение должно быть задано для одинакового количества полей с одинаковыми типами данных 3370 Can’t modify the design of table<name> It’s in a read-only database Невозможно изменение структуры таблицы «name». База данных доступна только для чтения 3371 Can’t find table or constraint Не удается найти таблицу или индекс 3372 No such index <name> on table<name> Индекс <name> не существует в таблице <name> 3373 Can’t create relationship. Referenced Не удается создать связь. Указанная 3374 The specified fields are not uniquely indexed in table <name> Указанные поля не имеют уникального индекса в таблице <name> 3375 Table <name> already has an index named <name> Таблица <name> уже имеет индекс с именем <name> 3376 Table <name> doesn’t exist Таблица <name> не существует 3377 No such relationship <name> on table<name> Отношение <name> для таблицы<name> не существует 3378 There is already a relationship named<name> in the current database Связь <name> уже существует в текущей базе данных 3379 Can’t create relationships to enforce referential integrity. Existing data in table <name> violates referential integrity rules in table <name> Невозможно обеспечить целостность данных. Данные таблицы<name> нарушают условия для связи с таблицей <name> 3380 Field <name> already exists in table<name> Поле <name> уже существует в таблице <name> 3381 There is no field named <name> in table <name> Поле <name> отсутствует в таблице<name> 3382 Size of field <name> is too long Слишком длинное поле <name> 3383 Can’t delete field <name> It’s part of one or more relationships Невозможно удалить поле <name>. Оно является частью одной или нескольких связей 3384 Can’t delete a built-in property Невозможно удаление встроенного свойства 3385 User-defined properties don’t support a Null value Свойства, определяемые пользователем, не допускают задание пустых значении (Null) 3386 Property <name> must be set before using this method Перед использованием данного метода необходимо задать значение свойства <name> 3388 Unknown function <name> in validation expression or default value on<name> Неизвестная функция <name> в выражении условия на значение или в значении по умолчанию для <name> 3389 Query support unavailable Поддержка запроса недоступна 3390 Account name already exists Имя учетной записи уже существует 3393 Can’t perform join, group, sort, or indexed restriction. A value being searched or sorted on is too long Невозможно выполнить объединение, группировку, сортировку или отбор по индексу. Слишком длинное значение, используемое для поиска или сортировки 3394 «Can’t save property; property is a schema property» «Сохранение свойства невозможно; свойство схемы» 3396 Can’t perform cascading operation. Since related records exist in table<name>, referential integrity rules would be violated Невозможно выполнить каскадную операцию, поскольку наличие в таблице <name> связанных записей приведет к нарушению целостности данных 3397 Can’t perform cascading operation. There must be a related record in table<name> Невозможно выполнение каскадной операции. Необходимо наличие связанных записей в таблице <name> 3398 Can’t perform cascading operation. It would result in a null key in table<name> Невозможно выполнить каскадную операцию, которая приведет к появлению пустого ключевого поля в таблице <name> 3399 Can’t perform cascading operation. It would result in a duplicate key in table<name> Невозможно выполнить каскадную операцию, которая приведет к появлению повторяющихся значений в ключевом поле таблицы <name> 3400 Can’t perform cascading operation. It would result in two updates to field <name> in table <name> Невозможно выполнить каскадную операцию, которая приведет к повторному обновлению поля <name> в таблице <name> 3401 Can’t perform cascading operation. It would cause field <name> to become Null, which is not allowed Невозможно выполнить каскадную операцию, которая приведет к появлению недопустимого пустого (Null) значения в поле <name> 3402 Can’t perform cascading operation. It would cause field <name> to become a zero-length string, which is not allowed Невозможно выполнить каскадную операцию, которая приведет к появлению недопустимой пустой строки в поле <name>

Отказ макроса или надстройки от выполнения своих функций имеет ряд причин. Рассмотрим наиболее распространенные из них.

Операционная система

Вплоть до Office 2016 пакет приложений Microsoft Office выпускается в различных версиях, для Windows и для Mac OS. Встроенный в приложения Office язык программирования при этом использует отличающиеся друг от друга библиотеки операционной системы. В связи с этим макрос/надстройка, написанная для работы в приложениях под Windows, может не работать, либо работать некорректно в MacOS. Проверьте операционную систему, для которой разрабатывался макрос/надстройка.

Разработчик пакета офисных приложений

Кроме Microsoft Office, пользователи достаточно часто используют альтернативные пакеты офисных приложений, такие как OpenOffice или LibreOffice. Приложения этих пакетов также имеют встроенные языки программирования, но эти языки отличаются друг от друга. Макросы или надстройки, написанные в Visual Basic for Application в приложениях пакета Microsoft Office, не будут работать в приложениях OpenOffice или LibreOffice. Уточните, для какого пакета офисных программ разработан макрос/надстройка.

Наличие компонента VBA

Для того, чтобы можно было запустить макрос или надстройку в каком-либо приложении пакета Office, необходимо, чтобы с этим пакетом был установлен компонент VBA – встроенный язык программирования Visual Basic for Application. В некоторых версиях Office этот пакет может устанавливаться отдельно. Проверьте, установлен ли этот компонент на компьютере. Нажмите сочетание клавиш Alt+F11, если после этого появляется окно редактора Visual Basic, то компонент установлен. В случае, если компонент отсутствует, его необходимо установить.

Версия Microsoft Office

Microsoft Office 2003 использует надстройки с расширением .xla (для Excel), .dot (для Word) и так далее. В более поздних версиях расширения надстроек изменились: .xlam (для Excel), .dotm (для Word). При установке надстроек старого формата в приложения Office 2007 и выше никаких проблем не происходит, а вот при попытке установить надстройку нового формата в приложения пакета Office 2003, возникает сообщение о том, что надстройки не обнаружены. Убедитесь в том, что используемая надстройка предназначена именно для той версии Office, в которой Вы работаете.

Активация Microsoft Office

Убедитесь в том, что Microsoft Office не требует активации. Проведите активацию, чтобы избежать каких-либо ограничений при использовании приложений.

Снятие блокировки файла

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

snyatie blokirovki s fajla

Система безопасности

Если все вышеизложенное не ответило на вопрос «почему не работает макрос?», то, скорее всего, дело в настройках системы безопасности. Перейдите на страницу https://macros-vba.ru/knigi/vba/nastrojki-sistemy-bezopasnosti и проделайте то, что написано в разделах «Надежные расположения» и «Настройка доступа к объектной модели VBA».

Используемые библиотеки

Еще одна ситуация при которой не работает макрос сопровождается появлением сообщения Can’t find project or library при этом тот же самый макрос может без нареканий работать на другом компьютере. В разных версиях приложений, в которые встроен VBA могут использоваться разные библиотеки, в связи с чем могут возникать подобные ошибки. Ошибку можно устранить, если в окне, которое следует за сообщением об ошибке снять флажки, установленные в пунктах, содержащих слово MISSING.

cant find project or library

Это окно также можно вызвать и самостоятельно, если в редакторе VB выбрать пункт меню Tools/References.

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

Другие материалы по теме:

Последнее обновление Ноя 12, 2021

Некоторые пользователи, похоже, получают ошибку VBA 400 при попытке запустить свой макрос в Excel. Дальнейших указаний нет, только окошко с кнопкой ОК.

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

Как исправить ошибку 400 в Excel?

1 Переместите ваши макросы в новый модуль

Ошибка VBA 400: что это такое и как ее исправить

  1. Чтобы создать новый модуль, перейдите в меню «Инструменты».
  2. Щелкните Макрос – редактор Visual Basic.
  3. В VBA щелкните ” Модуль” в меню “Вставка”.
  4. Вставьте код VBA, который хотите использовать.
  5. В меню «Файл» выберите «Сохранить глобально».
  6. Обязательно удалите старый модуль.

2 Включите доверенный доступ к VBA

Ошибка VBA 400: что это такое и как ее исправить

  1. Перейдите на вкладку «Разработчик» (если она недоступна, нажмите «Файл» > «Параметры» > «Настроить ленту»> установите флажок «Разработчик» ).
  2. В группе Код – перейдите на вкладку Разработчик.
  3. Щелкните Безопасность макросов.
  4. Выберите «Параметры макроса разработчика» – выберите «Надежный доступ к проекту VBA».

3 Проверьте свой код

Ошибка VBA 400: что это такое и как ее исправить

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


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

Источник записи: windowsreport.com

В этой статье мы обсудим методы исправления ошибки VBA 400 в Excel. Ошибка 400 в Excel обычно возникает при запуске макроса Microsoft Visual Basic для приложений (VBA). Это вызывает сбой макроса или сбой при запуске и возвращает сообщение об ошибке 400. Причины такой ошибки могут быть разными; давайте обсудим их.

vba-error-400-в-Excel

Что вызывает ошибку VBA 400 в Excel?

Вот причины, из-за которых возникает ошибка 400 при запуске макроса в Excel:

  • Неправильная установка программного обеспечения Office.
  • В коде VBA есть ошибка.
  • Недопустимое значение аргумента.
  • Запущенный макрос поврежден.
  • Файлы, связанные с Excel, заражены каким-либо вредоносным ПО.
  • Ошибка чтения / записи из файла.
  • Неверные записи в реестре.

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

Вот способы исправить ошибку 400, возникшую при запуске макроса в Excel:

  1. Переместите макросы в новый модуль.
  2. Включите доверенный доступ к VBA.
  3. Просмотрите свой код VBA.
  4. Восстановите Microsoft Excel.
  5. Удалите, а затем повторно установите Excel.
  6. Некоторые другие методы, такие как сканирование на наличие вредоносных программ и т. Д.

Давайте подробно обсудим эти методы.

1]Переместить макросы в новый модуль

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

Перейдите на вкладку «Разработчики» и выберите «Визуальный редактор». Если вы не видите вкладку «Разработчики» на главной ленте в Excel, перейдите в «Файл»> «Параметры» и на вкладке «Настройка лент» установите флажок «Разработчики» в разделе «Основные вкладки».

Теперь в окне Microsoft Visual Basic для приложений щелкните меню «Вставка» и выберите параметр «Модуль».

После этого вставьте код макроса в этот новый модуль и сохраните его, используя специальную опцию в меню «Файл».

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

Наконец, щелкните Файл> Закрыть и вернуться в Microsoft Excel и посмотрите, устранена ли ошибка 400 в Excel.

2]Включить надежный доступ к VBA

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

  1. Перейдите на вкладку «Разработчики» и нажмите «Безопасность макросов».
  2. В окне центра управления безопасностью включите параметр Надежный доступ к объектной модели проекта VBA.
  3. Нажмите кнопку ОК.

3]Проверьте свой код

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

4]Восстановить Microsoft Excel

Если ничего из вышеперечисленного не работает, проблема может быть в приложении Excel. Возможно, приложение установлено неправильно или что-то нужно исправить. Итак, восстановите Microsoft Excel, используя следующие шаги:

  1. Запустите приложение «Настройки» и выберите «Приложения»> «Приложения и функции».
  2. Справа найдите и щелкните Программа Office 365 / Microsoft 365.
  3. Нажмите на кнопку «Изменить», а затем выберите вариант «Онлайн-ремонт» или «Быстрое восстановление».
  4. Нажмите кнопку «Восстановить», чтобы восстановить Excel и другие приложения Office.

5]Удалите, а затем повторно установите Excel.

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

6]Некоторые другие методы

Кроме того, некоторые другие решения также могут работать, например:

  • Вы можете попробовать запустить сканирование SFC, чтобы проверить и восстановить поврежденные системные файлы.
  • Некоторые вредоносные программы также могут вызывать эту ошибку. Итак, проверяйте и удаляйте вредоносные программы и подозрительные приложения с помощью Microsoft Defender или сторонней антивирусной или антивредоносной программы.
  • Попробуйте удалить поврежденные данные кеша и системные ненужные файлы.

Надеюсь, что приведенные выше решения помогут!

Теперь прочтите: Как исправить ошибку выполнения 1004 в Excel

vba-error-400-в-Excel .

  • Майкрософт html выбивает ошибку при запуске драйвер пак
  • Мазок на коронавирус вероятность ошибки
  • Мазила ошибка при установлении защищенного соединения
  • Мазда фамилия самодиагностика ошибок абс
  • Мазда фамилия ошибка 1498