Номер |
Сообщение |
Описание |
3 |
Return |
Оператор Return без GoSub |
5 |
Invalid |
Неверный вызов процедуры |
6 |
Overflow |
Переполнение |
7 |
Out of |
Недостаточно памяти |
9 |
Subscript |
Индекс вне заданного диапазона |
10 |
This |
Этот массив имеет фиксированную длину или он временно |
11 |
Division |
Деление на ноль |
13 |
Type mismatch |
Несоответствие типа |
14 |
Out of |
Не хватает памяти для строки |
16 |
Expression |
Выражение слишком сложное |
17 |
Can’t |
Невозможно выполнить требуемую операцию |
18 |
User |
Произошло прерывание по команде пользователя |
20 |
Resume |
Оператор Resume применен за пределами кода, отвечающего за |
28 |
Out of |
В стеке не хватает памяти |
35 |
Sub, |
Процедура Sub, Function или Property не определена |
47 |
Too many |
Слишком много приложений обращаются к DLL |
48 |
Error in |
Ошибка при загрузке DLL |
49 |
Bad DLL |
Неверный вызов DLL |
51 |
Internal |
Внутренняя ошибка |
52 |
Bad file |
Неверное имя или номер файла |
53 |
File not |
Файл не найден |
54 |
Bad file |
Неверный тип доступа |
55 |
File |
Файл уже открыт |
57 |
Device |
Ошибка устройства ввода/вывода |
58 |
File |
Файл уже существует |
59 |
Bad |
Неверный размер записи |
61 |
Disk full |
Диск переполнен |
62 |
Input |
Чтение файла невозможно, т.к. достигнут его конец |
63 |
Bad |
Неверный номер записи |
67 |
Too many |
Слишком много файлов |
68 |
Device unavailable |
Устройство недоступно |
70 |
Permission |
Доступ запрещен |
71 |
Disk not |
Диск не готов |
74 |
Can’t |
Нельзя переименовать файл со сменой носителя |
75 |
Path/File |
Ошибка доступа к каталогу/файлу |
76 |
Path not |
Каталог не найден |
91 |
Object |
Переменная объекта или переменная блока With не задана |
92 |
For loop |
Цикл For не инициализирован |
93 |
Invalid |
Неверная маска |
94 |
Invalid |
Неверное использование Null |
97 |
Can’t |
Нельзя вызвать процедуру Friend, т.к. она не является |
98 |
A |
Обращение к свойству или методу не может включать ссылку |
260 |
No timer |
Ни один таймер не доступен |
282 |
No |
Ни одно внешнее приложение не ответило на инициативу DDE |
288 |
Destination |
Адресат занят |
290 |
Data is |
Неправильный формат данных |
294 |
Invalid |
Неверный формат данных в DDE-диалоге |
296 |
PasteLink |
PasteLink для этого элемента управления уже выполнен |
297 |
Can’t set |
Нельзя установить LinkMode; неправильный LinkTopic |
298 |
System |
Системная DLL |
320 |
Can’t use |
Нельзя использовать имя устройства в определении имени |
321 |
Invalid |
Неверный формат файла |
322 |
Can’t |
Не могу создать необходимый временный файл |
325 |
Invalid |
Неверный формат файла ресурсов |
327 |
Data |
Значение не найдено |
328 |
Illegal |
Неверный параметр; не могу записать массив |
335 |
Could not |
Доступ к системному реестру невозможен |
336 |
ActiveX |
Компонент ActiveX зарегистрирован неправильно |
337 |
ActiveX |
Компонент ActiveX не найден |
338 |
ActiveX |
Компонент ActiveX не может быть корректно выполнен |
340 |
Control |
Элемент управления ‘имя’ не найден |
341 |
Invalid |
Неверный индекс массива элементов управления |
342 |
Not |
Недостаточно памяти для создания элемента управления ‘имя’ |
343 |
Object |
Объект не является массивом |
344 |
Must |
Необходимо указать индекс массива |
345 |
Reached |
Достигнута верхняя граница: нельзя создать больше ни |
360 |
Object |
Объект уже загружен |
361 |
Can’t |
Невозможно загрузить или выгрузить данный объект |
363 |
ActiveX |
Элемент управления ActiveX не найден |
364 |
Object |
Объект был выгружен |
365 |
Unable to |
Нет возможности в данном контексте произвести выгрузку |
366 |
No MDI |
Форма, не определенная как MDI, не может быть загружена |
368 |
The |
Данный файл устарел. Эта программа требует более новой |
371 |
The |
Данный объект не может быть использован как родитель формы |
380 |
Invalid |
Неверное значение свойства |
381 |
Invalid |
Неверный индекс массива свойств |
382 |
Property |
Процедура установки свойства (Property Set) не может быть запущена |
383 |
Property |
Процедура установки свойства (Property Set) не может быть |
385 |
Need |
Для массива свойств надо указать индекс |
387 |
Property |
Процедура установки свойства (Property Set) не разрешена |
389 |
Invalid key |
Нажата неверная клавиша |
393 |
Property |
Процедура чтения свойства (Property Get) не поддерживается |
394 |
Property |
Процедура чтения свойства (Property Get) не может быть |
396 |
‘Item’ |
Свойство ‘имя’ нельзя установить для страницы (объект |
400 |
Form |
Форма уже отображена, ее нельзя отобразить как модальную |
401 |
Can’t |
Немодальную форму нельзя отобразить одновременно с модальной |
402 |
Must |
Сначала необходимо закрыть верхнюю модальную форму |
403 |
HDI forms |
MDI-формы не могут быть отображены как модальные |
404 |
MDI child |
Дочерние MDI-формы не могут быть отображены модальными |
419 |
Permission |
Использование объекта запрещено |
422 |
Property |
Свойство не найдено |
423 |
Property |
Свойство или метод не найдены |
424 |
Object required |
Необходим объект |
425 |
Invalid |
Неверное использование объекта |
427 |
Invalid |
Неверный тип объекта; требуется элемент управления типа |
429 |
ActiveX |
Компонент ActiveX |
430 |
Class |
Класс не поддерживает программирование объектов |
432 |
File name |
Имя файла или класса не найдено в процессе операции |
438 |
Object |
Объект не поддерживает данное свойство или метод |
440 |
Automation error |
Ошибка программирования объектов (Automation) |
442 |
Connection |
Связь с библиотекой типов или объектов для удаленного |
443 |
Automation |
Объект Automation |
444 |
Method not applicable in this context |
Метод в этом контексте недоступен |
445 |
Object doesn’t support this action |
Объект не поддерживает эту команду |
446 |
Object |
Объект не поддерживает указанные аргументы |
447 |
Object doesn’t support current locale setting |
Объект не поддерживает текущие национальные стандарты |
448 |
Name argument not found |
Именованный аргумент не найден |
449 |
Argument |
Аргумент обязателен или неверное |
450 |
Wrong |
Неправильное количество аргументов |
451 |
Object not a collection |
Объект не является коллекцией |
452 |
Invalid ordinal |
Неверный порядковый номер |
453 |
Specified DLL function not found |
Указанная функция DLL не найдена |
454 |
Code |
Код ресурса не найден |
457 |
This key |
Этот ключ уже ассоциирован с элементом этой коллекции |
458 |
Variable |
Переменная использует тип, не поддерживаемый Visual Basic |
459 |
This |
Этот компонент не поддерживает установку событий |
460 |
Invalid Clipboard format |
Неверный формат Буфера обмена |
461 |
Specified |
Данный формат не совпадает с форматом данных |
462 |
The |
Удаленная машина сервера не существует или недоступна |
463 |
Class not |
Класс не зарегистрирован на локальной машине |
480 |
Can’t create AutoRedraw image |
Нельзя создать автоматически восстанавливаемое изображение |
481 |
Invalid picture |
Неверный рисунок |
482 |
Printer error |
Ошибка принтера |
483 |
Printer driver does not support specified property |
Драйвер принтера не поддерживает указанное свойство |
484 |
Problem |
Проблема при чтении информации принтером из системы. |
485 |
Invalid |
Неверный тип рисунка |
486 |
Can’t |
Нельзя распечатать изображение формы на принтере такого |
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 |
Объект <name> не найден ядром базы данных Microsoft |
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 |
Записи не могут быть добавлены; отсутствует разрешение на |
3108 |
Record(s) can’t be edited; no update permission or |
Записи не могут быть изменены; отсутствует разрешение на |
3109 |
Record(s) can’t be deleted; no delete permission or |
Записи не могут быть удалены; отсутствует разрешение на |
3111 |
Couldn’t create; no modify design permission for table or |
Создание невозможно; отсутствует разрешение на изменение |
3117 |
Can’t sort on Memo or OLE Object <clause> |
Невозможна сортировка по полю Memo или объекта ActiveX в |
3116 |
Can’t join on Memo or OLE Object <name> |
Невозможно объединение с полем Memo или объекта ActiveX |
3146 |
ODBC – call failed |
ODBC – ошибка вызова |
3154 |
ODBC – couldn’t find DLL <name> |
ODBC – не удается найти DLL <name> |
3197 |
The Microsoft Jet database engine stopped the process |
Процесс остановлен ядром базы данных 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 |
Перекрестный запрос содержит один или несколько неверных |
3342 |
Invalid Memo or OLE Object in sub-query<name> |
Ошибочное поле Memo или поле объекта ActiveX в подчиненном |
3360 |
Query is too complex |
Слишком сложный запрос |
3409 |
Invalid field name<name> in definition of index or |
Неверное имя поля <name> при определении индекса или |
3411 |
Invalid entry. Can’t perform cascading operation in |
Ошибочное значение. Невозможно выполнить каскадную |
3423 |
You cannot use ODBC to import from, export to, or link an |
Не допускается использование ODBC для импорта, экспорта |
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 |
Невозможно открыть системную таблицу репликации |
3584 |
Insufficient memory to complete operation |
Не хватает памяти для завершения операции |
3586 |
Syntax |
Ошибка синтаксиса в выражении фильтра для таблицы |
3613 |
Can’t |
Не допускается создание связи между присоединенными |
3614 |
GUID not allowed in Find method criteria expression |
Не допускается использование типа GUID в выражениях для |
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 |
Нельзя использовать составной или нефиксированный столбец |
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 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.
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.
3. Select Visual Basic from the options.
4. In the VBA menu, click Module on the Insert menu.
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
- Go to the Developer tab (If this is not available click File > Options > Customise Ribbon > choose the Developer checkbox).
- In the Code group – go to the Developer tab.
- Click Macro Security.
- Select Developer Macro Settings – choose Trusted access to the VBA project.
- Runtime Error 5: Invalid Procedure Call or Argument [Fix]
- Runtime Error 32809: How to Quickly Fix it
- Fix: This Action Won’t Work on Multiple Selections
- How to Reset Excel to Default Settings [Quickest Ways]
- Runtime Error 438: Object Doesn’t Support Property [Fix]
3. Check your code for mistakes to fix VBA error 400
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.
Download Windows Repair & Speedup Tool to fix errors automatically
While using Microsoft Visual Basic for Applications on Excel, if you get Run-time error, Class not registered, here is how you can fix the issue. It is pretty common when there are some issues with the code or Office installation. That is why you can follow these tips and tricks to get rid of this problem.
You can run various codes via Visual Basic on an Excel spreadsheet to get different things done within moments and in automation. However, while running such a code, if you get the aforementioned error, you won’t be able to do what you were looking forward to. If so, you can follow the subsequent solutions to get rid of the error, as mentioned above.
To fix Microsoft Visual Basic Run-time error Class not registered, follow these steps:
- Check the code
- Update Excel/Office
- Turn on trust access to VBA
- Repair Microsoft Office
To learn more about these steps, continue reading.
1] Check the code
It is the very first thing you need to check when you are getting the aforementioned error in Excel. If the entered or written code is wrong, the argument is missing, etc., you won’t be able to run it on your spreadsheet. As a result, you might get the error as said above. That is why it is recommended to verify the code before running it again or heading to other solutions.
Read: How to create Custom Excel Functions using VBA
2] Update Excel/Office
If you haven’t updated Excel or Office for a very long time, it is recommended to do that. At times, Microsoft might change various things, and that could be a reason why you are getting such an error. To update Office, do the following:
- Open Excel on your computer.
- Click on the Account.
- Expand the Update Options.
- Click the Update Now option.
Then, it will search for a pending update and install it accordingly.
3] Turn on Trust access to VBA
When you are getting this error, you must check if this setting is turned on or not. If not, it is suggested to enable it on your computer. To turn on trust access to the VBA project, follow these steps:
- Open Excel and click on Options.
- Switch to the Trust Center tab.
- Click the Trust Center Settings button.
- Go to the Macro Settings tab.
- Tick the Trust access to the VBA project object model checkbox.
- Click the OK button.
Then, restart Excel and check if the problem remains or not.
4] Repair Microsoft Office
It is the last thing you need to do in order to troubleshoot the error. To repair Office on Windows 11/10, do the following:
- Press Win+I to open Windows Settings.
- Go to Apps > Apps & features.
- Click the three-dotted button of Microsoft 365.
- Select the Modify option.
- Click the Yes button in the UAC prompt.
- Choose the Online Repair option.
- Click the Repair button.
Once the process is done, you can restart your computer and check if the problem is resolved or not.
Apart from trying these solutions, you can also run the System File Checker. At times, an internal conflict can cause the above-mentioned error. If so, you can fix it with the help of SFC Scan.
Related:
- How to fix Class not registered error in Explorer.exe
- Class Not Registered error in Outlook
- Class not registered error while opening image
- Class not registered Chrome.exe
How do I fix Runtime error in Excel VBA?
To fix the Run-time error in Excel VBA, you need to follow the above-mentioned solutions. You should start the troubleshooting process by verifying the code. However, if nothing works, you must repair the Office installation. In that case, select the Online Repair option instead of Quick Repair.
Read: How to fix Runtime Error 1004 in Microsoft Excel
How do I bypass VBA error in Excel?
There is no way to bypass the VBA error in Excel if you want to use the code. You must resolve the issue in order to use it without any error. A detailed guide of four solutions as mentioned above, and it is recommended to follow all of them to troubleshoot the VBA error in Excel.
Related: How to fix VBA error 400 in Excel.
When he is not writing about Microsoft Windows or Office, Sudip likes to work with Photoshop. He has managed the front end and back end of many websites over the years. He is currently pursuing his Bachelor’s degree.
- Remove From My Forums
-
Question
-
Hello.
Whenever I open Excel, an errorbox titled «Microsoft Visual Basic for Applications» pops up.
it says:
Compile error in hidden module: MPrecedentAnalyzer. This error commonly occurs when code is incompatible with the version, platform or architecture of this application. Click «Help» for information on how to correct this error.
Would anyone know how to fix this?
Thanks,
Answers
-
Hi,
First, try the following method:
If in Windows XP open the following folder:
C:Documents and SettingsUSERNAMEApplication DataMicrosoftForms where
USERNAME is the current userIf in Windows 7 open the following folder:
C:UsersUSERNAMEAppDataRoamingMicrosoftForms where
USERNAME is the current userOnce the folder is located, delete these 2 files
ComctlLib.exd
MSComctlLib.exdIf the above method doesn’t work, then try the following:
Start Excel in safe mode to check the issue. If the issue doesn’t occur in safe mode, then it means that the issue caused by some add-ins such as PDF and so on.
Jaynet Zhang
TechNet Community Support-
Marked as answer by
Monday, December 24, 2012 9:14 AM
-
Marked as answer by
На чтение 25 мин. Просмотров 16.6k.
Эта статья содержит полное руководство по обработке ошибок VBA. Если вы ищете краткое резюме, посмотрите таблицу быстрого руководства в первом разделе.
Если вы ищете конкретную тему по обработке ошибок VBA, ознакомьтесь с приведенным ниже содержанием.
Если вы новичок в VBA, то вы можете прочитать пост от начала до конца, так как он выложен в логическом порядке.
Содержание
- Краткое руководство по обработке ошибок
- Введение
- Ошибки VBA
- Заявление об ошибке
- Err объект
- Логирование
- Другие элементы, связанные с ошибками
- Простая стратегия обработки ошибок
- Полная стратегия обработки ошибок
- Обработка ошибок в двух словах
Краткое руководство по обработке ошибок
Пункт | Описание |
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
В VBA есть три типа ошибок
- Синтаксис
- Компиляция
- Время выполнения
Мы используем обработку ошибок для устранения ошибок во
время выполнения. Давайте посмотрим на каждый из этих типов ошибок, чтобы было
ясно, что такое ошибка во время выполнения.
Синтаксические ошибки
Если вы использовали VBA в течение какого-то времени, вы
увидите синтаксическую ошибку. Когда вы набираете строку и нажимаете return,
VBA оценивает синтаксис и, если он неверен, выдает сообщение об ошибке.
Например, если вы введете If и забудете ключевое слово Then,
VBA отобразит следующее сообщение об ошибке.
Некоторые примеры синтаксических ошибок
' 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.
Использование 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 отобразит ошибку, когда ваш
код попытается открыть его.
Другие примеры ошибок времени выполнения
- база данных недоступна
- пользователь вводит неверные данные
- ячейка, содержащая текст вместо числа
Как мы уже видели, целью обработки ошибок является обработка
ошибок времени выполнения, когда они возникают.
Ожидаемые и неожиданные ошибки
Когда мы думаем, что может произойти ошибка во время
выполнения, мы помещаем код на место для ее обработки. Например, мы обычно
помещаем код на место, чтобы иметь дело с файлом, который не найден.
Следующий код проверяет, существует ли файл, прежде чем он
пытается его открыть. Если файл не существует, отображается сообщение, удобное
для пользователя, и код выходит из подпрограммы.
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.
Заявление об ошибке
Как мы видели, есть два способа обработки ошибок во время
выполнения
- Ожидаемые ошибки — напишите конкретный код для
их обработки. - Неожиданные ошибки — используйте операторы
обработки ошибок VBA для их обработки.
Оператор VBA On Error используется для обработки ошибок.
Этот оператор выполняет некоторые действия при возникновении ошибки во время
выполнения.
Есть четыре различных способа использовать это утверждение
- On Error Goto 0 — код останавливается на строке с ошибкой и отображает сообщение.
- On Error Resume Next — код перемещается на следующую строку. Сообщение об ошибке не отображается.
- On Error Goto [label] — код перемещается на определенную строку или метку. Сообщение об ошибке не отображается. Это тот, который мы используем для обработки ошибок.
- 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
Вторая строка присваивания приводит к ошибке деления на ноль. Когда мы запустим этот код, мы получим сообщение об ошибке, показанное на скриншоте ниже.
Когда появляется ошибка, вы можете выбрать End или Debug
Если вы выберете Конец, то приложение просто остановится.
Если вы выберете Отладить, приложение остановится на строке
ошибки, как показано на скриншоте ниже.
Это нормально, когда вы пишете код 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 переходит на метку 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. В этом разделе я покажу вам, как
реализовать простую стратегию обработки ошибок, которую вы можете использовать
во всех своих приложениях.
Основная реализация
Это простой обзор нашей стратегии
- Поместите строку On Error Goto Label в начале нашего верхнего Sub.
- Поместите Label у обработки ошибок в конце нашего верхнего
Sub. - Если происходит ожидаемая ошибка, обработайте ее и продолжайте.
- Если приложение не может продолжить работу, используйте Err.Raise для перехода к метке обработки ошибок.
- В случае непредвиденной ошибки код автоматически перейдет к метке обработки ошибок.
На следующем рисунке показан обзор того, как это выглядит
Следующий код показывает простую реализацию этой стратегии
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 чем-либо полезным, поэтому мы
должны сделать это сами.
В этом разделе я собираюсь представить более полную
стратегию ошибок. Я написал два сабвуфера, которые выполняют всю тяжелую
работу, поэтому все, что вам нужно сделать, это добавить их в свой проект.
Целью этой стратегии является предоставление вам стека * и
номера строки в случае возникновения ошибки.
* Стек — это список вспомогательных функций, которые
использовались в данный момент при возникновении ошибки.
Это наша стратегия
- Разместите обработку ошибок во всех
подпрограммах. - Когда происходит ошибка, обработчик ошибок
добавляет подробности к ошибке и вызывает ее снова. - Когда ошибка достигает самой верхней
подпрограммы, она отображается.
Мы просто «всплываем» из-за ошибки. Следующая диаграмма
показывает простое визуальное представление о том, что происходит, когда в Sub3
возникает ошибка
Единственная грязная часть этого — правильное форматирование
строк. Я написал две подводные лодки, которые справляются с этим, поэтому он
позаботится о вас.
Это две вспомогательные подводные лодки
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
Результат выглядит так
Если в вашем проекте есть номера строк, результат будет содержать номер строки ошибки.
Примечание: вы можете получить следующую ошибку при использовании этого кода:
“Programmatic Access to Visual Basic Project is not trusted”
Чтобы решить эту проблему, выполните следующие действия.
- Перейдите в раздел «Разработчик» на ленте и
нажмите «Macro Security», которая находится под кодом. - Нажмите «Настройка макроса» в левом списке.
- Поставьте флажок в поле «Доверительный доступ к
объектной модели проекта VBA». - Нажмите Ok.
Обработка ошибок в двух словах
- Обработка ошибок используется для обработки ошибок, возникающих во время работы приложения.
- Вы пишете определенный код для обработки ожидаемых ошибок. Вы используете оператор обработки ошибок VBA
On Error Goto [label] для отправки VBA на метку при возникновении непредвиденной ошибки. - Вы можете получить подробную информацию об ошибке из Err.Description.
- Вы можете создать свою собственную ошибку, используя Err.Raise.
- Использование одного оператора On Error в самой верхней подпрограмме перехватит все ошибки в подпрограммах, которые вызываются отсюда.
- Если вы хотите записать имя Sub с ошибкой, вы можете обновить ошибку и сбросить ее.
- Вы можете использовать журнал для записи информации о приложении, когда оно запущено.