Dav*_*d G 20 error-handling excel vba excel-vba
我尽可能多地在线查看(微软支持网站除外,因为某些原因在工作时被阻止).我试图简单地跳过一个错误.我在这里写的代码是简化的,但应该以相同的方式工作.
我的代码应该做什么: 我的一个潜艇在循环中创建形状并命名它们(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
Run Code Online (Sandbox Code Playgroud)
当然,它不会被删除,因为它根本就不存在.我发现在大多数情况下,推荐的修复是在设置形状之前添加(在错误恢复下),因为我得到一个错误,说它不存在.我已经在循环内部,循环之前等尝试过它,如下所示:
for i = 1 to (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
Run Code Online (Sandbox Code Playgroud)
据我所知,如果形状不存在,它应该循环通过,但是我仍然得到相同的错误,无论我是否添加On错误恢复下一个!我究竟做错了什么?
编辑:形状确实存在时没有错误.
Mat*_*don 25
我发现在大多数情况下,推荐的修复是在设置形状之前添加(在错误恢复下),因为我得到一个错误,说它不存在.
处理运行时错误的推荐方法不是将它们推到地毯下并继续执行,就好像什么也没发生 - 这正是On Error Resume Next
它的作用.
避免运行时错误的最简单方法是检查错误情况,并避免执行导致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
Run Code Online (Sandbox Code Playgroud)
如果您无法检查错误情况并且必须处理错误,建议的方法是处理它们:
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
Run Code Online (Sandbox Code Playgroud)
Sid*_*out 15
如果您了解自己在做什么以及它将如何影响您的代码,那么使用OERN(On Error Resume Next)没有任何错误.
在你的情况下,使用OERN是完全正常的
Dim shp As Shape
For i = 1 To (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.Delete
On Error GoTo 0
Next
Run Code Online (Sandbox Code Playgroud)
同时确保你不要做类似的事情
On Error Resume Next
<Your Entire Procedure>
On Error GoTo 0
Run Code Online (Sandbox Code Playgroud)
这将抑制所有错误.使用正确的错误处理,如Matt所示
编辑:
这是另一个关于如何使用OERN的漂亮示例此函数检查特定工作表是否存在.
Function DoesWSExist(wsName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Sheets(wsName)
On Error GoTo 0
If Not ws Is Nothing Then DoesWSExist = True
End Function
Run Code Online (Sandbox Code Playgroud)
如果您愿意,您也可以遍历所有工作表以检查工作表是否存在!
Fre*_*Man 14
而不是试图盲目删除形状和跳过错误,为什么不运行已知形状列表并删除它们.然后,你就不必担心了On Error Resume Next
这往往最终被滥用.
Sub Test(TheSheet As Worksheet)
Dim Shp as Shape
For Each Shp in TheSheet.Shapes
If left(Shp.Name, 4) = "btn_" Then
Shp.Delete
End if
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
如果要删除所有形状,请删除该If
语句.如果要删除许多不同名称的形状,请If
相应地修改该语句.
听起来你有错误的错误捕获选项集.在VBA编辑器中,选择Tools -> Options
.在打开的窗口中,选择General tab
,然后选择Break on Unhandled Errors
单选按钮.这应该允许Excel正确处理On Error Resume Next
命令.
我怀疑你Break on All Errors
选择了.
归档时间: |
|
查看次数: |
2749 次 |
最近记录: |