似乎从单元格公式(即“用户定义函数”或UDF)调用VBA代码时,通常的VBA Break On Error不起作用。
我能找到这种行为的唯一地方是一篇名为"Developing User-Defined Functions for Excel 2007 and Excel Services"的文章中的几行:
错误处理返回#VALUE错误。 UDF代码抛出的所有异常都将作为#VALUE错误返回到Excel工作表。
即使您将错误陷阱设置为“中断所有错误”并单步执行代码**,您也永远不会看到VBA运行时错误对话框 - Excel只是静静地放弃执行而不告诉您出了什么问题。当然,这使得调试比实际需要更加困难。
有一些涉及On Error
的潜在解决方法,但我不想弄乱我的代码只是为了找出错误发生的位置。
是否有一些我忽略的Excel / VBA选项会使Break On Error正常工作?我正在使用Excel 2003。
**从单元格调用时进入调试器的唯一方法是设置断点或使用Stop
语句
答案 0 :(得分:2)
我知道当你特别要求除On Error
以外的其他东西时听到这个并不是很有趣,但我担心这是我所知道的唯一选择。
您可以在调试时使用On Error Goto ErrorHandler
(并在其他时间将其注释以获取默认On Error Goto 0
)。 ErrorHandler
可能只有几行,因此不会使代码混乱太多:
ErrorHandler:
MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
Resume
总是在Resume
上使用断点来引导您在步进时返回引起错误的语句 - 并避免无限的错误处理循环。
答案 1 :(得分:2)
最佳方法是将On Error GoTo ErrorHandler
与Stop
引用后跟Resume
一起使用。
需要注意不要使用resume
进入无限循环,因为UDF几乎连续运行(如果这种情况反复发生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
语句跳回)使用调试工具栏上的下一行命令。
当您对UDF感到满意时,请不要忘记发表On Error GoTo ErrorHandler
行。