При выполнении макросов 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) |
Перехват ошибок выполнения
Не все ошибки выполнения бывают вызваны недочётами в коде. Например, ошибки VBA не удастся избежать, если для работы макроса необходимо открыть файл с данными, а этого файла не существует. В таких случаях признаком профессионализма будет перехват ошибок и написание кода VBA, который будет выполняться при их возникновении. Таким образом, вместо неприятных сбоев будет происходить изящное завершение работы макроса.
Для того, чтобы помочь справиться с возникающими ошибками, VBA предоставляет разработчику операторы On Error и Resume. Эти операторы отслеживают ошибки и направляют выполнение макроса в специальный раздел кода VBA, в котором происходит обработка ошибки. После выполнения кода обработки ошибки, работа программы может быть продолжена с того места, где возникла ошибка, или макрос может быть остановлен полностью. Далее это показано на примере.
В этом коде производится попытка открыть файл Excel с именем Data. Если файл не найден, то пользователю будет предложено поместить этот файл в нужную папку. После того, как пользователь сделает это и нажмёт ОК, выполнение кода продолжится, и попытка открыть этот файл повторится. При желании вместо попытки открыть нужный файл, выполнение процедуры Sub может быть прервано в этом месте при помощи команды Exit Sub.
Логические ошибки
Логические ошибки (или баги) возникают в процессе выполнения кода VBA, но позволяют ему выполняться до самого завершения. Правда в результате могут выполняться не те действия, которые ожидалось, и может быть получен неверный результат. Такие ошибки обнаружить и исправить труднее всего, так как компилятор VBA их не распознаёт и не может указать на них так, как это происходит с ошибками компиляции и выполнения.
Например, при создании макроса в процедуре случайно были просуммированы не те переменные, которые требовалось просуммировать. Результат будет ошибочным, но макрос будет продолжать выполняться до завершения.
Редактор Excel VBA предоставляет набор инструментов отладки, которые помогут найти и исправить логические ошибки в коде VBA. В данной статье мы не будем рассматривать подробно эти инструменты. Любознательный пользователь может найти обзор инструментов отладки VBA на сайте Microsoft Help A87").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select ***ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ "Sheet1!R87C1:R8214C25", Version:=xlPivotTableVersion14).CreatePivotTable _ TableDestination:="LED OTTR!R1C1", TableName:="PivotTable6", _ DefaultVersion:=xlPivotTableVersion14*** Sheets("LED OTTR").Select Cells(1, 1).Select With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED") .Orientation = xlPageField .Position = 1 End With With ActiveSheet.PivotTables("PivotTable6").PivotFields("Hierarchy name") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED").CurrentPage = "(All)" With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED") .PivotItems("LED Marine").Visible = False .PivotItems("LL48 Linear LED").Visible = False .PivotItems("Other").Visible = False End With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED"). _ EnableMultiplePageItems = True ActiveSheet.PivotTables("PivotTable6").AddDataField ActiveSheet.PivotTables( _ "PivotTable6").PivotFields(" Late " "Indicator"), "Sum of Late " "Indicator", _ xlSum ActiveSheet.PivotTables("PivotTable6").AddDataField ActiveSheet.PivotTables( _ "PivotTable6").PivotFields("Early /Ontime" " Indicator"), _ "Sum of Early /Ontime" " Indicator", xlSum End Sub
Invalid procedure call or argument vba ошибка
Some part of the call can’t be completed. This error has the following causes and solutions:
- An argument probably exceeds the range of permitted values. For example, the Sin function can only accept values within a certain range. Positive arguments less than 2,147,483,648 are accepted, while 2,147,483,648 generates this error. Check the ranges permitted for arguments.
- This error can also occur if an attempt is made to call a procedure that isn’t valid on the current platform. For example, some procedures may only be valid for Microsoft Windows, or for the Macintosh, and so on.
For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).
[!includeSupport and feedback]
I need help with this macro. Every time I run it, I get the error below. I thought it was a simple macro that I could have anybody on my team use to make it take a less time than they were taking to manually create this PivotTable every time they ran the report. However, it’s not working. Please see error below and advise.
I emboldened and italicized the error.

re>Sub LEDOTTR() ' ' LEDOTTR Macro ' ' Range("A87").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select ***ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ "Sheet1!R87C1:R8214C25", Version:=xlPivotTableVersion14).CreatePivotTable _ TableDestination:="LED OTTR!R1C1", TableName:="PivotTable6", _ DefaultVersion:=xlPivotTableVersion14*** Sheets("LED OTTR").Select Cells(1, 1).Select With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED") .Orientation = xlPageField .Position = 1 End With With ActiveSheet.PivotTables("PivotTable6").PivotFields("Hierarchy name") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED").CurrentPage = "(All)" With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED") .PivotItems("LED Marine").Visible = False .PivotItems("LL48 Linear LED").Visible = False .PivotItems("Other").Visible = False End With ActiveSheet.PivotTables("PivotTable6").PivotFields("LED"). _ EnableMultiplePageItems = True ActiveSheet.PivotTables("PivotTable6").AddDataField ActiveSheet.PivotTables( _ "PivotTable6").PivotFields(" Late " "Indicator"), "Sum of Late " "Indicator", _ xlSum ActiveSheet.PivotTables("PivotTable6").AddDataField ActiveSheet.PivotTables( _ "PivotTable6").PivotFields("Early /Ontime" " Indicator"), _ "Sum of Early /Ontime" " Indicator", xlSum End Sub




