VBA Excel简单的错误处理

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)

如果您愿意,您也可以遍历所有工作表以检查工作表是否存在!

  • ++但不幸的是大多数人都不理解使用OERN的含义.我喜欢这个缩写btw.我保留它. (3认同)

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相应地修改该语句.


Deg*_*taf 8

听起来你有错误的错误捕获选项集.在VBA编辑器中,选择Tools -> Options.在打开的窗口中,选择General tab,然后选择Break on Unhandled Errors单选按钮.这应该允许Excel正确处理On Error Resume Next命令.

我怀疑你Break on All Errors选择了.