Excel:Break on Error在用户定义的函数中不起作用

时间:2011-07-08 04:49:38

标签: debugging excel excel-vba excel-2003 runtime-error vba

似乎从单元格公式(即“用户定义函数”或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语句

2 个答案:

答案 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 ErrorHandlerStop引用后跟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行。