处理VBA时出错:什么时候没有错误?

M3H*_*HD1 7 error-handling excel vba

我试图用VBA捕获一些错误,我发现本教程,我想使用GoTo如下例子中的方法捕获错误:

Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
MsgBox "ERROR"

End Sub
Run Code Online (Sandbox Code Playgroud)

问题是,即使没有错误,该errorHandler部分也始终执行!我发现了这个讨论,但提出的答案并没有解决
我试图添加Exit Sub声明的问题,如下所述:

Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
    Exit Sub

'
' Some Code
'
errorHandler:
  MsgBox "ERROR"

End Sub
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使没有错误,它也会退出方法.我也尝试过:

 Sub mySub
 On Error GoTo errorHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
  MsgBox "ERROR"
  Exit Sub
End Sub
Run Code Online (Sandbox Code Playgroud)

但仍然是同样的问题,myHandler甚至没有错误地执行.

Fio*_*ala 13

只需将Exit sub放入.

Sub mySub
 On Error GoTo myHandler:
    Workbooks.Open("myWorkbook")
'
' Some Code
'
Exit sub

myHandler:
MsgBox "EROOR !"

err.clear
End Sub
Run Code Online (Sandbox Code Playgroud)

  • On Error GoTo 0将错误处理关闭,告诉VB/VBA停止并在遇到错误时抛出错误消息.它(也隐含地)清除错误条件.在这样的简单情况下,使用它可能没有任何缺点,但在其他情况下你想要捕获错误,处理它然后恢复处理,你肯定不想使用GoTo 0.甚至在这简单的说,它没有任何优势; 总的来说,这是一个坏习惯,我会说. (2认同)

pho*_*oog 5

这是我喜欢的模式:

Sub SomeSub()
    On Error GoTo ErrorLabel

    'Code goes here

ExitLabel:
   'Clean-up code, if any, goes here 
   Exit Sub

ErrorLabel:
    'Error-handling code goes here
    Resume ExitLabel
End Sub
Run Code Online (Sandbox Code Playgroud)

请注意Resume清除错误。我喜欢这种模式有几个原因:

  1. 习惯性地在错误处理块之前插入退出块可减少出现OP意外掉入错误处理程序的问题。
  2. GoTo ExitLabel用于Sub或Function的任何早期退出。这样,我不太可能无意间跳过清理代码。例:

    Sub SomeOtherSub()
        Dim x As ResourceThatNeedsToBeClosed
        Dim i As Long
        On Error GoTo ErrorLabel
        Set x = GetX
        For i = 1 To 100
            If x.SomeFunction(i) Then
                GoTo ExitLabel
            End If
        Next
    ExitLabel:
        x.Close
    ErrorLabel:
        'Error-handling code goes here
        Resume ExitLabel
    End Sub
    
    Run Code Online (Sandbox Code Playgroud)