我如何打破错误?
我有一个函数,它有一些错误,导致它返回#VALUE
当我尝试在Excel中执行它。
我不知道错误在哪里,单步执行代码非常单调乏味。 所以我希望debugging器在发生错误时立即中断。
我试着去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
如果添加error handling程序,则可以利用Debug.Assert
强制中断,如果不希望执行标准处理程序。 您可以定义一个编译器常量,让您的error handling程序处理它,当你释放它。 如果您想查看哪些特定行导致错误,可以在Debug.Assert
之后放置Resume Next
。 当你通过它,它会带你到导致错误的那一行后立即行。
将这个小演示放到Module中,并以Release = True
和Release = False
为例运行Sub
:
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
只需在下面的函数中添加一个error handling程序。 如果发生错误,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
如果以UDF
的forms调用VBA
函数,则不涉及VBA IDE的设置。 所以没有机会错误debugging这种方式。
尝试从testingSub
调用函数。 然后错误debugging将工作。
但是有一些函数不能做UDF
但可以从Sub
调用。 如果这些事情之一是#VALUE
错误的原因,那么没有办法在函数中设置断点,并向前迈进,直到下一步是不可能的。 步进的最后一行是错误行。
你应该真的提到,如果function是
- 从Excel单元格调用。
- 有一个事件处理程序。
- 显示你的variables是如何声明的。
如果从一个单元格调用,该函数的input可能会导致您input不同的问题。 有时如果types显着改变为意想不到的情况,则阻止函数的调用。 例如,在其签名中声明为变体的参数将传入错误,但在函数中失败。 你可能会陷入这个错误,并在代码中返回#VALUE。 没有办法让我们知道这一点。
如果你有一个事件处理程序,为了快速testing,你可以在事件处理程序中放一个“Stop”来停止,就像你问的那样。 如果不是的话,你可以按照上面的说明join。 断言是很好的,我喜欢他们,并使用他们很多 – 但在这里,因为你知道这个function,并正在处理这个明确的问题停止应该足够好,为您的testing。 只是不要保存它的生产代码。 做一本书的testing副本。
希望有所帮助。