如何解决错误?

时间:2016-04-16 15:30:27

标签: excel vba excel-2016

我有一个函数在某个地方有一些错误导致它在我尝试在excel中执行时返回#VALUE

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

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

如何让VBA IDE中断错误?

5 个答案:

答案 0 :(得分:3)

只需在函数中添加错误处理程序,如下所示。 如果发生错误,IDE将在即时窗口中打印错误说明并在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

答案 1 :(得分:2)

类似的东西:

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

答案 2 :(得分:1)

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

将这个小型演示放入模块,并以SubRelease = True同时运行Release = 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

答案 3 :(得分:0)

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

尝试从测试Sub调用该函数。然后错误调试将起作用。

但是有一些函数不能作为UDF执行,但可以从Sub调用。如果其中一个是#VALUE错误的原因,则无法在函数中设置断点并向前迈进,直到下一步无法执行。步进的最后一行是错误行。

答案 4 :(得分:0)

你应该提到函数是否

  • 从Excel单元格调用。
  • 有一个事件处理程序。
  • 显示如何声明变量。

如果从单元格调用,该函数的输入可能会导致您输入不同的问题。如果类型显着改变为意外的事情,有时会阻止调用函数。例如,在其签名中声明为variant的参数将传递错误但在函数中失败。您可能正在捕获此错误并在代码中返回#VALUE。我们无法知道这一点。

如果你有一个事件处理程序,为了快速测试,你可以放一个' Stop'在事件处理程序停止像你问。如果没有,你可以按照已经陈述的方式放入。断言是好的,我喜欢它们并且使用它们很多 - 但是在这里,因为你知道函数并正在处理这个明确的问题,所以Stop应该足够好用于你的测试。只是不要将其保存为生产代码。制作一本书的测试副本。

希望有所帮助。