Содержание
- Исправление ошибок компиляции — процесс компиляции
- Типы ошибок компиляции
- Ошибки компилятора — с чего начать?
- Анализ сообщения об ошибке
- Обработка непонятных или странных сообщений
- Ошибки компоновщика
- VBA Compile Error
- Undeclared Variables
- Undeclared Procedures
- Incorrect Coding – Expected End of Statement
- Missing References
- VBA Coding Made Easy
- VBA Code Examples Add-in
Исправление ошибок компиляции — процесс компиляции
Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile (или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning и error . Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …
Типы ошибок компиляции
Во-первых, давайте различать типы ошибок. Большинство компиляторов покажет три типа предупреждений во время компиляции:
- предупреждения компилятора;
- ошибки компилятора;
- ошибки компоновщика.
Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями. Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания = вместо оператора равенства == внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).
Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.
Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;) синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:
Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.
Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:
Как правило, процесс компиляции начинается с серии ошибок компиляции и предупреждений и, исправив их, вы столкнетесь с ошибками компоновщика. В свою очередь, я бы сначала исправлял ошибки компиляции, а затем ошибки компоновщика.
Ошибки компилятора — с чего начать?
Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!
Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:
код создаст переменную, MyStruct , с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).
Что-то вроде этого:
может привести к огромному количеству ошибок, возможно, включая сообщения:
Все это из-за одного символа! Лучше всего начать с самого верха.
Анализ сообщения об ошибке
Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:
- тип сообщения — предупреждение или ошибка;
- исходный файл, в котором появилась ошибка;
- строка ошибки;
- краткое описание того, что работает неправильно.
Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):
foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.
Более непонятным является другое сообщение об ошибке из той же попытки компиляции:
Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.
Будет гораздо хуже, если компилятор не будет сообщать вам, что произошло ранее в программе. Даже первая ошибка компилятора, которую вы получите, может быть связана с несколькими строками до указанного предупреждения.
Обработка непонятных или странных сообщений
Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!
Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.
Второе непонятное сообщение:
Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он, должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.
В конечном счете, если сообщение непонятное, то подходите к проблеме, думая, как компилятор пытается интерпретировать файл. Это может быть трудно, когда вы только начинаете, но если вы обращаете внимание на сообщения и попробуете понять, что они могли бы означать, вы быстро привыкнете к общим закономерностям.
Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.
Ошибки компоновщика
После того как вы окончательно исправили все ошибки синтаксиса, вздремнули, перекусили пару раз и морально подготовили себя к правильной компиляции программы, вы все равно можете столкнуться с ошибками компоновщика. Их часто довольно сложно исправить, потому что они не обязательно являются результатом того, что написано в вашей программе. Я вкратце опишу типичные видов ошибок компоновщика, которые можно ожидать, и некоторые пути их решения.
У вас могут возникнуть проблемы с тем, как вы настроили свой компилятор. Например, даже если включить нужные заголовочные файлы для всех ваших функций, вы все равно должны предоставить вашему компоновщику правильный путь в библиотеку, которая имеет фактическую реализацию. В противном случае, вы получите сообщение об ошибке:
Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.
Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в myClass.cpp , а ваша основная функция в myMain.cpp , компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o , то у него не будет определения класса, даже если вы правильно включите myClass.h !
Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.
Последний странный тип ошибки компоновщика — сообщение
Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main() . Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).
Источник
VBA Compile Error
In this Article
This tutorial will explain what a VBA Compile Error means and how it occurs.
Before running your code, the VBA Editor compiles the code. This basically means that VBA examines your code to make sure that all the requirements are there to run it correctly – it will check that all the variables are declared (if you use Option Explicit which you should!), check that all the procedures are declared, check the loops and if statements etc. By compiling the code, VBA helps to minimize any runtime errors occurring.
(See our Error Handling Guide for more information about VBA Errors)
Undeclared Variables
If you do not declare variables, but your Option Explicit is switched on at the top of your module, and then you run the macro, a compile error will occur.
If you click OK, the relevant procedure will go into debug mode.
Alternatively, before you run your code, you can force a compilation of the code.
In the Menu, select Debug > Compile Project.
The compiler will find any compile errors and highlight the first one it finds accordingly.
Undeclared Procedures
If you code refers to a procedure that does not exist, you will also get a compile error.
However, if the procedure – NextProcedure does not exist, then a compile error will occur.
Incorrect Coding – Expected End of Statement
If you create a loop using For..Each..Next or With..End With and forget to and the Next or the End With… you will also get a compile error.
The same will happen with an If statement if the End If is omitted!
Missing References
If you are using an Object Library that is not part of Excel, but you are using the objects from the library in your variable declaration, you will also receive a compile error.
This can be solved by either Late Binding – declaring the variables are Objects; or by adding the relevant Object Library to the Project.
In the Menu, select Tools > References and add the relevant object library to your project.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Источник
В этой инструкции описано, как устранить проблему, когда при запуске надстройки «Парсер сайтов» появляется сообщение об ошибке компиляции такого вида:
Compile error in hidden module: mod_AACTIONS.
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.
Причины проблемы
Проблема чаще всего проявляется на Office 2013, и вызвана тем, что некоторые скриптовые элементы управления в Office 2013 считаются «устаревшими» по соображениям безопасности.
В надстройке «Парсер сайтов» проблема вызвана использованием компонента Web Browser на формах VBA.
Подробно о причинах проблемы (Kill Bit) и способах решения написано в статьях на сайте Microsoft: ссылка1, ссылка2.
Как проверить, действительно ли в вашем случае проблема именно эта:
- В меню Excel нажимаем Файл — Параметры — Настройка ленты, и включаем галочку для отображения вкладки «Разработчик»
- На ленте Excel на вкладке «Разработчик» нажимаем Вставить — Элементы ActiveX — Другие элементы управления (см. скриншот)
- В появившемся диалоговом окне ищем пункт «Microsoft Web Browser», и нажимаем ОК (см. скриншот)
- Рисуем мышкой прямоугольник на листе Excel.
Если объект появился на листе (см. скриншот), то в вашем случае присутствует какая-то другая проблема (описанное в инструкции не поможет).
Если же выскочило сообщение об ошибке «Вставка обьекта неосуществима» / «Cannot insert object», то в этой инструкции описан как раз ваш случай.
Как решить проблему с ошибкой компиляции:
- запускаете (предварительно надо извлечь файл из архива) прикреплённый к статье файл VBA_WebBrowser_FixCompilationError.reg,
на вопрос «Вы действительно хотите добавить информацию из этого файла в реестр» отвечаете «ДА» - перезапускаете Excel (если не поможет, то перезагружаете компьютер)
Содержимое файла VBA_WebBrowser_FixCompilationError.reg:
{8856F961-340A-11D0-A96B-00C04FD705A2} — идентификатор для компонента Web Browser Control
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftOffice 15.0ClickToRunREGISTRYMACHINESoftwareWow6432Node MicrosoftOffice15.0CommonCOM Compatibility {8856F961-340A-11D0-A96B-00C04FD705A2}]
«Compatibility Flags»=dword:00000000[HKEY_LOCAL_MACHINESOFTWAREMicrosoftOffice 16.0ClickToRunREGISTRYMACHINESoftware Wow6432NodeMicrosoftOffice16.0 CommonCOM Compatibility{8856F961-340A-11D0-A96B-00C04FD705A2}]
«Compatibility Flags»=dword:00000000[HKEY_LOCAL_MACHINESOFTWAREWow6432Node MicrosoftOffice15.0 CommonCOM Compatibility {8856F961-340A-11D0-A96B-00C04FD705A2}]
«Compatibility Flags»=dword:00000000[HKEY_LOCAL_MACHINESOFTWAREWow6432Node MicrosoftOffice16.0 CommonCOM Compatibility {8856F961-340A-11D0-A96B-00C04FD705A2}]
«Compatibility Flags»=dword:00000000[HKEY_LOCAL_MACHINESOFTWAREMicrosoft OfficeCommonCOM Compatibility {00024512-0000-0000-C000-000000000046}]
«Compatibility Flags»=dword:00000000[HKEY_LOCAL_MACHINESoftwareWow6432Node MicrosoftOfficeCommonCOM Compatibility {00024512-0000-0000-C000-000000000046}]
«Compatibility Flags»=dword:00000000
From Wikipedia, the free encyclopedia
Compilation error refers to a state when a compiler fails to compile a piece of computer program source code, either due to errors in the code, or, more unusually, due to errors in the compiler itself. A compilation error message often helps programmers debugging the source code. Although the definitions of compilation and interpretation can be vague, generally compilation errors only refer to static compilation and not dynamic compilation. However, dynamic compilation can still technically have compilation errors,[citation needed] although many programmers and sources may identify them as run-time errors. Most just-in-time compilers, such as the Javascript V8 engine, ambiguously refer to compilation errors as syntax errors since they check for them at run time.[1][2]
Examples[edit]
Common C++ compilation errors[edit]
- Undeclared identifier, e.g.:
doy.cpp: In function `int main()':
[3]
doy.cpp:25: `DayOfYear' undeclared (first use this function)
This means that the variable «DayOfYear» is trying to be used before being declared.
- Common function undeclared, e.g.:
xyz.cpp: In function `int main()': xyz.cpp:6: `cout' undeclared (first use this function)
[3]
This means that the programmer most likely forgot to include iostream.
- Parse error, e.g.:
somefile.cpp:24: parse error before `something'
[4]
This could mean that a semi-colon is missing at the end of the previous statement.
Internal Compiler Errors[edit]
An internal compiler error (commonly abbreviated as ICE) is an error that occurs not due to erroneous source code, but rather due to a bug in the compiler itself. They can sometimes be worked around by making small, insignificant changes to the source code around the line indicated by the error (if such a line is indicated at all),[5][better source needed] but sometimes larger changes must be made, such as refactoring the code, to avoid certain constructs. Using a different compiler or different version of the compiler may solve the issue and be an acceptable solution in some cases. When an internal compiler error is reached many compilers do not output a standard error, but instead output a shortened version, with additional files attached, which are only provided for internal compiler errors. This is in order to insure that the program doesn’t crash when logging the error, which would make solving the error nigh impossible. The additional files attached for internal compiler errors usually have special formats that they save as, such as .dump
for Java. These formats are generally more difficult to analyze than regular files, but can still have very helpful information for solving the bug causing the crash.[6]
Example of an internal compiler error:
somefile.c:1001: internal compiler error: Segmentation fault Please submit a full bug report, with preprocessed source if appropriate. See <http://bugs.gentoo.org/> for instructions.
References[edit]
- ^ «Errors | Node.js v7.9.0 Documentation». nodejs.org. Retrieved 2017-04-14.
- ^ «SyntaxError». Mozilla Developer Network. Retrieved 2017-04-14.
- ^ a b «Common C++ Compiler and Linker Errors». Archived from the original on 2008-02-16. Retrieved 2008-02-12.
- ^ «Compiler, Linker and Run-Time Errors».
- ^ Cunningham, Ward (2010-03-18). «Compiler Bug». WikiWikiWeb. Retrieved 2017-04-14.
- ^ జగదేశ్. «Analyzing a JVM Crash». Retrieved 2017-04-15.
Return to VBA Code Examples
This tutorial will explain what a VBA Compile Error means and how it occurs.
Before running your code, the VBA Editor compiles the code. This basically means that VBA examines your code to make sure that all the requirements are there to run it correctly – it will check that all the variables are declared (if you use Option Explicit which you should!), check that all the procedures are declared, check the loops and if statements etc. By compiling the code, VBA helps to minimize any runtime errors occurring.
(See our Error Handling Guide for more information about VBA Errors)
Undeclared Variables
If you do not declare variables, but your Option Explicit is switched on at the top of your module, and then you run the macro, a compile error will occur.
If you click OK, the relevant procedure will go into debug mode.
Alternatively, before you run your code, you can force a compilation of the code.
In the Menu, select Debug > Compile Project.
The compiler will find any compile errors and highlight the first one it finds accordingly.
Undeclared Procedures
If you code refers to a procedure that does not exist, you will also get a compile error.
For example:
Sub CallProcedure()
'some code here then
Call NextProcedure
End Sub
However, if the procedure – NextProcedure does not exist, then a compile error will occur.
Incorrect Coding – Expected End of Statement
If you create a loop using For..Each..Next or With..End With and forget to and the Next or the End With… you will also get a compile error.
Sub CompileError()
Dim wb As Workbook
Dim ws As Worksheet
For Each ws In wb
MsgBox ws.Name
End Sub
The same will happen with an If statement if the End If is omitted!
Missing References
If you are using an Object Library that is not part of Excel, but you are using the objects from the library in your variable declaration, you will also receive a compile error.
This can be solved by either Late Binding – declaring the variables are Objects; or by adding the relevant Object Library to the Project.
In the Menu, select Tools > References and add the relevant object library to your project.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:
- Ошибки компиляции
- Ошибки выполнения
- Логические ошибки (баги)
Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.
Содержание
- Ошибки компиляции
- Ошибки выполнения
- Перехват ошибок выполнения
- Логические ошибки
Ошибки компиляции
Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.
Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.
Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.
В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.
Например, сообщение «Compile error: Variable not defined» при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).
Ошибки выполнения
Ошибки выполнения возникают в процессе выполнения кода и приводят к остановке выполнения программы. Этот тип ошибок VBA, как правило, также не сложно обнаружить и исправить, так как сообщается информация о характере ошибки и место в коде, где произошла остановка.
Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение «Run-time error ’11’: Division by zero«.
В зависимости от структуры проекта VBA, может быть предложено выполнить отладку кода (как показано на рисунке ниже). В этом случае при нажатии на кнопку Debug (в окне сообщения о необходимости отладки) будет выделена цветом строка кода, которая стала причиной ошибки VBA.
Получив такое сообщение и видя выделенную строку кода, как в приведённом выше примере, обнаружить причину ошибки будет совсем не сложно.
В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).
Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:
5 | Недопустимый вызов процедуры (Invalid procedure call) |
7 | Недостаточно памяти (Out of memory) |
9 | Индекс вне заданного диапазона (Subscript out of range)
Эта ошибка возникает при попытке обратиться к элементу массива за пределами заданного размера массива – например, если объявлен массив с индексами от 1 до 10, а мы пытаемся обратиться к элементу этого же массива с индексом 11. |
11 | Деление на ноль (Division by zero) |
13 | Несоответствие типа (Type mismatch)
Эта ошибка возникает при попытке присвоить переменной значение не соответствующего типа – например, объявлена переменная i типа Integer, и происходит попытка присвоить ей значение строкового типа. |
53 | Файл не найден (File not found)
Иногда возникает при попытке открыть не существующий файл. |
Перехват ошибок выполнения
Не все ошибки выполнения бывают вызваны недочётами в коде. Например, ошибки VBA не удастся избежать, если для работы макроса необходимо открыть файл с данными, а этого файла не существует. В таких случаях признаком профессионализма будет перехват ошибок и написание кода VBA, который будет выполняться при их возникновении. Таким образом, вместо неприятных сбоев будет происходить изящное завершение работы макроса.
Для того, чтобы помочь справиться с возникающими ошибками, VBA предоставляет разработчику операторы On Error и Resume. Эти операторы отслеживают ошибки и направляют выполнение макроса в специальный раздел кода VBA, в котором происходит обработка ошибки. После выполнения кода обработки ошибки, работа программы может быть продолжена с того места, где возникла ошибка, или макрос может быть остановлен полностью. Далее это показано на примере.
'Процедура 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 (на английском).
Оцените качество статьи. Нам важно ваше мнение:
No matter how experienced you’re with VBA coding, errors are always going to be a part of it.
The difference between a novice and an expert VBA programmer is that the expert programmers know how to effectively handle and use errors.
In this tutorial, I will show you various ways you can use to handle errors effectively in Excel VBA.
Before we get into VBA error handling, let’s first understand the different types of errors you are likely to encounter when programming in Excel VBA.
Types of VBA Errors in Excel
There are four types of errors in Excel VBA:
- Syntax errors
- Compilation errors
- Runtime errors
- Logical Errors
Let’s quickly understand what these errors are and when you’re likely to encounter these.
Syntax Error
A syntax error, as the name suggests, occurs when VBA finds something wrong with the syntax in the code.
For example, if you forget a part of the statement/syntax that is needed, then you will see the compile error.
In the below code, as soon as I hit enter after the second line, I see a compile error. This is because the IF statement needs to have the ‘Then‘ command, which is missing in the below code.
Note: When you are typing a code in Excel VBA, it checks for each sentence as soon as you hit enter. If VBA finds something missing in the syntax, it instantly shows a message with some text that can help you understand the missing part.
To make sure you see the syntax error whenever there is something missing, you need to make sure Autosyntax check is enabled. To do this, click on ‘Tools’ and then click on ‘Options’. In the options dialog box, make sure that the ‘Auto Syntax Check’ option is enabled.
If the ‘Auto Syntax Check’ option is disabled, VBA will still highlight the line with the syntax error in red, but it will not show the error dialog box.
Compile Error
Compile errors occur when something is missing that is needed for the code to run.
For example, in the below code, as soon as I try to run the code, it will show the following error. This happens as I have used the IF Then statement without closing it with the mandatory ‘End If’.
A syntax error is also a type of compile error. A syntax error occurs as soon as you hit enter and VBA identifies that something is missing. A compilation error can also occur when VBA doesn’t find anything missing while typing the code, but it does when the code is compiled or executed.
VBA checks each line as you’re typing the code and highlights the syntax error as soon as the line is incorrect and you hit enter. Compile errors, on the other hand, are only identified when the entire code is analyzed by VBA.
Below are some scenarios where you’ll encounter the compile error:
- Using an IF Statement without the End IF
- Using For statement with the Next
- Using Select statement without using the End Select
- Not declaring the variable (this works only when Option Explicit is enabled)
- Calling a Sub/Function that does not exist (or with wrong parameters)
Note about ‘Option Explicit’: When you add ‘Option Explicit’, you will be required to declare all the variables before running the code. If there is any variable that has not been declared, VBA would show an error. This is a good practice as it shows an error in case you have a misspelled variable. You can read more about Option Explicit here.
Run Time Errors
Runtime errors are those that occur when the code is running.
Run time errors will occur only when all the syntax and compile errors are being taken care of.
For example, if you run code that is supposed to open an Excel workbook, but that workbook is unavailable (either deleted or name changed), your code would give you a runtime error.
When a runtime error occurs, it will stop the code and show you the error dialog box.
The message in the Run-time error dialog box is a little more helpful. It tries to explain the problem that can help you correct it.
If you click on the Debug button, it will highlight the part of the code that is leading to the error.
If you have corrected the error, you can click on the Run button in the toolbar (or press F5) to continue running the code from where it left.
Or you can also click on the End button to come out of the code.
Important: In case you click the End button in the dialog box, it will stop the code at the line at which is encountered. However, all the lines of code before that would have been executed.
Logical Errors
Logical errors would not make your code stop but can lead to wrong results. These could also be the most difficult types of errors to troubleshoot.
These errors are not highlighted by the compiler and need to be manually tackled.
One example of logical error (that I often find myself stuck with) is running into an endless loop.
Another example could be when it gives a result which is wrong. For example, you may end up using a wrong variable in the code or add two variables where one is incorrect.
There are a few ways I use to tackle logical errors:
- Insert Message Box at some place in the code and highlight values/data that can help understand if eberything is going as expected.
- Instead of running the code at one go, go through each line one by one. To do this, click anywhere in the code and press F8. you would notice that each time you press F8, one line gets executed. This allows you to go through the code one line at a time and identify the logical errors.
Using Debug to Find Compile/Syntax Errors
Once you’re done with the code, it’s a good practice to first compile it before running.
To compile a code, click on the Debug option in the toolbar and click on Compile VBAProject.
When you compile a VBA project, it goes through the code and identifies errors (if any).
In case it finds an error, it will show you a dialog box with the error. It finds errors one by one. So if it finds an error and you have corrected it, you need to run compile again to find other errors (if there are).
When you’re code is free of errors, the Compile VBAProject option will be greyed out.
Note that Compiling will only find ‘Syntax’ errors and ‘Compile’ errors. It will NOT find the run-time errors.
When you’re writing VBA code, you don’t want the errors to crop up. To avoid this, there are many error-handling methods you can use.
In the next few sections of this article, I will be covering the methods you can use for VBA error handling in Excel.
Configure Error Settings (Handled Vs Unhandled Errors)
Before you start working with your code, you need to check for one setting in Excel VBA.
Go to the VBA toolbar and click on Tools and then click on Options.
In the Options dialog box, click on the General tab and make sure that within the ‘Error Trapping’ group, ‘Break on Unhandled Errors’ is checked.
Let me explain the three options:
- Break on All Errors: This will stop your code on all types of errors, even when you have used the techniques to handle these errors.
- Break in Class Module: This will stop your code on all unhandled errors, and at the same time, if you’re using objects such as Userforms, it will also break within those objects and highlight the exact line causing the error.
- Break on Unhandled Errors: This will stop your code only for those errors that are not handled. This is the default setting as it ensures any unhandled errors are brought to your notice. If you’re using objects such as Userforms, this will not highlight the line causing the error in the object, but will only highlight the line that’s referring to that object.
Note: If you work with objects such as Userforms, you can change this setting to ‘Break on Class Modules’. The difference between #2 and #3 is that when you use Break in Class Module, it will take you to the specific line in the object that is causing the error. You can also choose to go with this instead of ‘Break on Unhandled Errors’.
So in a nutshell – if you’re just starting with Excel VBA, ensure ‘Break on Unhandled Errors’ is checked.
VBA Error Handling with ‘On Error’ Statements
When your code encounters an error, there are a few things you can do:
- Ignore the error and let the code continue
- Have an error handling code in place and run it when an error occurs
Both of these error handling methods ensures that the end user will not get to see an error.
There are a few ‘On Error’ statements that you can use to get these done.
On Error Resume Next
When you use ‘On Error Resume Next’ in your code, any encountered error will be ignored and the code will continue to run.
This error handling method is used quite often, but you need to be cautious when using it. Since it completely ignores any error that may occur, you may not be able to identify the errors that need to be corrected.
For example, if the below code is run, it will return an error.
Sub AssignValues() x = 20 / 4 y = 30 / 0 End Sub
This happens because you can not divide a number by zero.
But if I use the ‘On Error Resume Next’ statement in this code (as shown below), it will ignore the error and I will not know that there is an issue that needs to be corrected.
Sub AssignValues() On Error Resume Next x = 20 / 4 y = 30 / 0 End Sub
On Error Resume Next should be used only when you clearly know the kind of errors your VBA code is expected to throw and it’s alright to ignore it.
For example, below is the VBA event code that would instantly add the date and time value in cell A1 of a newly inserted sheet (this code is added in the worksheet and not in a module).
Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
While this works great in most cases, it would show an error if I add a chart sheet instead of a worksheet. Since a chart sheet does not have cells, the code would throw an error.
So, if I use the ‘On Error Resume Next’ statement in this code, it will work as expected with worksheets and do nothing with chart sheets.
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Note: On Error Resume Next Statement is best used when you know what kind of errors you’re likely to encounter. And then if you think it’s safe to ignore these errors, you can use it.
You can take this code to the next level by analyzing if there was an error, and displaying a relevant message for it.
The below code would show a message box that would inform the user that a worksheet has not been inserted.
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") If Err.Number <> 0 Then MsgBox "Looks like you inserted a chart sheet" & vbCrLf & "Error - " & Err.Description End If End Sub
‘Err.Number’ is used to get the error number and ‘Err.Description’ is used to get the error description. These will be covered later in this tutorial.
On Error GoTo 0
‘On Error GoTo 0’ will stop the code on the line that causes the error and shows a message box that describes the error.
In simple terms, it enables the default error checking behavior and shows the default error message.
Then why even use it?
Normally, you don’t need to use ‘On Error Goto 0’, but it can be useful when you use it in conjunction with ‘On Error Resume Next’
Let me explain!
The below code would select all the blank cells in the selection.
Sub SelectFormulaCells() Selection.SpecialCells(xlCellTypeBlanks).Select End Sub
But it would show an error when there are no blank cells in the selected cells.
So to avoid showing the error, you can use On Error Resume next’
Now, it will also show any error when you run the below code:
Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select End Sub
So far, so good!
The problem arises when there is a part of the code where error can occur, and since you’re using ‘On Error Resume Next’, the code would simply ignore it and move to the next line.
For example, in the below code, there would no error prompt:
Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select ' .. more code that can contain error End Sub
In the above code, there are two places where an error can occur. The first place is where we are selecting all blank cells (using Selection.SpecialCells) and the second is in the remaining code.
While the first error is expected, any error after that is not.
This is where On Error Goto 0 comes to rescue.
When you use it, you reset the error setting to default, where it will start showing errors when it encounters it.
For example, in the below code, there would be no error in case there are no blank cells, but there would be an error prompt because of ’10/0′
Sub SelectFormulaCells() On Error Resume Next Selection.SpecialCells(xlCellTypeBlanks).Select On Error GoTo 0 ' .. more code that can contain error End Sub
On Error Goto [Label]
The above two methods – ‘On Error Resume Next’ and ‘On Error Goto 0’ – doesn’t allow us to truly handle the error. One makes the code ignore the error and the second one resume error checking.
On Error Go [Label] is a way with which you can specify what you want to do in case your code has an error.
Below is the code structure that uses this error handler:
Sub Test() On Error GoTo Label: X = 10 / 0 'this line causes an error ' ....your remaining code goes here Exit Sub Label: ' code to handle the error End Sub
Note that before the Error handling ‘Label’, there is an Exit Sub. This ensures that in case there are no errors, the sub is exited and the ‘Label’ code is not executed. In case you don’t use Exit Sub, it will always execute the ‘Label’ code.
In the example code below, when an error occurs, the code jumps and executes the code in the handler section (and shows a message box).
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" & vbCrLf & Err.Description End Sub
Note that when an error occurs, the code has already run and executed the lines before the line causing the error. In the above example, the code sets the value of X as 12, but since the error occurs in the next line, it doesn’t set the values for Y and Z.
Once the code jumps to the error handler code (ErrMsg in this example), it will continue to execute all the lines in and below the error handler code and the exit the sub.
On Error Goto -1
This one is a bit complicated, and in most cases, you’re unlikely to use this.
But I will still cover this as I have faced a situation where this was needed (feel free to ignore and jump to the next section if you’re only looking for basics).
Before I get into the mechanics of it, let me try and explain where can it be useful.
Suppose you have a code where an error is encountered. But all is good as you have one error handler in place. But what happens when there is another error in the error handler code (yeah.. somewhat like the inception movie).
In such a case, you can not use the second handler as the first error has not been cleared. So while you have handled the first error, in VBA’s memory it still exists. And the VBA memory only has a place for one error – not two or more than that.
In this scenario, you can use On Error Goto -1.
It clears the error and frees up VBA memory to handle the next error.
Enough talk!
Let’s me explain now by using examples.
Suppose I have the below code. This will throw an error as there is division by zero.
Sub Errorhandler() X = 12 Y = 20 / 0 Z = 30 End Sub
So to handle it, I use an error handler code (with the name ErrMsg) as shown below:
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" & vbCrLf & Err.Description End Sub
All is good now again. As soon as the error occurs, the error handler is used and shows a message box as shown below.
Now, I expand the code so that I have more code in or after the error handler.
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" & vbCrLf & Err.Description A = 10 / 2 B = 35 / 0 End Sub
Since the first error has been handled but the second has not been, I again see an error as shown below.
Still all good. The code is behaving in the way we expected it to.
So to handle the second error, I use another error handler (ErrMsg2).
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "There seems to be an error again" & vbCrLf & Err.Description End Sub
And this is where it doesn’t work as expected.
If you run the above code, it will still give you a run-time error, even after having the second error handler in place.
This happens as we didn’t clear the first error from VBA’s memory.
Yes, we handled it! But it still remains in the memory.
And when VBA encounters another error, it’s still stuck with the first error, and hence the second error handler is not used. The code stops at the line that caused the error and shows the error prompt.
To clear VBA’s memory and clear the previous error, you need to use the ‘On Error Goto -1’.
So if you add this line in the below code and run it, it will work as expected.
Sub Errorhandler() On Error GoTo ErrMsg X = 12 Y = 20 / 0 Z = 30 Exit Sub ErrMsg: MsgBox "There seems to be an error" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "There seems to be an error again" & vbCrLf & Err.Description End Sub
Note: The error automatically gets cleared when a subroutine ends. So, ‘On Error Goto -1’ can be useful when you’re getting two or more than two errors in the same subroutine.
The Err Object
Whenever an error occurs with a code, it’s the Err object that is used to get the details about the error (such as the error number or the description).
Err Object Properties
The Err Object has the following properties:
Property | Description |
Number | A number that represents the type of error. When there is no error, this value is 0 |
Description | A short description of the error |
Source | Project name in which the error has occurred |
HelpContext | The help context id for the error in the help file |
HelpFile | A string that represents the folder location and the file name of the help file |
While in most cases you don’t need to use Err object, it can sometimes be useful while handling errors in Excel.
For example, suppose you have a dataset as shown below and for each number, in the selection, you want to calculate the square root in the adjacent cell.
The below code can do it, but since there is a text string in cell A5, it shows an error as soon as this occurs.
Sub FindSqrRoot() Dim rng As Range Set rng = Selection For Each cell In rng cell.Offset(0, 1).Value = Sqr(cell.Value) Next cell End Sub
The problem with this type of error message is that it gives you nothing about what has gone wrong and where the issue occurred.
You can use the Err object to make these error messages more meaningful.
For example, if I now use the below VBA code, it will stop the code as soon as the error occurs and show a message box with the cell address of the cell where there is an issue.
Sub FindSqrRoot() Dim rng As Range Set rng = Selection For Each cell In rng On Error GoTo ErrHandler cell.Offset(0, 1).Value = Sqr(cell.Value) Next cell ErrHandler: MsgBox "Error Number:" & Err.Number & vbCrLf & _ "Error Description: " & Err.Description & vbCrLf & _ "Error at: " & cell.Address End Sub
The above code would give you a lot more information than the simple ‘Type Mismatch’, especially the cell address so that you know where the error occurred.
You can further refine this code to make sure your code runs until the end (instead of breaking at each error) and then gives you a list of cell address where the error occurs.
The below code would do this:
Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For Each cell In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number <> 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Error in the following cells" & ErrorCells Exit Sub End Sub
The above code runs until the end and gives the square root of all the cells that have numbers in it (in the adjacent column). It then shows a message that lists all the cells where there was an error (as shown below):
Err Object Methods
While the Err properties are useful to show useful information about the errors, there are two Err methods as well that can help you with error handling.
Method | Description |
Clear | Clears all the property settings of the Err object |
Raise | Generates a run-time error |
Let’s quickly learn what these are and how/why to use these with VBA in Excel.
Err Clear Method
Suppose you have a dataset as shown below and you want to get the square root of all these numbers in the adjacent column.
The following code will get the square roots of all the numbers in the adjacent column and show a message that an error occurred for cell A5 and A9 (as these have text in it).
Sub FindSqrRoot2() Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Selection For Each cell In rng cell.Offset(0, 1).Value = Sqr(cell.Value) If Err.Number <> 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Error in the following cells" & ErrorCells End Sub
Note that I have used the Err.Clear method within the If Then statement.
Once an error has occurred and trapped by the If condition, Err.Clear method resets the error number back to 0. This ensures that IF condition only trap the errors for cells where it is raised.
Had I not used the Err.Clear method, once the error occurs, it would always be true in the IF condition, and the error number has not been reset.
Another way of making this work is by using the On Error Goto -1, which resets the error completely.
Note: Err.Clear is different from On Error Goto -1. Err.Clear only clears the error description and the error number. it doesn’t completely reset it. This means that if there is another instance of error in the same code, you won’t be able to handle it before resetting it (which can be done with ‘On Error Goto -1’ and not by ‘Err.Clear’).
Err Raise Method
The Err.Raise method allows you to raise a run-time error.
Below is the syntax of using the Err.Raise method:
Err.Raise [number], [source], [description], [helpfile], [helpcontext]
All these arguments are optional and you can use these to make your error message more meaningful.
But why would you ever want to raise an error yourself?
Good question!
You can use this method when there is an instance of an error (which means that there is going to an error anyway) and then you use this method to tell the user more about the error (instead of the less helpful error message that VBA shows by default).
For example, suppose you have a dataset as shown below and you want all the cells to have numeric values only.
Sub RaiseError() Dim rng As Range Set rng = Selection On Error GoTo ErrHandler For Each Cell In rng If Not (IsNumeric(Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", "Test.html" End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
The above code would show an error message that has the specified description and the context file.
Personally, I have never used Err.Raise as I mostly work with Excel only. But for someone who uses VBA to work with Excel along with other applications such as Outlook, Word or PowerPoint, this can be useful.
Here is a detailed article on Err.Raise method in case you want to learn more.
VBA Error Handling Best Practices
No matter how skilled you get a writing VBA code, errors are always going to be a part of it. The best coders are those who have the skills to handle these errors properly.
Here are some best practices you can use when it comes to error handling in Excel VBA.
- Use ‘On Error Go [Label]’ at the beginning of the code. This will make sure any error that can happen from there is handled.
- Use ‘On Error Resume Next’ ONLY when you’re sure about the errors that can occur. Use it with expected error only. In case you use it with unexpected errors, it will simply ignore it and move forward. You can use ‘On Error Resume Next’ with ‘Err.Raise’ if you want to ignore a certain type of error and catch the rest.
- When using error handlers, make sure you’re using Exit Sub before the handlers. This will ensure that the error handler code is executed only when there is an error (else it will always be executed).
- Use multiple error handlers to trap different kinds of errors. Having multiple error handler ensures that an error is properly addressed. For example, you would want to handle a ‘type mismatch’ error differently than a ‘Division by 0’ run-time error.
Hope you found this Excel article useful!
Here are some more Excel VBA Tutorials that you may like:
- Excel VBA Data Types – A Complete Guide
- Excel VBA Loops – For Next, Do While, Do Until, For Each
- Excel VBA Events – An Easy (and Complete) Guide
- Excel Visual Basic Editor – How to Open and Use it in Excel
Contents
- Introduction
- Types of errors in VBA
- Syntax Error
- Compile Error
- Run Time Errors
- Possible reasons for the “Expected: end of statement” error
Introduction
Every programming language has its own grammar and vocabulary — technically known as syntax. Having a mastery of any language implies that you have a sound knowledge of its syntax.
As a beginner in VBA, you might be confronted with frustrating errors like the “Expected: end of statement” error. Be rest assured, no matter how experienced you’re with VBA coding, errors are always going to be a part of it.
The difference between a novice and an expert VBA programmer is that the expert programmers know how to effectively handle and use errors. This article will help you better understand the error above.
Types of errors in VBA
There are three types of errors in VBA: syntax errors, compile errors, and runtime errors.
Syntax Error
A syntax error, as you can guess from the name, occurs when VBA finds something wrong with the syntax in your code. When you type a line of code, VBA checks if the syntax is correct.
As soon as you hit enter, if VBA finds that something is missing in the syntax, it instantly shows a message with some text that can help you understand the missing part, as you can see in the screenshot below:
Note: You need to enable the ‘Auto Syntax Check’ in the VBA option for the error dialog box to appear when there is an error. If not, VBA will only highlight the line without showing the error dialog box. The gif below shows you how to enable the error dialog box in VBA.
Compile Error
Compile errors occur when something is missing that is needed for the code to run. For example, in the code below, as soon as you run the code, it will show an error.
Note the difference between the syntax error and the compile error. The syntax error occurs even before you run the code and the font of the problematic line turns to red. The compile error occurs when you try to run the code and VBA identifies that something is missing.
Run Time Errors
Runtime errors are those that occur when the code is running. Run time errors will occur only when all the syntax and compile errors have been taken care of. They are not due to errors in the code itself, but rather due to factors external to the code — like a wrong input by the user, or an object that is not existing.
For example, if you run code that is supposed to activate an Excel worksheet, but that worksheet is unavailable (either deleted or its name changed), your code would give you a runtime error.
Unlike with the two previous errors, when a runtime error occurs, the message in the Run-time error dialog box is a little more explicit because it explains the problem and that can help you correct it.
Coming back to our specific error (“Expected: end of statement”), let’s write and run some code that will generate the error.
Step 1: Open the Visual Basic Editor and create a new module as seen in the gif below.
Step 2: Write or copy and paste the following code:
Sub GenerateError() Dim i As Integer = 5 End Sub
Before you even run the code, you will have the following result:
The error comes from the fact that two statements have been written in one line instead of two. The code should be:
Line 1: Dim i As Integer
Line 2: i = 5
Possible reasons for the “Expected: end of statement” error
From the types of errors in VBA described above, you must have guessed that the “Expected: end of statement” error is a syntax error. As such, the possible reasons for the error are as varied as the number of mistakes that you can make while writing a line of code.
Without being exhaustive, below is a list of possible reasons for that error:
1) Writing two statements in one line (see the example above)
How to fix: Check to see if two different statements have inadvertently been put on the same line then send the second statement to a new line.
2) Absence of parentheses
How to fix: Make sure you have parentheses (both open and close) where necessary.
3) Absence of white space
How to fix: Any identifier that is immediately followed by a &
, like name&
and affiliation&
, is interpreted as a Long variable, so the lack of whitespace in front of the concatenation operator (&) is causing a parse error. To solve the problem, you just need to put a space between the variables and the concatenation operator. Instead of writing name&
, write name &
.
When talking about MS Office error messages, it’s always a long story. Users would report hundreds of different error messages they received when they open Word, Excel, or PowerPoint. For some common errors like Runtime Error 1004 or add-in template is not valid, we have already introduced how can you fix them. This time, we will talk about another error message — Compile error in hidden module.
Users often received this error message when they start Excel. In rare times, when users start MS Word, this error would also pop up. Usually, users would see one of the following error messages:
- Compile error in hidden module: AutoExec
- Compile error in hidden module: AutoExecNew
- Compile error in hidden module: DistMon
The different suffixes indicate that you have different culprits to blame, and that’s why there is more than one solution for you to solve the problem. Before checking the solutions, you should know the reasons why you see these error messages.
Why Do I See the Error Message of Compile Error in Hidden Module?
Now Office 2016 is upgraded from a 32-bit version to a 64-bit version. The Compile error in hidden module error message usually appears when there are dome 32-bit add-ins versions of the office in your computer, and they are incompatible with the 64-bit version.
Two common conditions that would cause this error are as follow:
1. When MS Excel startup folder contains both the following two template files on Adobe Acrobat PDF Maker add-in:
- Pdfmaker.dot
- Pdfmaker.xla
2. Your computer has installed the Norton Anti-virus software.
After knowing what causes this error message, now it’s time to apply the solutions. Here we have listed four solutions, you can try them one by one until you solve the problem.
Method 1. Re-register OCX Files with CMD
The first solution you can try is to re-register some basic Excel function files. In this method, we need to apply Windows Command Prompt.
Step 1. Press Windows + R keys at the same time. Type cmd in the run box.
Step 2. Type the following command and press Enter.
For 32-bit:
regsvr32 -u c:windowssystem32mscomctl.ocx
regsvr32 c:windowssystem32mscomctl.ocx
For 64-bit:
regsvr32 -u c:windowssystem64mscomctl.ocx
regsvr32 c:windowssystem64mscomctl.ocx
Step 3. Now run MS Excel again to check if the error message still exists.
Method 2. Delete .exd Files
The exd file is a control information cache file of Microsoft Office. These files are created when a user inserts an ActiveX control into a document using the Control Toolbox in an MS Office program. You can delete this cache file to see if it can fix the Compile error in the hidden module error.
Step 1. Press Windows + R keys at the same time. Type %appdata% in the run box.
Step 2. It will open your AppData folder. Go to Roaming > Microsoft > Forms.
Step 3. Find the .exd files, select comctllib.exd and mscomctllib.exd, and delete these two files.
Step 4. Restart your Excel and check if the problem is solved.
Method 3. Move PDF Maker Files
As we have mentioned above, one of the reasons you will see this error message is because there are two template files on Adobe Acrobat PDF Maker add-in. So in this method, you can move the PDF Maker files to another place to fix your problem. Here are the detailed steps.
Step 1. Open Windows File Explorer, search pdfmaker.* on your computer.
Step 2. Choose the pdfmaker.dot and pdfmaker.xla files, right-click on both files, and select cut.
Step 3. Paste these two files to your Desktop.
Now you can restart the MS Excel to see if the problem is solved.
Method 4. Update to the Latest Adobe Acrobat
If the above methods can’t help you solve the Compile error in hidden module problem, the last resort is to update the Adobe Acrobat to the latest version. It’s because this problem is associated with the Adobe Acrobat that is installed on your computer.
Go to the Adobe official website, find the latest version of Acrobat, download and install it on your computer.
How to Fix Word Runtime Error 91?
A runtime error is a common program error that usually occurs in Microsoft Office software. This article will you what is the reason for this error, and how to fix it.
Bonus Solution: Repair Damaged or Corrupted MS Excel Efficiently
With the above methods, you might have solved the Excel Compile error in the hidden module issue. Then we’d like to share a good bonus tool — EaseUS Data Recovery Wizard with you.
This is an advanced 4-in-1 specialized fix tool that enables you to repair corrupted PDF documents and Office files in multiple formats. If your documents got damaged, Stellar file repair software will scan and repair them efficiently.
If you want to try on this file repair software, you can download it and follow the guide to see how to use this tool. In the following guide, we have introduced how to repair Excel documents.
Step 1. Launch EaseUS Data Recovery Wizard. Select a disk location where the corrupted files are saved. Click «Scan» to start finding the broken files. EaseUS file repair tool allows you to fix damaged documents, videos, and pictures in differnet formats.
Step 2. After scanning, you can quickly find corrupt data by file type. If you want to repair damaged Word, Excel, or PDF, select Documents and filter a specific category. For pictures and videos repair, all the common types are suppored, including JPEG, PNG, BMP, MOV, MP4, GIF, and more.
Step 3. EaseUS file repair software will automatically fix broken files. You can preview the repaired files before recovery. Last, click «Recover» and save the recovered files to a different location to avoid data overwriting.
The Bottom Line
That’s all about Compile error in hidden module error message. Hope you can fix your problem after reading this article. Once again, we’d like to introduce EaseUS file repair tool. No matter whether you need to repair Word, Excel, PPT, or PDF documents, applying this tool is a wise choice.
When talking about MS Office error messages, it’s always a long story. Users would report hundreds of different error messages they received when they open Word, Excel, or PowerPoint. For some common errors like Runtime Error 1004 or add-in template is not valid, we have already introduced how can you fix them. This time, we will talk about another error message — Compile error in hidden module.
Users often received this error message when they start Excel. In rare times, when users start MS Word, this error would also pop up. Usually, users would see one of the following error messages:
- Compile error in hidden module: AutoExec
- Compile error in hidden module: AutoExecNew
- Compile error in hidden module: DistMon
The different suffixes indicate that you have different culprits to blame, and that’s why there is more than one solution for you to solve the problem. Before checking the solutions, you should know the reasons why you see these error messages.
Why Do I See the Error Message of Compile Error in Hidden Module?
Now Office 2016 is upgraded from a 32-bit version to a 64-bit version. The Compile error in hidden module error message usually appears when there are dome 32-bit add-ins versions of the office in your computer, and they are incompatible with the 64-bit version.
Two common conditions that would cause this error are as follow:
1. When MS Excel startup folder contains both the following two template files on Adobe Acrobat PDF Maker add-in:
- Pdfmaker.dot
- Pdfmaker.xla
2. Your computer has installed the Norton Anti-virus software.
After knowing what causes this error message, now it’s time to apply the solutions. Here we have listed four solutions, you can try them one by one until you solve the problem.
Method 1. Re-register OCX Files with CMD
The first solution you can try is to re-register some basic Excel function files. In this method, we need to apply Windows Command Prompt.
Step 1. Press Windows + R keys at the same time. Type cmd in the run box.
Step 2. Type the following command and press Enter.
For 32-bit:
regsvr32 -u c:windowssystem32mscomctl.ocx
regsvr32 c:windowssystem32mscomctl.ocx
For 64-bit:
regsvr32 -u c:windowssystem64mscomctl.ocx
regsvr32 c:windowssystem64mscomctl.ocx
Step 3. Now run MS Excel again to check if the error message still exists.
Method 2. Delete .exd Files
The exd file is a control information cache file of Microsoft Office. These files are created when a user inserts an ActiveX control into a document using the Control Toolbox in an MS Office program. You can delete this cache file to see if it can fix the Compile error in the hidden module error.
Step 1. Press Windows + R keys at the same time. Type %appdata% in the run box.
Step 2. It will open your AppData folder. Go to Roaming > Microsoft > Forms.
Step 3. Find the .exd files, select comctllib.exd and mscomctllib.exd, and delete these two files.
Step 4. Restart your Excel and check if the problem is solved.
Method 3. Move PDF Maker Files
As we have mentioned above, one of the reasons you will see this error message is because there are two template files on Adobe Acrobat PDF Maker add-in. So in this method, you can move the PDF Maker files to another place to fix your problem. Here are the detailed steps.
Step 1. Open Windows File Explorer, search pdfmaker.* on your computer.
Step 2. Choose the pdfmaker.dot and pdfmaker.xla files, right-click on both files, and select cut.
Step 3. Paste these two files to your Desktop.
Now you can restart the MS Excel to see if the problem is solved.
Method 4. Update to the Latest Adobe Acrobat
If the above methods can’t help you solve the Compile error in hidden module problem, the last resort is to update the Adobe Acrobat to the latest version. It’s because this problem is associated with the Adobe Acrobat that is installed on your computer.
Go to the Adobe official website, find the latest version of Acrobat, download and install it on your computer.
How to Fix Word Runtime Error 91?
A runtime error is a common program error that usually occurs in Microsoft Office software. This article will you what is the reason for this error, and how to fix it.
Bonus Solution: Repair Damaged or Corrupted MS Excel Efficiently
With the above methods, you might have solved the Excel Compile error in the hidden module issue. Then we’d like to share a good bonus tool — EaseUS Data Recovery Wizard with you.
This is an advanced 4-in-1 specialized fix tool that enables you to repair corrupted PDF documents and Office files in multiple formats. If your documents got damaged, Stellar file repair software will scan and repair them efficiently.
If you want to try on this file repair software, you can download it and follow the guide to see how to use this tool. In the following guide, we have introduced how to repair Excel documents.
Step 1. Launch EaseUS Data Recovery Wizard. Select a disk location where the corrupted files are saved. Click «Scan» to start finding the broken files. EaseUS file repair tool allows you to fix damaged documents, videos, and pictures in differnet formats.
Step 2. After scanning, you can quickly find corrupt data by file type. If you want to repair damaged Word, Excel, or PDF, select Documents and filter a specific category. For pictures and videos repair, all the common types are suppored, including JPEG, PNG, BMP, MOV, MP4, GIF, and more.
Step 3. EaseUS file repair software will automatically fix broken files. You can preview the repaired files before recovery. Last, click «Recover» and save the recovered files to a different location to avoid data overwriting.
The Bottom Line
That’s all about Compile error in hidden module error message. Hope you can fix your problem after reading this article. Once again, we’d like to introduce EaseUS file repair tool. No matter whether you need to repair Word, Excel, PPT, or PDF documents, applying this tool is a wise choice.