Loading

ROUTE

ルートゼロの
アクティビティ

VBAのOn Error GoToとResume Nextの違い

2

VBAで「エラーが出たら止めたい」「一部だけ続けたい」と迷ったら、On Error GoTo と On Error Resume Next を使い分けます。前者は指定したエラー処理行へ移動し、後者はエラー行の次へ進みます。続行する場合は `Err.Number` の確認を忘れないことが重要です。

GoToは処理へ移動、Resume Nextは次の行へ

書き方 エラー発生時 向いている状況
On Error GoTo HandleError 同じSub内のラベルへ移動 予期しない失敗を知らせて終了する
On Error Resume Next 失敗した行の次の行へ進む 存在確認など失敗を想定した短い箇所
On Error GoTo 0 現在のプロシージャのエラーハンドラーを無効化 一時的な続行処理を終える

`On Error` は 実行時エラー に対する動作を決める構文です。コードの文法ミスを直したり、エラー原因そのものを解消したりするものではありません。

用語解説:実行時エラー
VBAのコードを動かした途中で、型の変換失敗や存在しないシート参照などが起きて処理できなくなること。


On Error GoToで失敗を表示して終了する

ExcelでAlt+F11からVBAエディターを開き、標準モジュールへ次のサンプルを貼り付けます。`CLng("abc")` は数値として変換できないため、エラー処理の挙動を確かめられます。

Sub DemoGoTo()
    On Error GoTo HandleError

    Dim amount As Long
    amount = CLng("abc")
    Debug.Print amount
    Exit Sub

HandleError:
    Debug.Print "番号=" & Err.Number & " 説明=" & Err.Description
End Sub

この例では `HandleError:` の行へ制御が移り、イミディエイトウィンドウ(Ctrl+G)にエラー番号と説明が出る想定です。通常時は `Exit Sub` があるため、エラー処理行を通らずに終了します。

用語解説:ラベル
`HandleError:` のようにコード上の移動先を示す名前。GoToの移動先は同じSubまたはFunction内に置きます。


Resume Nextで処理を続けるときは直後に検査

たとえばオプションの `Data` シートが存在するかを調べるときは、失敗を想定した 1行だけ を一時的に続行させ、すぐに結果を確認します。

Sub DemoResumeNext()
    Dim ws As Worksheet
    Dim errorNo As Long

    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("Data")
    errorNo = Err.Number
    Err.Clear
    On Error GoTo 0

    If errorNo <> 0 Or ws Is Nothing Then
        Debug.Print "Dataシートを確認してください。番号=" & errorNo
        Exit Sub
    End If

    Debug.Print ws.Name
End Sub

`On Error Resume Next` が広い範囲に残ると、別の失敗まで見落とします。`Err.Number` を取得したら `Err.Clear` で状態を消し、`On Error GoTo 0` で通常のエラー動作へ戻してください。ここでは実際のシート作成や保存は行いません。

用語解説:Err.Number
直近のVBA実行時エラーを識別する番号。0はエラーが記録されていない状態を示します。


失敗しやすい書き方と確認方法

On Error Resume Next
Worksheets("Data").Range("A1").Value = 1
Worksheets("Other").Range("A1").Value = 2
' 途中で失敗しても気づきにくい: この書き方は避ける

上の例は避けたい例です。エラーに気づかず次の行へ進み、処理の一部だけが実行される危険があります。

  1. 実際に停止した行を確認する。
  2. 必要なシート・変数・入力値が存在するかを確認する。
  3. 続行が必要な場合は対象行だけに限定し、直後に `Err.Number` を調べる。
  4. 原因が解消したことを確認してから、必要な処理を再実行する。

`Resume Next` という単独のステートメントは、エラーハンドラー内などで次の行へ復帰する別の用途にも使われます。この記事で扱う `On Error Resume Next` と混同しないようにしましょう。

(「型が一致しません」の原因を詳しく調べる場合については『VBA「実行時エラー13 型が一致しません」5つの原因と防御的プログラミングとは?』をご参照ください)

よくある疑問

On Error GoTo 0はエラー番号を0にしますか?

いいえ。現在のSub・Functionで有効なエラーハンドラーを無効にする文です。Errオブジェクトを明示的に消すときはErr.Clearを使います。

Resume Nextはどんなエラーでも続けてよいという意味ですか?

違います。続行が安全で、その結果を直後に検査できる場所に限定して使います。原因不明のエラーを広範囲で無視する書き方は避けます。

次に学ぶこと

まずサンプルを1つずつ動かし、`Debug.Print` の出力とエラー発生行を照合してみてください。次はシート名の誤り、型変換、ファイルの存在確認など、小さな失敗を意図的に再現し、止めて知らせる場合と確認後に続ける場合の違いを自分で判断できるようにしましょう。

ルートゼロの採用情報を見る

すべてを開示している会社です

ポジティブな面もネガティブな面も、包み隠さず誠実にお答えします。
気になることがあれば、面談の際にすべてオープンにお話します。