我如何中断错误?
How do I break on errors?
我有一个函数,当我尝试在 excel.
中执行它时,它在某个地方有一些错误导致它 return #VALUE
我不知道错误在哪里,单步执行代码很乏味。所以我希望调试器在发生错误时立即中断。
我尝试去 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
如果您将 VBA
函数作为 UDF
调用,则不涉及 VBA IDE 的设置。所以没有机会以这种方式进行错误调试。
尝试从测试中调用函数 Sub
。然后错误调试就可以了
但是有些事情函数不能像 UDF
那样做,但可以从 Sub
中调用。如果这些事情之一是 #VALUE
错误的原因,那么就没有办法在函数中设置断点并继续前进直到下一步是不可能的。步进的最后一行是错误行。
如果添加错误处理程序,如果您不想执行标准处理程序,则可以利用 Debug.Assert
强制中断。您可以定义一个编译器常量,以便在您将其发布到野外时让您的错误处理程序处理它。如果您想查看具体是哪一行导致了错误,您可以在 Debug.Assert
之后放置 Resume Next
。当您单步执行它时,它会将您带到导致错误的那一行之后的那一行。
将这个小演示放入 Module 和 运行 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
只需在您的函数中添加一个错误处理程序,如下所示。
如果发生错误,IDE 将立即在 window 中打印错误描述并在 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
如果函数是
你真的应该提一下
- 从 Excel 单元调用。
- 有一个事件处理程序。
- 显示变量的声明方式。
如果从单元格调用,函数的输入可能会导致不同输入的问题。如果类型发生显着变化,有时会阻止函数的调用。例如,在其签名中声明为变体的参数将传递错误但在函数中失败。您可能会捕获此错误并在代码中返回#VALUE。我们无从知晓。
如果您有事件处理程序,为了进行快速测试,您可以在事件处理程序中放置一个 'Stop' 以停止,就像您所要求的那样。如果没有,您可以按照已经说明的那样放入一个。断言很好,我喜欢它们并使用了很多 - 但在这里,因为您知道该功能并且正在处理这个明确的问题,所以 Stop 应该足以满足您的测试。只是不要将其保存为生产代码。制作本书的测试副本。
希望对您有所帮助。
我有一个函数,当我尝试在 excel.
中执行它时,它在某个地方有一些错误导致它 return#VALUE
我不知道错误在哪里,单步执行代码很乏味。所以我希望调试器在发生错误时立即中断。
我尝试去 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
如果您将 VBA
函数作为 UDF
调用,则不涉及 VBA IDE 的设置。所以没有机会以这种方式进行错误调试。
尝试从测试中调用函数 Sub
。然后错误调试就可以了
但是有些事情函数不能像 UDF
那样做,但可以从 Sub
中调用。如果这些事情之一是 #VALUE
错误的原因,那么就没有办法在函数中设置断点并继续前进直到下一步是不可能的。步进的最后一行是错误行。
如果添加错误处理程序,如果您不想执行标准处理程序,则可以利用 Debug.Assert
强制中断。您可以定义一个编译器常量,以便在您将其发布到野外时让您的错误处理程序处理它。如果您想查看具体是哪一行导致了错误,您可以在 Debug.Assert
之后放置 Resume Next
。当您单步执行它时,它会将您带到导致错误的那一行之后的那一行。
将这个小演示放入 Module 和 运行 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
只需在您的函数中添加一个错误处理程序,如下所示。
如果发生错误,IDE 将立即在 window 中打印错误描述并在 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
如果函数是
你真的应该提一下- 从 Excel 单元调用。
- 有一个事件处理程序。
- 显示变量的声明方式。
如果从单元格调用,函数的输入可能会导致不同输入的问题。如果类型发生显着变化,有时会阻止函数的调用。例如,在其签名中声明为变体的参数将传递错误但在函数中失败。您可能会捕获此错误并在代码中返回#VALUE。我们无从知晓。
如果您有事件处理程序,为了进行快速测试,您可以在事件处理程序中放置一个 'Stop' 以停止,就像您所要求的那样。如果没有,您可以按照已经说明的那样放入一个。断言很好,我喜欢它们并使用了很多 - 但在这里,因为您知道该功能并且正在处理这个明确的问题,所以 Stop 应该足以满足您的测试。只是不要将其保存为生产代码。制作本书的测试副本。
希望对您有所帮助。