我被困在我有解决方法的事情上,但这让我烦恼我没有关于如何解决使用问题的直接答案On Error Goto
对于重复出现的错误。我的问题本质上是一样的正如这个,但是提供的答案是OP整体方法的替代方案,而不是如何处理具体问题。
我在下面简化了一个例子。我是很清楚可能有十几种方法可以重写此代码以避免任何错误 - 我只是用它来说明试图找出问题为什么/如何此代码在 i = 0 时正常工作,但在 i = 3,6,9 时却不能正常工作?
Sub vbaErrorConfusion()
Dim theArray(9) As Long, i As Long
For i = 0 To 9
On Error GoTo fixingErrors
'next line will intentionally create an error when
'when i = {0} this works as expected, but at i=3 next line throws an error.
theArray(i) = i + 1 / (i Mod 3)
On Error GoTo 0
next_i:
Next i
Exit Sub
'----Error Handling----
'this works as expected when i=0 but not when i = 3,6,9
fixingErrors:
Err.Clear
On Error GoTo 0
'at this point I would expect my error state to be the same as the start of procedure?
theArray(i) = -1
GoTo next_i
End Sub
What my Err
变量显示在第一个 0 实例之后。
我跑完之后Err.Clear
我希望这种行为i=3
与当时相同i=0
,但是我的程序因以下 VBA 错误而停止,人们会期望没有任何错误捕获。
我认为有某种方法可以重置Error
变量或在没有解决方法的情况下处理这种情况?任何高质量的回复都会得到好评。谢谢。
要告诉 VBA 您已经处理了错误,您需要Resume
陈述。因此,更换线路GoTo next_i
with Resume next_i
你给你你期望的结果。
你不需要Err.Clear
. Also, On Error GoTo 0
将禁用错误处理程序。然而,这两行都不会告诉 VBA 您已经处理了错误。
在你的代码中i=0
错误处理程序被激活,但 VBA 没有被告知错误已被处理(即没有Resume
陈述)。在i=3
在前一个错误尚未处理的情况下发生另一个错误。在这种情况下,当前过程/函数/属性无法处理第二个错误,因此这是致命的。
您还应该采取On Error GoTo fixingErrors
循环外的线。
Sub vbaErrorConfusion()
On Error GoTo fixingErrors
Dim theArray(9) As Long, i As Long
For i = 0 To 9
'*On Error GoTo fixingErrors
'next line will intentionally create an error when
'when i = {0} this works as expected, but at i=3 next line throws an error.
theArray(i) = i + 1 / (i Mod 3)
'*On Error GoTo 0
next_i:
Next i
Exit Sub
'----Error Handling----
'this works as expected when i=0 but not when i = 3,6,9
fixingErrors:
'*Err.Clear
'*On Error GoTo 0
'at this point I would expect my error state to be the same as the start of procedure?
theArray(i) = -1
Resume next_i
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)