我如何打破错误?

我有一个函数,它有一些错误,导致它返回#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 = TrueRelease = 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副本。

希望有所帮助。