Excel VBA 逆引き集 | Resume Next

Excel VBA
スポンサーリンク

On Error Resume Next 基本

VBAでよく使うエラー処理のひとつが On Error Resume Next です。
これは「エラーが発生しても止まらず、次の行へ進む」という仕組みです。初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • 通常の動作:
    VBAはエラーが出ると処理を止めてエラーメッセージを表示します。
  • Resume Nextを使うと:
    エラーが出ても止まらず「次の行」に進みます。
    → ただし「エラーを無視する」わけではなく、Err.NumberErr.Description に情報が残ります。

テンプレ1:存在しないシートを参照しても止まらない

Sub ResumeNext_Basic()
    On Error Resume Next   ' エラーが出ても止まらない
    
    Worksheets("NoSheet").Activate   ' 存在しないシート → エラー
    
    If Err.Number <> 0 Then
        MsgBox "エラー発生: " & Err.Description
        Err.Clear   ' エラー情報をクリア
    End If
    
    On Error GoTo 0   ' 通常のエラー動作に戻す
End Sub
VB
  • ポイント:
    • Err.Number が0以外ならエラー発生。
    • Err.Clear でエラー情報を消す。
    • On Error GoTo 0 で通常動作に戻す。

テンプレ2:ファイルが存在しない場合でも処理を続行

Sub ResumeNext_FileCheck()
    Dim f As Integer
    f = FreeFile
    
    On Error Resume Next
    Open "C:\no\such\file.txt" For Input As #f
    
    If Err.Number <> 0 Then
        MsgBox "ファイルが存在しません: " & Err.Description
        Err.Clear
    Else
        MsgBox "ファイルを開けました!"
        Close #f
    End If
    
    On Error GoTo 0
End Sub
VB
  • ポイント:
    • ファイルが無い場合でも止まらずに「存在しません」と表示できる。
    • 実務で「ファイルがあれば処理、なければスキップ」といった場面に便利。

テンプレ3:複数処理の中で失敗したものだけスキップ

Sub ResumeNext_Loop()
    Dim i As Long
    
    For i = 1 To 5
        On Error Resume Next
        Worksheets("Sheet" & i).Activate
        If Err.Number <> 0 Then
            MsgBox "Sheet" & i & " は存在しません"
            Err.Clear
        End If
        On Error GoTo 0
    Next i
End Sub
VB
  • ポイント:
    • ループ処理で「存在しないシートはスキップ」できる。
    • エラーを無視せず、必ず判定してログやメッセージを残す。

例題で練習

'例1:存在しないシートを参照 → エラーを捕まえて続行
'例2:ファイルが無い場合 → エラーを捕まえて「存在しません」と表示
'例3:複数シートを順番に開く → 無いシートはスキップ
VB

初心者向けポイント

  • Resume Nextは「無視」ではなく「次へ進む」
  • 必ずErr.Numberで判定する → そうしないと「気づかないまま処理が進む」危険あり
  • Err.Clearでリセット → 次の処理に影響しないようにする
  • On Error GoTo 0で通常動作に戻す → Resume Nextを垂れ流しにしない
  • 実務では「存在チェック」「スキップ処理」に便利

👉 この「On Error Resume Nextテンプレ」を覚えておけば、Excel VBAで エラーを止めずに処理を続行しつつ、必要な場面でエラーを判定して安全に処理する ことができます。

タイトルとURLをコピーしました