似乎当从单元格公式(即“用户定义函数”或 UDF)调用 VBA 代码时,通常的 VBA Break On Error 不起作用。
我能找到记录此行为的唯一地方是一篇名为 “为 Excel 2007 和 Excel Services 开发用户定义函数”的文章中的几行内容:
错误处理返回 #VALUE 错误。 UDF 代码引发的所有异常都会作为 #VALUE 错误返回到 Excel 工作表中。
即使您将错误捕获设置为“在出现所有错误时中断”并单步执行代码**,您也永远不会看到 VBA 运行时错误对话框 - Excel 只是悄悄地放弃执行,而不告诉您出了什么问题。当然,这使得调试变得比实际需要的更加困难。
有一些涉及
On Error
的潜在解决方法,但我不想为了找出引发错误的位置而弄乱我的代码。
是否有一些我忽略的 Excel/VBA 选项可以使“错误中断”正常工作?我使用的是 Excel 2003。
** 从单元调用时进入调试器的唯一方法是设置断点或使用
Stop
语句
最好的方法是使用
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
行。
我知道当你特别要求
On Error
以外的东西时听到这个并没有什么意思,但据我所知,这恐怕是唯一的选择。
您可以在调试时使用
On Error Goto ErrorHandler
(并在其他时候将其注释掉以获得默认的 On Error Goto 0
)。 ErrorHandler
可以只有几行,这样就不会让你的代码变得过于混乱:
ErrorHandler:
MsgBox Err.Number & vbCrLf & Err.Source & vbCrLf & Err.Description
Resume
始终在
Resume
上设置断点,以引导您在单步执行时返回到导致错误的语句,并避免无限的错误处理循环。
我最近也遇到了这个问题。我真的以为有些东西已经改变了,而且并不总是这样 - 但我想我错了。
这是我可以处理的方法。与上面的答案类似。
说这是我原来的功能:
Function MyFunction(input_value)
a = 1
b = 1 / 0
MyFunction = 1 + input_value ^ 2
End Function
如果我怀疑有问题,那么我会添加如下三行:
Function MyFunction(input_value)
On Error GoTo StopOnError '<- this line
a = 1
b = 1 / 0
MyFunction = 1 + input_value ^ 2
Exit Function '<- this line
StopOnError: Stop '<- this line
End Function
然后当发生错误时:
这很麻烦。