我尽可能多地上网查看(除了微软支持网站,该网站由于某种原因在工作中被屏蔽)。我试图简单地跳过一个错误。我在这里编写的代码经过简化,但应该以相同的方式工作。
我的代码应该做什么:我的一名潜艇在循环中创建形状并命名它们(btn_1、btn_2 等)。但在创建它们之前,它会调用一个子程序来尝试删除它们,以免创建重复项。该子循环遍历(btn_1、btn_2等)并使用以下命令删除形状:
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
当然,有时该形状无法删除,因为它根本不存在。我发现大多数时候,建议的修复方法是在设置形状之前添加(在接下来的错误恢复中),因为我收到一条错误消息说它不存在。我已经在循环内部、循环之前等进行了尝试,如下所示:
for i = 1 to (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
据我了解,如果形状不存在,它应该直接循环,但无论接下来是否添加“错误恢复”,我仍然会遇到相同的错误!我究竟做错了什么?
编辑:当形状确实存在时,不会出现错误。
我发现大多数时候,建议的修复方法是在设置形状之前添加(在接下来的错误恢复中),因为我收到一条错误消息说它不存在。
NO!
推荐的方式handle运行时错误是not把他们推到地毯下并继续执行,就像什么都没发生一样——这正是On Error Resume Next
does.
最简单的方法avoid运行时错误的目的是检查错误条件,并避免执行导致 100% 失败率的代码,例如尝试在对象引用上运行方法Nothing
:
For i = 1 To (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
If Not shp Is Nothing Then shp.Delete
Next
如果您无法检查错误条件并且must处理错误,推荐的方法是handle them:
Private Sub DoSomething()
On Error GoTo CleanFail
'...code...
CleanExit:
'cleanup code here
Exit Sub
CleanFail:
If Err.Number = 9 Then 'subscript out of range
Err.Clear
Resume Next
Else
MsgBox Err.Description
Resume CleanExit
End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)