Excel 如何在模拟Python的错误代码上进行下一次迭代';s";“继续”;VBA中的语句?
在下面的代码中,遇到错误后,如何使循环在下一个iteration(而不是下一行)上继续 现在代码将不会超过x=0:Excel 如何在模拟Python的错误代码上进行下一次迭代';s";“继续”;VBA中的语句?,excel,vba,Excel,Vba,在下面的代码中,遇到错误后,如何使循环在下一个iteration(而不是下一行)上继续 现在代码将不会超过x=0: Sub skip_iteration() Dim x As Long For x = 5 To -5 Step -1 On Error GoTo errhandler: Debug.Print 15 / x Debug.Print "I don't want this to be printed on error" Next x errhandler:
Sub skip_iteration()
Dim x As Long
For x = 5 To -5 Step -1
On Error GoTo errhandler:
Debug.Print 15 / x
Debug.Print "I don't want this to be printed on error"
Next x
errhandler:
If Err.Number = 11 Then
Debug.Print ("Error on " & x)
End If
End Sub
我研究过这个答案:
但无法将其转换为我的代码。您需要
继续下一行
转到该行后的下一行,从而导致错误。而且Err.Clear
也是一个很好的做法
errhandler
之前的Exit子项也是一个很好的做法:
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
On Error GoTo errhandler:
Debug.Print 15 / x
Debug.Print "testing"
Next x
Exit Sub
errhandler:
If Err.Number = 11 Then
Debug.Print ("Error on " & x)
Err.Clear
Resume Next
End If
End Sub
Resume
和Resume Next
之间的区别如下:
Resume
尝试返回调用它的位置
在TestMeResume
过程中,它在调试时抛出错误11。打印a/b,并在错误处理程序中指定b=5。然后使用Resume
重试Debug.Print a/b
,只要b
不是0
,它就会运行
Resume Next
转到调用它的位置,忽略该行并继续下一行李>
在TestMeResumeNext
过程中,在a=12时抛出错误91,并触发错误处理程序。在错误处理程序中,a被分配到范围(“A14”)
,并使用继续下一步跳过a=12
,子继续
这里的另一个选项是内联错误处理程序。这表明您清楚地知道特定代码行可能引发错误,并且不依赖Resume
进行流量控制。让错误进入函数底部的处理程序,然后跳回代码的主线,这会使循环的预期行为变得不那么明显
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
On Error Resume Next
Debug.Print 15 / x
If Err.Number = 11 Then
Debug.Print "Expected error on " & x
On Error GoTo errhandler
Else
On Error GoTo errhandler
Debug.Print "Process the rest of the loop"
End If
Next x
Exit Sub
errhandler:
Debug.Print "Unexpected error "; Err.Number
End Sub
更好的做法是以一种方式分离过程的关注点,即执行的循环部分是一条语句:
Sub SkipIteration()
On Error GoTo errhandler
Dim x As Long
For x = 5 To -5 Step -1
If TheThingThatCanError(x) Then
ActionThatDependsOnAbove x
End If
Next x
Exit Sub
errhandler:
Debug.Print "Unexpected error "; Err.Number
End Sub
Private Function TheThingThatCanError(x As Long) As Boolean
On Error Resume Next
Debug.Print 15 / x
If Err.Number = 11 Then
Debug.Print "Expected error on " & x
Exit Function
End If
TheThingThatCanError = True
End Function
Private Sub ActionThatDependsOnAbove(x As Long)
Debug.Print "I don't want this to be printed on error " & x
End Sub
如果要跳过错误
并继续下一次迭代,一种可能的方法是使用GoTo
并进行一些:
或者使用嵌入整个iError
检查if并避免GoTo
。但是,您必须转到右边的一个选项卡,然后失去缩进:
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
If Not IsError(Evaluate("15 / " & x)) Then
Debug.Print 15 / x
Debug.Print x
End If
Next x
End Sub
我想要你想要的东西Resume@QHarr-Resume
将导致无休止的循环。错误处理程序中的“下一步继续”是正确的处理方法。@vityta correct。我在错误处理程序中是认真的。在这种情况下,Resume和Resume Next之间有区别吗?请原谅我的无知对于你的soln.@QHarr-我知道(对于错误处理程序)。那里的Resume
会导致无休止的循环。@QHarr-事实上,错误处理程序中的这两个Resume Next
和Resume
是非常有用的功能。我更新了一些例子。维蒂亚塔,非常感谢你的详尽回答。然而,正如我在问题中所说的,我想跳到下一个迭代,而不是下一行。在您的代码中,继续下一步
将转到Debug.Print“testing”
,我想跳过它-以及它之后可能发生的任何事情-改为转到下一个x
。@barciewicz-我明白了。我想出了另一个答案,GoTo
在某种程度上是坏的、危险的等等。像这样使用Evaluate
是可怕的。它不仅对表达式求值两次(一次用于evaluate
调用,一次用于“real”调用),还将其卸载到Excel,Excel可能会或可能不会对更复杂的表达式使用相同的语义。@Comintern-是的,不是最好的,但目前无法提供单线选项。我不想有一个专门的功能或下一步错误恢复时的,,因为这就像你的答案一样D
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
If IsError(Evaluate("15 / " & x)) Then GoTo Skipper
Debug.Print 15 / x
Debug.Print x
Skipper:
Next x
End Sub
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
If Not IsError(Evaluate("15 / " & x)) Then
Debug.Print 15 / x
Debug.Print x
End If
Next x
End Sub