Excel: "Break on Error" 在自定义函数中不起作用

7

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

我找到唯一记录此行为的地方是一篇名为"Developing User-Defined Functions for Excel 2007 and Excel Services"的文章中的几行:

错误处理返回#VALUE错误。由UDF代码引发的所有异常都以#VALUE错误的形式返回到Excel工作表中。

即使将Error Trapping设置为“Break on All Errors”并逐步执行代码,您也永远看不到VBA运行时错误对话框——Excel会在不告诉您出了什么问题的情况下悄悄地放弃执行。这当然比必要的调试更加困难。

虽然有一些可能的解决方法涉及On Error,但我不想为了找出错误的来源而使我的代码变得混乱。

是否有一些我忽略的Excel/VBA选项可以使Break On Error正常工作? 我正在使用Excel 2003。

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

2个回答

3
最好的方法是使用On Error GoTo ErrorHandlerStop引用,然后跟着Resume
需要注意不要陷入无限循环中,因为UDFs几乎一直在运行(如果发生这种情况,请重复按下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这行代码。

2
我知道当你明确要求不使用"On Error"时,听到这个可能并不乐意,但据我所知这是唯一的选择。在调试时,您可以使用“On Error Goto ErrorHandler”(并注释掉它以便在其他时间获得默认的“On Error Goto 0”)。 "ErrorHandler" 可以只写几行代码,这样就不会使您的代码太混乱了。请注意保留HTML标签。
ErrorHandler:
    MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
    Resume 

在调试时,始终要在恢复断点上进行,以便在步进时将您引导回导致错误的语句,并避免无限错误处理循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接