8

GoTo次のステートメントを使用して、いくつかのVBAエラーをキャッチする必要があります。

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

End Sub

問題は、エラーがないときにerrorHandlerセクションが実行されることです。
私はこの議論を見つけましたが、答えは私の問題を解決しません。説明されているようにステートメントを
追加してみました:Exit Sub

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

'
' Some Code
'
errorHandler:
  MsgBox "ERROR"

End Sub

この場合、エラーがないときにメソッドを終了します。私も試しました:

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

しかし、それでも同じ問題:errorHandlerエラーが発生しなくても実行されます。

4

8 に答える 8

14

Exitsubをに入れるだけです。

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

myHandler:
MsgBox "EROOR !"

err.clear
End Sub
于 2012-04-13T13:01:15.007 に答える
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

Resumeエラーをクリアすることに注意してください。私がこのパターンを気に入っている理由はいくつかあります。

  1. エラー処理ブロックの前に出口ブロックを習慣的に挿入すると、エラーハンドラーに誤ってドロップするという OP の問題が発生する可能性が低くなります。
  2. Sub または Function からの早期終了に使用GoTo ExitLabelます。こうすることで、誤ってクリーンアップ コードをスキップする可能性が低くなります。例:

    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
    
于 2012-04-14T20:22:09.820 に答える
2
Public Sub MySub
    On Error Goto Skip

    ' Some Codes

Skip:
    If err.Number > 0 Then

        ' Run whatever codes if error occurs

        err.Clear
    End If
    On Error Goto 0
End Su
于 2012-04-14T00:04:17.367 に答える