エラー処理
Contents
エラーが出たらラベルに飛ぶ: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