我有一个函数在某个地方有一些错误导致它在我尝试在excel中执行时返回#VALUE
。
我不知道错误在哪里,单步执行代码只是单调乏味。因此,我希望调试器在发生错误时立即中断。
我尝试去Tools->options->General->"Break on All Errors"
,但发现没有变化。
如何让VBA IDE中断错误?
答案 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
之后。当您单步执行它时,它会立即将您带到导致错误的行之后的行。
将这个小型演示放入模块,并以Sub
和Release = 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)
你应该提到函数是否
如果从单元格调用,该函数的输入可能会导致您输入不同的问题。如果类型显着改变为意外的事情,有时会阻止调用函数。例如,在其签名中声明为variant的参数将传递错误但在函数中失败。您可能正在捕获此错误并在代码中返回#VALUE。我们无法知道这一点。
如果你有一个事件处理程序,为了快速测试,你可以放一个' Stop'在事件处理程序停止像你问。如果没有,你可以按照已经陈述的方式放入。断言是好的,我喜欢它们并且使用它们很多 - 但是在这里,因为你知道函数并正在处理这个明确的问题,所以Stop应该足够好用于你的测试。只是不要将其保存为生产代码。制作一本书的测试副本。
希望有所帮助。