excel - 如何在 VBA 中模拟 Python 的“继续”语句的错误 AKA 进行下一次迭代?
问题描述
在以下代码中,如何在遇到错误后使循环在下一次迭代中继续 - 而不是下一行?
现在代码不会超过 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:
If Err.Number = 11 Then
Debug.Print ("Error on " & x)
End If
End Sub
我已经研究了这个答案: Skip to next iteration in loop vba等,但无法将其转换为我的代码。
解决方案
您需要Resume Next
在该行之后转到下一行,从而导致错误。Err.Clear
也是一个很好的做法。
Exit Sub
之前的也是errhandler
一个很好的做法:
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
过程中,它在 Debug.Print a/b 处引发错误 11,并在错误处理程序中分配 b = 5。然后Resume
重试Debug.Print a / b
,只要b
不是0
,它就会运行。
Resume Next
转到它被调用的地方,忽略该行并继续下一个。
在该TestMeResumeNext
过程中,抛出错误 91a = 12
并触发错误处理程序。在错误处理程序中,a 被分配给并被Range("A14")
跳过并继续。Resume Next
a = 12
Sub
Sub TestMeResumeNext()
On Error GoTo TestMeResumeNext_Error
Dim a As Range
a = 12 'Error 91 here!
Debug.Print a.Row 'Resume Next goes back here
Exit Sub
TestMeResumeNext_Error:
Set a = Range("A14")
Resume Next
End Sub
Sub TestMeResume()
On Error GoTo TestMeResume_Error
Dim a As Long: a = 10
Dim b As Long: b = 0
Debug.Print a / b 'Error 11 here the first time
Exit Sub
TestMeResume_Error:
b = 5
Resume
End Sub
推荐阅读
- assembly - 只有 EX/MEM 流水线寄存器或只有 MEM/WB 流水线寄存器时的停顿周期数
- tomcat - Tomcat - OpenLDAP 身份验证
- javascript - 如何在调用 API 的函数中返回 Promis
- sql-server - 用重复更新表
- webpack - 在样式标签内使用 Webpack 别名
- python - 如何根据列表中设置的顺序通过键中包含的子字符串对 Python 字典进行排序?
- python-3.x - 在 Pandas 的列中获取全年数据
- javascript - [Class].prototype 可以更改,尽管 Object.freeze([Class])
- python - 变量赋值不起作用。标准输出到 var
- r - 如何修复错误:此版本的 R 无法使用包“tzdb”