#VALUE
我有一个函数,它在某处有一些错误,导致当我尝试在 excel 中执行它时它返回。
我不知道错误在哪里,单步执行代码很乏味。所以我希望调试器在发生错误时立即中断。
我试着去,Tools->options->General->"Break on All Errors"
但没有发现任何变化。
如何让 VBA IDE 因错误而中断?
#VALUE
我有一个函数,它在某处有一些错误,导致当我尝试在 excel 中执行它时它返回。
我不知道错误在哪里,单步执行代码很乏味。所以我希望调试器在发生错误时立即中断。
我试着去,Tools->options->General->"Break on All Errors"
但没有发现任何变化。
如何让 VBA IDE 因错误而中断?
只需在您的函数中添加一个错误处理程序,如下所示。如果发生错误,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
就像是:
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
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
如果调用VBA
函数,因为UDF
VBA IDE 的设置不涉及。所以没有机会以这种方式进行错误调试。
尝试从 test 调用该函数Sub
。然后错误调试将起作用。
但是有些事情函数不能作为 a 执行,UDF
但可以从 a 调用Sub
。如果其中一个原因是#VALUE
错误的原因,那么就无法在函数中设置断点并继续前进直到下一步是不可能的。步进的最后一行是错误行。
你真的应该提到功能是否
如果从单元格调用,函数的输入可能会导致您出现不同输入的问题。如果类型显着更改为意外情况,有时会阻止函数的调用。例如,在其签名中声明为变体的参数将传入错误但在函数中失败。您可能会捕获此错误并在代码中返回#VALUE。我们没有办法知道这一点。
如果您有一个事件处理程序,为了快速测试,您可以在事件处理程序中放置一个“停止”,以按照您的要求停止。如果没有,您可以按照已经说明的方式放入一个。断言很好,我喜欢它们并且使用了很多——但是在这里,因为你知道函数并且正在处理这个明确的问题,所以 Stop 应该足以满足你的测试。只是不要将其保存为生产代码。制作本书的测试副本。
希望有帮助。