Excel: Break on Error не работает в пользовательской функции - PullRequest
6 голосов
/ 08 июля 2011

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

Единственное место, где я могу найти это документированное поведение, это пара строк в статье под названием "Разработка пользовательских функций для Excel 2007 и служб Excel" :

Обработка ошибок возвращает # ЗНАЧЕНИЕ ошибок. Все исключения, сгенерированные кодом UDF, возвращаются на лист Excel в качестве ошибок #VALUE.

Даже если вы установите для параметра «Перехват ошибок» значение «Разорвать все ошибки» и пошагово выполняете код **, вы никогда не увидите диалоговое окно «Ошибка времени выполнения VBA» - Excel просто тихо прекращает выполнение, не сообщая вам, что пошло не так. Конечно, это делает отладку более сложной, чем должна быть.

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

Есть ли какая-то опция Excel / VBA, которую я пропустил, которая сделает работу Break On Error нормальной? Я использую Excel 2003.

** Единственный способ попасть в отладчик при вызове из ячейки - установить точку останова или использовать оператор Stop

Ответы [ 2 ]

2 голосов
/ 17 августа 2015

Лучшим методом было бы использовать On Error GoTo ErrorHandler со ссылкой Stop, за которой следует Resume.

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

Итак, в вашем коде добавьте: On Error GoTo ErrorHandler рядом с началом вашей функции, а затем прямо в конце перед End Function:

Exit Function
ErrorHandler:
MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
Stop
Resume

Exit Function останавливает выполнение этого кода в нормальном режиме.Если обнаружена ошибка, появится окно с подробными сведениями, код сломается (из-за Stop), и вы можете вернуться обратно в свой код (вернуться назад с помощью оператора resume), используя следующую команду строки напанель инструментов отладки.

Конечно, не забудьте закомментировать строку On Error GoTo ErrorHandler, когда вы довольны своим UDF.

2 голосов
/ 08 июля 2011

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

Вы можете просто использовать On Error Goto ErrorHandler во время отладки (и закомментировать его, чтобы получить значение по умолчанию On Error Goto 0 в другое время). У ErrorHandler может быть всего пара строк, поэтому он не слишком загромождает ваш код:

ErrorHandler:
    MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
    Resume 

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

...