5

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

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

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

如何让 VBA IDE 因错误而中断?

4

5 回答 5

5

只需在您的函数中添加一个错误处理程序,如下所示。如果发生错误,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
于 2016-04-16T18:11:10.903 回答
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
于 2016-04-16T15:51:23.770 回答
2

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

将这个小演示放入模块并运行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
于 2016-04-16T16:27:59.423 回答
0

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

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

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

于 2016-04-16T16:01:32.380 回答
0

你真的应该提到功能是否

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

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

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

希望有帮助。

于 2016-04-17T14:11:59.707 回答