Debugging Excel:错误时中断不';不能在用户定义的函数中工作

Debugging Excel:错误时中断不';不能在用户定义的函数中工作,debugging,excel,excel-2003,runtime-error,vba,Debugging,Excel,Excel 2003,Runtime Error,Vba,当从单元格公式(即“用户定义函数”或UDF)调用VBA代码时,通常的VBA中断错误似乎不起作用 我能找到的唯一记录这种行为的地方是一篇名为: 错误处理返回#值错误。UDF代码引发的所有异常都会作为#值错误返回到Excel工作表中 即使您将错误捕获设置为“在所有错误上中断”并单步执行代码**,您也永远不会看到VBA运行时错误对话框-Excel只是悄悄地放弃执行,而不告诉您出了什么问题。当然,这会使调试变得比需要的更困难 有一些潜在的解决方法涉及到错误方面的,,但我不想为了找出错误是在哪里产生的而把

当从单元格公式(即“用户定义函数”或UDF)调用VBA代码时,通常的VBA中断错误似乎不起作用

我能找到的唯一记录这种行为的地方是一篇名为:

错误处理返回#值错误。UDF代码引发的所有异常都会作为#值错误返回到Excel工作表中

即使您将错误捕获设置为“在所有错误上中断”并单步执行代码**,您也永远不会看到VBA运行时错误对话框-Excel只是悄悄地放弃执行,而不告诉您出了什么问题。当然,这会使调试变得比需要的更困难

有一些潜在的解决方法涉及到错误方面的
,但我不想为了找出错误是在哪里产生的而把代码弄得乱七八糟

是否有一些Excel/VBA选项我忽略了,这将使出错中断正常工作?我正在使用Excel2003


**当从单元格调用调试器时,进入调试器的唯一方法是设置断点或使用
Stop
语句

我知道,当您特别要求除错误
之外的其他内容时,听到这句话一点也不好玩,但据我所知,这恐怕是唯一的选择

您可以在调试时使用
On Error Goto Error handler
(在其他时间注释它以获得默认的
On Error Goto 0
)。
ErrorHandler
可能只有几行代码,这样就不会使代码过于混乱:

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

始终在
Resume
上设置断点,以引导您在单步执行时返回导致错误的语句,并避免无限的错误处理循环

最好的方法是使用
On Error GoTo Error handler
Stop
参考,然后是
Resume

由于UDF几乎连续运行(如果发生这种情况,请反复点击
Esc
),因此需要小心不要进入无限循环
resume

因此,在代码中添加:
On Error GoTo ErrorHandler
靠近函数开头,然后在
结束函数之前的末尾:

Exit Function
ErrorHandler:
MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
Stop
Resume
退出功能
在正常操作中停止此代码的运行。 如果遇到错误,将弹出包含详细信息的消息框,代码将中断(由于
停止
),您可以使用调试工具栏上的下一行命令单步返回代码(通过
恢复
语句跳回)

当然,当您对您的UDF感到满意时,不要忘了注释掉“
On Error GoTo ErrorHandler”