Excel:错误中断在用户定义函数中不起作用

问题描述 投票:0回答:3

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

我能找到记录此行为的唯一地方是一篇名为 “为 Excel 2007 和 Excel Services 开发用户定义函数”的文章中的几行内容

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

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

有一些涉及

On Error
的潜在解决方法,但我不想为了找出引发错误的位置而弄乱我的代码。

是否有一些我忽略的 Excel/VBA 选项可以使“错误中断”正常工作?我使用的是 Excel 2003。

** 从单元调用时进入调试器的唯一方法是设置断点或使用

Stop
语句

debugging excel excel-2003 runtime-error vba
3个回答
3
投票

最好的方法是使用

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
行。


2
投票

我知道当你特别要求

On Error
以外的东西时听到这个并没有什么意思,但据我所知,这恐怕是唯一的选择。

您可以在调试时使用

On Error Goto ErrorHandler
(并在其他时候将其注释掉以获得默认的
On Error Goto 0
)。
ErrorHandler
可以只有几行,这样就不会让你的代码变得过于混乱:

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

始终在

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


0
投票

我最近也遇到了这个问题。我真的以为有些东西已经改变了,而且并不总是这样 - 但我想我错了。

这是我可以处理的方法。与上面的答案类似。

说这是我原来的功能:

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

然后当发生错误时:

  1. 代码停止并突出显示“停止”。
  2. 我注释掉了 On Error 行
  3. 我将“MyFunction(input_value)”复制到剪贴板
  4. 我将 ?MyFunction(input_value)" 粘贴到立即窗口中,然后按 Enter 键。
  5. 然后它运行,我点击调试,错误的行被突出显示。

screenshot

这很麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.