【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で割り算をしているため実行時エラーが発生します。

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

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スクレイピングを使って自動化しましょう!
