我如何中断错误?

How do I break on errors?

我有一个函数,当我尝试在 excel.

中执行它时,它在某个地方有一些错误导致它 return #VALUE

我不知道错误在哪里,单步执行代码很乏味。所以我希望调试器在发生错误时立即中断。

我尝试去 Tools->options->General->"Break on All Errors" 但没有发现任何变化。

如何让 VBA IDE 在发生错误时中断?

类似于:

Public Function dividddeee(a As Variant, b As Variant) As Double
    On Error GoTo wtf
    dividddeee = a / b
    Exit Function
wtf:
    On Error GoTo 0
    MsgBox "Houston, we've had a problem here"
    MsgBox a & vbCrLf & b
End Function

如果您将 VBA 函数作为 UDF 调用,则不涉及 VBA IDE 的设置。所以没有机会以这种方式进行错误调试。

尝试从测试中调用函数 Sub。然后错误调试就可以了

但是有些事情函数不能像 UDF 那样做,但可以从 Sub 中调用。如果这些事情之一是 #VALUE 错误的原因,那么就没有办法在函数中设置断点并继续前进直到下一步是不可能的。步进的最后一行是错误行。

如果添加错误处理程序,如果您不想执行标准处理程序,则可以利用 Debug.Assert 强制中断。您可以定义一个编译器常量,以便在您将其发布到野外时让您的错误处理程序处理它。如果您想查看具体是哪一行导致了错误,您可以在 Debug.Assert 之后放置 Resume Next。当您单步执行它时,它会将您带到导致错误的那一行之后的那一行。

将这个小演示放入 Module 和 运行 Sub 以及 Release = TrueRelease = False 作为示例:

Option Explicit
#Const Release = False

Private Sub Demo()
    Debug.Print DivByZero(5)
End Sub

Public Function DivByZero(inValue As Integer) As Double
    On Error GoTo Handler
    DivByZero = inValue / 0

    Exit Function
Handler:
    #If Release Then
        MsgBox Err.Description & " in DivByZero"
    #Else
        Debug.Assert False
        Resume Next
    #End If
End Function

只需在您的函数中添加一个错误处理程序,如下所示。 如果发生错误,IDE 将立即在 window 中打印错误描述并在 Debug.Assert 0 处停止。 然后按两次F8跳转到出错的行。

Function Test() As Variant
    On Error GoTo ErrHandler

    Dim v(), n&, r&, c&
    For r = 1 To 3
        For c = 1 To 4
            n = n + 1
            ReDim Preserve v(1 To r, 1 To c)
            v(r, c) = n
        Next c
    Next r
    Test = v

    Exit Function

ErrHandler:
    Debug.Print Err.Number & ": " & Err.Description
    Debug.Assert 0
    Resume
End Function

如果函数是

你真的应该提一下
  • 从 Excel 单元调用。
  • 有一个事件处理程序。
  • 显示变量的声明方式。

如果从单元格调用,函数的输入可能会导致不同输入的问题。如果类型发生显着变化,有时会阻止函数的调用。例如,在其签名中声明为变体的参数将传递错误但在函数中失败。您可能会捕获此错误并在代码中返回#VALUE。我们无从知晓。

如果您有事件处理程序,为了进行快速测试,您可以在事件处理程序中放置一个 'Stop' 以停止,就像您所要求的那样。如果没有,您可以按照已经说明的那样放入一个。断言很好,我喜欢它们并使用了很多 - 但在这里,因为您知道该功能并且正在处理这个明确的问题,所以 Stop 应该足以满足您的测试。只是不要将其保存为生产代码。制作本书的测试副本。

希望对您有所帮助。