【Excel VBA】On Error GoToの使い方|エラー処理・Resume Next・Err.Numberの違い

みなさんこんにちは。

Excel VBAでマクロを作成していると、ファイルが見つからない、シートが存在しない、0で割り算をしてしまうなど、さまざまな実行時エラーが発生することがあります。

エラーが発生するたびにマクロが途中で停止してしまうと、実際の業務では使いにくいですよね。

このような場合に使用するのが、On Error GoToを使ったエラー処理です。

今回は、On Error GoToの基本的な使い方から、Err.Number・Err.Descriptionの確認方法、Exit Subを入れる理由、On Error Resume Nextとの違い、エラーを無視し続ける危険性まで順番にご紹介したいと思います。


この記事はこんな人におすすめ

  • VBAでエラーが発生するとマクロが止まってしまう人
  • On Error GoToの基本的な書き方を知りたい人
  • Err.NumberとErr.Descriptionの違いを知りたい人
  • On Error Resume Nextを何となく使っている人
  • 実務で安全なエラー処理を書きたい人

といったところでしょうか。

まずはエラーが発生するコードを確認する

Sub エラーを発生させる()

    Dim answer As Double

    answer = 10 / 0

    MsgBox "処理が完了しました。"

End Sub

このコードでは、0で割り算をしているため実行時エラーが発生します。

Excel VBAで0除算を実行して実行時エラー11が表示された画面

On Error GoToの基本的な使い方

Sub エラー処理の基本()

    On Error GoTo ErrHandler

    Dim answer As Double

    answer = 10 / 0

    MsgBox "処理が完了しました。"

    Exit Sub

ErrHandler:

    MsgBox "エラーが発生しました。", vbExclamation

End Sub

この例では、エラーが発生すると ErrHandler: まで処理が移動して、メッセージを表示します。

On Error GoToで指定するラベルは、同じプロシージャ内に記述する必要があります。

Exit Subを入れる理由

エラー処理を書くときに忘れやすいのが、エラーハンドラの直前に記述する Exit Sub です。

    MsgBox "正常に処理が完了しました。"

    Exit Sub

ErrHandler:

    MsgBox "エラーが発生しました。"

Exit Subがないと、正常終了した場合でもそのままErrHandlerの処理へ進んでしまいます。

Err.NumberとErr.Descriptionでエラー内容を確認する

プロパティ内容
Err.Number発生したエラーを識別する番号
Err.Descriptionエラー内容を表す説明文
Sub エラー内容を確認する()

    On Error GoTo ErrHandler

    Dim answer As Double

    answer = 10 / 0

    Exit Sub

ErrHandler:

    MsgBox "エラー番号:" & Err.Number & vbCrLf & _
           "エラー内容:" & Err.Description, _
           vbExclamation

End Sub

実務で使いやすい基本形

Sub サンプル処理()

    On Error GoTo ErrHandler

    '通常の処理をここに記述する

    MsgBox "正常に処理が完了しました。", vbInformation

    Exit Sub

ErrHandler:

    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号:" & Err.Number & vbCrLf & _
           "エラー内容:" & Err.Description, _
           vbExclamation

End Sub

Resume Nextとは

エラーハンドラへ移動したあと、エラーが発生した次の行から処理を再開したい場合は Resume Next を使用できます。

Sub ResumeNextの例()

    On Error GoTo ErrHandler

    Dim answer As Double

    answer = 10 / 0

    MsgBox "次の処理を実行しました。"

    Exit Sub

ErrHandler:

    MsgBox "エラーが発生したため、次の処理へ進みます。", vbExclamation

    Resume Next

End Sub

On Error Resume Nextとの違い

記述動作
Resume Nextエラーハンドラから、エラーが発生した次の行へ処理を戻す
On Error Resume Next実行時エラーが発生しても、その次の行から処理を続ける
Sub OnErrorResumeNextの例()

    On Error Resume Next

    Dim answer As Double

    answer = 10 / 0

    MsgBox "処理を続行しました。"

End Sub
Excel VBAでOn Error Resume Nextを使用してエラー発生後も処理を続行した画面

On Error Resume Nextを使い続けるのは注意

On Error Resume Nextは便利ですが、プロシージャ全体に対して何となく指定してしまうのはおすすめできません。

エラーが発生しても処理が継続されるため、「実は途中で失敗しているのに、最後までマクロが動いたように見える」という状態になる可能性があるからです。

On Error Resume Next

Set ws = Worksheets("存在確認したいシート")

If Err.Number <> 0 Then

    MsgBox "指定したシートは存在しません。"

    Err.Clear

End If

On Error GoTo 0

On Error GoTo 0は「0番の行へ移動する」という意味ではなく、現在のプロシージャで有効になっているエラー処理を無効にする記述です。

エラー番号によって処理を分ける

ErrHandler:

    Select Case Err.Number

        Case 9

            MsgBox "指定したシートやブックが見つかりません。", vbExclamation

        Case 11

            MsgBox "0で割り算することはできません。", vbExclamation

        Case Else

            MsgBox "エラー番号:" & Err.Number & vbCrLf & _
                   "エラー内容:" & Err.Description, vbExclamation

    End Select

エラー処理がない場合とある場合を比較する

方法特徴用途
エラー処理なし実行時エラーでマクロが停止する簡単な検証コード
On Error GoToエラー処理を1か所にまとめられる通常の実務マクロ
On Error Resume Nextエラー後も次の行から処理を続けるエラー発生を想定し、直後にErrを確認する処理

参考情報

最後に

いかがでしたでしょうか。

今回は、Excel VBAのOn Error GoToを使用したエラー処理についてご紹介しました。

On Error GoToを使用すれば、実行時エラーが発生した場合でもエラーハンドラへ処理を移動して、Err.NumberやErr.Descriptionから原因を確認することができます。

一方、On Error Resume Nextはエラーが発生しても次の処理へ進むため、何となくプロシージャ全体へ指定してしまうとエラーに気づきにくくなります。

エラー処理は実務で使用するマクロを安定して動かすために重要な処理になりますので、少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA