1

我被引导相信 vba IDE 不允许正确中断错误。我在这里问了一个关于如何识别运行时错误的问题:

我如何打破错误?

解决方案/解决方法似乎是使用On Error GoTo ErrorHandler或类似的。我正在努力完成这项工作,但没有取得太大的成功。

根据 MicrosoftOn Error GoTo将在发生运行时错误时将您发送到指定区域的代码 ( https://msdn.microsoft.com/en-us/library/5hsw66as.aspx )。根据我的经验,这还不是全部。这个问题是关于如何实际使该解决方案起作用。

所以我有以下功能:

Function generateTimeseries() As Variant

On Error GoTo ErrorHandler

Dim currentArray As Range

currentArray = Selection.Range ' this doesn't work - I don't care why

generateTimeseries = currentArray.Rows

Return

ErrorHandler:
    Debug.Assert False
    Resume ' break here if you want to catch errors

End Function

此函数从不输入ErrorHandler代码。相反,它落在 上Selection.Range,函数简单地返回#VALUE。我实际上并不关心为什么会中断,我只想知道如何让 IDE 告诉我它实际上落在了那条线上,而无需我手动跳过代码。

4

2 回答 2

1

我刚刚测试并且您的错误处理程序可以正常工作,它会正确中断

Debug.Assert False

--> 检查调试器选项。

然而,这不是处理 vBA 错误的正确方法,因为如果您编译应用程序并忘记调整此类错误处理程序,当用户在程序中遇到错误时,应用程序将陷入无限循环。

在大多数情况下,您必须抛出一个 msgbox 让用户知道发生了错误,并终止当前过程。唯一不适用的情况是当你做了一些可能触发错误但你知道并故意想绕过错误的事情时。这是一种罕见的情况。

我从未使用过Assert方法,这就是我在每个程序中处理错误的方式

Function generateTimeseries() As Variant

    On Error GoTo ErrorHandler

    Dim currentArray As Range

    currentArray = Selection.Range ' this doesn't work - I don't care why

    generateTimeseries = currentArray.Rows

Exit_Function:
       Exit Function

ErrorHandler:
        MsgBox Err.Description, vbCritical, "Error " & Err.Number
        Resume Exit_Function ' breakpoint here if you want examine the code after error, otherwhise it terminates the function
        Resume ' Once  the code breaks on the above line, move to this instruction and F8 to return to the statement in error

End Function
于 2016-04-23T06:36:47.633 回答
0

在之前尝试中断所有错误时,我已启用该功能以“中断所有错误”。

我通过转到Tools->Options->General并替换Break on All Errors为来关闭它Break on Unhandled Errors

事实证明,Break on All Errors“在某些错误上中断,但如果它是 UDF 错误则只返回垃圾”是 Windows。

于 2016-04-23T06:36:45.270 回答