エラー処理

エラーが出たらラベルに飛ぶ:On Error Goto ラベル名

Sub test1()
    On Error GoTo ErrHandler

    Dim x As Long, y As Long
    x = 1
    Debug.Print x / y
    
    Exit Sub

ErrHandler:
    Debug.Print "エラー:" & Err.Description
End Sub

エラーが出なかったら処理を終了:Exit Sub

これが無いと「End Sub」まで処理が進行していくので、ラベル行に書いた処理も実行されてしまう

エラーを無視する:On Error Resume Next

Sub test2()
    On Error Resume Next

    Dim x As Long, y As Long
    x = 1
    Debug.Print x / y
    Debug.Print "エラーは無視された"
    
    Dim a As Long, b As Long
    x = 5
    Debug.Print a / b
    Debug.Print "2回目エラーも無視"
End Sub

ちなみに「Resume」は「りずーむ」と読む 「再開する」的な意味(Weblioより

エラー処理を解除する:On Error GoTo 0

これ以降にエラーが出たら、無視したりラベルに飛んだりしない

Sub test2()
    On Error Resume Next

        Dim x As Long, y As Long
        x = 1
        Debug.Print x / y
        Debug.Print "エラーは無視された"
    
    On Error GoTo 0
    
    Dim a As Long, b As Long
    a = 5
    Debug.Print a / b    'エラーが出る

End Sub

ラベルから元の位置に戻る:Resume

「Exit Sub」を忘れると無限ループに陥るので注意

Sub test1()

    On Error GoTo ErrHandler

    Dim x As Long, y As Long
    x = 1    
    Debug.Print x / y
    
    Exit Sub

ErrHandler:
    y = 5
    Debug.Print "yはやっぱ " & y
    Resume

End Sub

エラーが出たら10回まで再試行する

ChatGPT作の再試行ロジック Sleep関数と組み合わせると「1秒おきに再試行」というのも可能

Sub RetryOnErrors()
    Dim maxRetries As Integer
    Dim retryCount As Integer
    Dim success As Boolean
    
    maxRetries = 10 ' 最大再試行回数を10回に設定
    retryCount = 0
    success = False
    
    Do While retryCount < maxRetries And Not success
        On Error Resume Next ' エラーが発生しても即座に次のコードを実行
        
        ' ここにエラーが発生する可能性のあるコードを記述します
        ' 例:データの取得や処理を行う関数など
        
        If Err.Number <> 0 Then
            ' エラーが発生した場合の処理
            retryCount = retryCount + 1
            Err.Clear ' エラーオブジェクトをクリアして次の試行に備える
        Else
            ' エラーが発生しなかった場合の処理
            success = True ' 成功フラグを立てる
        End If
        
        On Error GoTo 0 ' エラーハンドリングを元に戻す
    Loop
    
    If success Then
        MsgBox "処理が成功しました。", vbInformation
    Else
        MsgBox "エラーが発生しました。再試行回数が上限に達しました。", vbExclamation
    End If
End Sub

仕様メモエラー処理

Posted by rafavba