本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
Excelのマクロ(VBA)を作成していると、次のような経験はないでしょうか。
-
マクロ実行中に突然エラーが表示される
-
処理が途中で止まり、ファイルが中途半端な状態になる
-
どこでエラーが発生したのか分からない
特にファイル操作やデータ処理を行うマクロでは、エラーが発生すると処理が途中で止まり、思わぬトラブルにつながることがあります。
そのような問題を防ぐために重要なのが エラー処理(エラーハンドリング) です。
VBAでは On Error ステートメント を使うことで、
-
エラーが発生したときの処理を指定する
-
エラーを無視して処理を続行する
-
エラー内容をメッセージで表示する
といった制御を行うことができます。
この記事では、
-
VBAのエラー処理(エラーハンドリング)の基本
-
On Error の使い方
-
エラーを無視する方法
-
エラーメッセージの表示方法
などを マクロ初心者の方にも分かりやすく解説します。
なお、実際のエラーの原因や対処法については、以下の記事でも詳しく解説しています。
関連記事
-
VBAの実行時エラーとは?原因と対処法まとめVBAの実行時エラーとは?原因と対処法まとめ
マクロを安全に動かすためにも、ぜひエラー処理の基本を覚えておきましょう。
Excel VBAでエラー処理(エラーハンドリング)を行う方法
VBAでエラー処理が必要な理由
VBAでマクロを実行すると、何らかの原因で実行時エラーが発生することがあります。
たとえば次のようなケースです。
-
存在しないファイルを開こうとした
-
存在しないシートを参照した
-
無効な範囲を指定してしまった
このような場合、VBAはエラーを検出すると その時点でマクロの処理を停止します。
処理が途中で止まるだけならまだ良いのですが、場合によっては次のような問題が起きることもあります。
-
ファイルコピーが途中で止まり、中途半端なファイルが作成される
-
複数ブックを操作している途中で停止し、データの整合性が崩れる
-
自動処理が止まり、作業がやり直しになる
私自身も、マクロをあまり確認せずに実行してしまい、
-
コピー処理の範囲が想定以上に広がり、処理がなかなか終わらない
-
別のマクロと干渉してループ処理が止まらなくなる
といったトラブルを経験したことがあります。
慌てて Escキーで停止したり、保存せずにファイルを閉じたりしたこともありました。
これらは厳密には VBAの実行時エラーとは少し違うケースですが、
マクロ初心者のうちは「思わぬ動作」に慌ててしまうことも多いものです。
このようなトラブルを防ぐためにも、
エラーが発生したときの動作を制御できる エラーハンドリング を設定しておくと安心です。
エラー処理を設定しておけば、
-
エラーが発生したときの処理を指定する
-
エラー内容を表示する
-
処理を安全に終了させる
といった制御ができるようになります。
次の章では、VBAでエラー処理を行うときに使う 「On Error」ステートメントについて解説します。
VBAのエラー処理で使う「On Error」ステートメント
VBAでエラー処理を行うときは、On Error ステートメントを使用します。
On Error を設定すると、マクロ実行中にエラーが発生した場合の動作を指定することができます。
VBAでよく使われるエラー処理には、次のような種類があります。
| エラー処理 | 内容 |
|---|---|
| On Error GoTo | エラー発生時に指定した処理へ移動する |
| On Error Resume Next | エラーを無視して次の処理を続行する |
| On Error GoTo 0 | エラー処理を解除する |
たとえば、エラー発生時に特定の処理へ移動する場合は、次のように書きます。
On Error GoTo ErrHandler
このコードを設定しておくと、マクロ実行中にエラーが発生したときに
ErrHandler というラベルへ処理が移動します。
VBAのエラー処理の基本的な考え方は、
-
エラー処理を設定する
-
通常の処理を実行する
-
エラーが発生した場合のみエラー処理を実行する
という流れになります。
次の章では、実際に On Error GoTo を使った基本的なエラー処理の例を紹介します。
On Error GoTo を使った基本的なエラー処理の例
VBAで最も基本的なエラー処理は、On Error GoTo を使った方法です。
これは、エラーが発生したときに 指定した場所へ処理をジャンプさせる仕組みです。
簡単な例を見てみましょう。
Sub Sample()
On Error GoTo ErrHandler
Workbooks.Open "C:\test.xlsx"
MsgBox "処理が完了しました"
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました"
End Sub
-
On Error GoTo ErrHandlerでエラー処理を設定 -
Workbooks.Openでファイルを開く -
エラーがなければ処理完了メッセージを表示
-
エラーが発生した場合は
ErrHandlerへ移動
ここで重要なのが Exit Sub です。
Exit Sub
これを入れておかないと、エラーが発生していなくても
処理がそのまま ErrHandler のコードまで実行されてしまいます。
そのため、一般的なエラー処理では次のような構造で書くことが多いです。
↓
Exit Sub
↓
エラー処理
この形を覚えておくと、VBAのエラーハンドリングを書くときに迷いにくくなります。

この例では、ファイルが見つからない場合に「エラーが発生しました」とメッセージを表示します。
なお、On Error ステートメントの詳しい仕様については、
Microsoftの公式ページでも解説されています。
▶On Error ステートメント | Microsoft Learn
On Error Resume Next(エラーを無視する)
VBAでは、エラーが発生しても処理を停止させずにそのまま次の処理へ進めることもできます。
そのときに使うのが On Error Resume Next です。
On Error Resume Next
この設定をすると、エラーが発生してもマクロは停止せず、
エラーが発生した行をスキップして次の処理へ進みます。
たとえば次のようなコードです。
Sub Sample()
On Error Resume Next
Workbooks.Open "C:\test.xlsx"
MsgBox "処理を続行します"
End Sub
このコードでは、もし test.xlsx が存在しなくてもエラーは表示されず、
そのまま次の処理が実行されます。
この方法は、次のような場面でよく使用されます。
-
ファイルが存在するか確認したいとき
-
オブジェクト取得を試すとき
-
存在する場合だけ処理を実行したいとき
たとえば、ブックが開いているか確認する処理では次のように書くことがあります。
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("test.xlsx")
On Error GoTo 0
If wb Is Nothing Then
MsgBox "ブックは開いていません"
End If
ただし、On Error Resume Next を使いすぎるとエラーに気づきにくくなるため注意が必要です。

エラーが出ても処理を続行したい場合に利用します。
本来修正すべきエラーまで無視してしまうと、
思わぬ不具合の原因になることがあります。
そのため、必要な処理の前後だけに限定して使うのがおすすめです。
On Error GoTo 0(エラー処理を解除する)
On Error Resume Next を使用したあとに、
**通常のエラー処理に戻すために使うのが「On Error GoTo 0」**です。
On Error GoTo 0
このコードを実行すると、
それまで設定されていたエラー処理が解除され、通常のエラー処理に戻ります。
たとえば次のように使います。
On Error Resume Next
Set wb = Workbooks("test.xlsx")
On Error GoTo 0
この場合の処理の流れは次のようになります。
-
On Error Resume Nextでエラーを無視する設定 -
ブック取得を試す
-
On Error GoTo 0でエラー処理を解除
このように 必要な処理だけ一時的にエラーを無視することができます。
もし On Error GoTo 0 を書かない場合、
その後の処理でもエラーが無視され続けてしまう可能性があります。
そのため、On Error Resume Next を使った場合は、
処理が終わったら On Error GoTo 0 を書く習慣をつけると安全です。

一時的に無視していたエラー処理を解除できます。
エラー無視は必要な範囲だけに限定するのが安全です。
VBAでよく使うエラー処理の実践パターン
ここまで、VBAの基本的なエラー処理として次の3つを紹介しました。
-
On Error GoTo
-
On Error Resume Next
-
On Error GoTo 0
実際のマクロでは、これらを組み合わせて エラーメッセージの表示や処理の継続などを行います。
ここでは、VBAでよく使われるエラー処理のパターンを紹介します。
エラーメッセージを表示する(MsgBox)
エラーが発生したときに、ユーザーへ状況を知らせるために
**メッセージボックス(MsgBox)**を表示することがあります。
例えば次のようなコードです。
MsgBox "エラーが発生しました"
ただし、これだけでは どのようなエラーなのか分かりません。
そこでVBAでは、Errオブジェクトを使ってエラー内容を取得することができます。
MsgBox Err.Number & " : " & Err.Description
それぞれの意味は次の通りです。
| プロパティ | 内容 |
|---|---|
| Err.Number | エラー番号 |
| Err.Description | エラー内容 |
たとえば次のようなコードを書くと、エラーが発生したときに
エラー番号とエラー内容を表示することができます。
Sub Sample()
On Error GoTo ErrHandler
Workbooks.Open "C:\test.xlsx"
Exit Sub
ErrHandler:
MsgBox Err.Number & " : " & Err.Description
End Sub
このようにエラーメッセージを表示しておくと、
トラブルが発生したときの原因を把握しやすくなります。

VBAでエラーが発生したか確認する方法
VBAでは、エラーが発生したかどうかを Errオブジェクトで確認することができます。
基本的な書き方はこちらです。
If Err.Number <> 0 Then
Err.Number はエラー番号を表し、
エラーが発生していない場合は 0 になります。
そのため、次のように書くことでエラーの有無を確認できます。
On Error Resume Next
Workbooks.Open "C:\test.xlsx"
If Err.Number <> 0 Then
MsgBox "ファイルを開くことができませんでした"
End If
On Error GoTo 0
この方法は、次のような処理でよく使用されます。
-
ファイルが存在するか確認する
-
シート取得を試す
-
オブジェクト取得の確認
エラー処理と組み合わせることで、
より安全なマクロを作成することができます。

▼コピペOK:VBAエラー処理テンプレート
VBAでエラー処理を書くときは、毎回ゼロから書くよりも
基本となるテンプレートを用意しておくと便利です。
次のような形を覚えておくと、エラーハンドリングを書くときに迷いにくくなります。
Sub Sample()
On Error GoTo ErrHandler
'■■■■■■■■■■■■■■■■■■■■
'ここに通常の処理を書く
'■■■■■■■■■■■■■■■■■■■■
MsgBox "処理が完了しました"
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号:" & Err.Number & vbCrLf & _
"内容:" & Err.Description
End Sub
このテンプレートの流れは次の通りです。
On Error GoTo ErrHandler でエラー処理を設定
通常の処理を実行
エラーが発生した場合は ErrHandler へ移動
エラー内容を表示する
初心者のうちは、まずこの形をベースにマクロを書くと安全です。
テンプレートのポイント
特に重要なのは Exit Sub です。
Exit Sub
これを入れておかないと、エラーが発生していない場合でも
処理がそのまま ErrHandler に進んでしまいます。
そのため、VBAのエラー処理では次の構造が基本になります。
▼基本構造
通常処理
↓
Exit Sub
↓
エラー処理
この形を覚えておくと、エラーハンドリングを書くときに迷いにくくなります。
ファイル操作マクロでは特に重要
VBAのエラー処理はすべてのマクロで必須というわけではありませんが、
次のような処理では入れておくと安心です。
-
ファイルを開く(Workbooks.Open)
-
ファイルを保存する(SaveAs)
-
ファイルをコピーする
-
複数のブックを操作する
これらの処理では、エラーが発生すると
-
処理が途中で止まる
-
ファイルが中途半端な状態になる
といったトラブルにつながる可能性があります。
そのため、ファイル操作系のマクロではエラーハンドリングを入れておくことをおすすめします。
ループ処理でエラーが出ても処理を続ける
複数のデータを処理するマクロでは、
一部の処理でエラーが発生しても全体の処理を続けたい場合があります。
そのようなときは On Error Resume Next を使うことがあります。
例えば、セルに記載されたファイルを順番に開く処理です。
■セルに記載されたファイルを順番に開く例
この例では、Sheet1のA列にファイルパスを入力しておきます。
Sub Sample()
Dim i As Long
Dim filePath As String
On Error Resume Next
For i = 1 To 10
filePath = ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value
If filePath <> "" Then
Workbooks.Open filePath
End If
Next i
On Error GoTo 0
End Sub
このコードでは、もし存在しないファイルがあった場合でも
エラーで停止せず、次のファイルの処理へ進みます。
なお、この例では このマクロを保存しているブックの Sheet1 のA列にファイルパスが入力されている前提です。
また、複数ファイルを順番に開く処理では、Cells(i, 1) のように参照先を省略すると、
途中で開いたブックのセルを参照してしまうことがあります。
そのため、ThisWorkbook.Worksheets("Sheet1").Cells(i, 1)
のように参照先を明示すると、常に元のブックのセルを読み取れるため安全です。
ただし、すべてのエラーを無視してしまうと
問題に気づきにくくなることもあります。
そのため、次のような対策を組み合わせると、より安全なマクロになります。
-
エラー内容をログとして記録する
-
メッセージを表示してユーザーに知らせる
などの対策を組み合わせると、より安全なマクロになります。

存在しないパスは無視し、存在するファイルだけを順番に開けます。
エラー発生時に処理をリトライする
ネットワークファイルや外部データを扱う場合、
一時的な問題で処理が失敗することがあります。
そのような場合は、処理を再試行(リトライ)する仕組みを作ることもあります。
簡単な例はこちらです。
Sub Sample()
Dim retryCount As Integer
Retry:
On Error GoTo ErrHandler
Workbooks.Open "C:\test.xlsx"
Exit Sub
ErrHandler:
retryCount = retryCount + 1
If retryCount < 3 Then
Resume Retry
Else
MsgBox "処理に失敗しました"
End If
End Sub
このコードでは、
-
最大3回まで処理を再試行
-
それでも失敗した場合はメッセージ表示
という仕組みになっています。
このような方法を使うことで、
一時的なエラーに対して柔軟に対応することができます。

この例では、3回試しても失敗した場合に「処理に失敗しました」と表示します。
VBAでエラー処理を共通化する方法(応用)
VBAのマクロが増えてくると、
同じエラー処理を何度も書く場面が出てきます。
その場合は、エラー処理を 共通のサブルーチンとしてまとめることもできます。
例:
▼共通コードを呼び出しエラーが発生したことを伝える
Sub Sample()
On Error GoTo ErrHandler
Workbooks.Open "C:\test.xlsx"
Exit Sub
ErrHandler:
Call ShowErrorMessage 'ShowErrorMessageマクロを呼び出す
End Sub
▼エラー発生時にメッセージを表示させる共通コード
Sub ShowErrorMessage()
MsgBox "エラーが発生しました"
End Sub
このようにしておくと、
-
エラー処理の管理がしやすい
-
コードの重複を減らせる
といったメリットがあります。
ただし、初心者のうちは まず基本的なエラー処理の書き方を覚えることが大切です。
慣れてきたら、少しずつコードの整理や共通化も検討してみましょう。

コードの重複を減らしたいときに便利です。
VBAのエラー処理を理解するには、基本的なマクロの仕組みを知っておくことも大切です。
もしこれからVBAを学びたい場合は、次の記事も参考にしてみてください。
▶ VBAを独学で学ぶには?初心者でもわかるマクロの勉強手順とおすすめ教材
マクロの基本から順番に学ぶことで、エラー処理の理解もしやすくなります。
まとめ
VBAのエラー処理は、エラーが出たときにただ止まるのではなく、
「どのように対応するか」をあらかじめ決めておく仕組みです。
基本として覚えておきたいのは、次の3つです。
-
On Error GoTo
→ エラーが発生したときに、指定した処理へ移動する方法です。
エラーメッセージを表示したり、安全に終了したりしたい場合によく使われます。 -
On Error Resume Next
→ エラーが発生しても処理を止めず、次の行へ進める方法です。
ただし、必要な場面だけに絞って使うことが大切です。 -
On Error GoTo 0
→ 設定したエラー処理を解除し、通常の状態に戻す方法です。On Error Resume Nextを使ったあとに書いておくと安心です。
特に、ファイル操作や複数ブックを扱うマクロでは、
エラーハンドリングを入れておくことで 途中停止や中途半端な処理結果を防ぎやすくなります。
まずは難しく考えすぎず、
-
エラー時にメッセージを出す
-
必要な処理だけエラーを無視する
-
無視したあとは解除する
この3つを意識するだけでも、マクロの安全性はかなり変わります。
VBAに慣れてきたら、エラー処理を整理したり、共通化したりする方法も少しずつ取り入れてみましょう。
まずは基本的な 「On Error 」の使い方から慣れていきましょう。
ここまで、VBAのエラー処理の基本について解説しました。
最後によくある疑問をQ&A形式でまとめます。
よくある質問(FAQ)
On Error GoTo 0 は、設定していたエラー処理を解除する命令です。
たとえば On Error Resume Next で一時的にエラーを無視している場合、そのままにしておくと後続の処理でもエラーが無視され続けてしまいます。
そこで、必要な処理が終わったあとに On Error GoTo 0 を書いて、通常の状態に戻します。
エラーを無視する処理を書いたあとは、セットで覚えておくと安心です。
On Error Resume Next は、エラーが発生しても処理を止めず、次の行へ進める命令です。
たとえば、
-
ブックが開いているか確認したい
-
ファイルが存在するか試したい
-
一部の処理だけエラーを無視したい
といった場面で使われます。
ただし、何でも無視してしまうと本当の不具合にも気づきにくくなるため、
必要な範囲だけ使い、終わったら On Error GoTo 0 で解除するのが基本です。
VBAでは、Err.Number を使うことでエラーが発生したかどうかを確認できます。
たとえば、エラーが発生していない場合は Err.Number が 0 になり、エラーがある場合は 0 以外の番号が入ります。
If Err.Number <> 0 Then
MsgBox "エラーが発生しました"
End If
このように書くと、処理のあとでエラーの有無を確認できます。
VBAでは、MsgBox を使ってエラーメッセージを表示できます。
単純にメッセージを出すだけなら、次のように書けます。
MsgBox "エラーが発生しました"
さらに、エラー番号や内容も表示したい場合は Err.Number と Err.Description を使います。
MsgBox Err.Number & " : " & Err.Description
これにより、どのようなエラーだったのかを分かりやすく表示できます。
場合によります。
一時的な確認処理や存在チェックなどでは、On Error Resume Next を使うことがあります。
ただし、エラーを無視しすぎると
-
本来気づくべき不具合を見逃す
-
原因調査がしにくくなる
-
想定外のまま処理が進んでしまう
といった問題につながることがあります。
そのため、必要な処理だけ限定して使うことが大切です。
すべてのマクロに必須とは限りませんが、少なくとも次のような処理では入れておくと安心です。
-
ファイルを開く、保存する、コピーする
-
複数のブックやシートを操作する
-
外部ファイルや共有フォルダを扱う
-
途中で止まると困る処理を行う
特に、ファイル操作系のマクロではエラー発生時の影響が大きくなりやすいため、エラーハンドリングを入れておく価値があります。
実行時エラーは、マクロ実行中に実際に発生するエラーそのものです。
一方、**エラー処理(エラーハンドリング)**は、そのエラーが発生したときにどう対応するかを決めておく仕組みです。
たとえば、
-
実行時エラー9
-
実行時エラー91
-
実行時エラー1004
などは「発生するエラーの種類」です。
それに対して On Error GoTo などは、エラー発生時の対応方法になります。
【関連記事】
- VBA 実行時エラー9の原因と直し方|「インデックスが有効範囲にありません」を初心者向けに解説
- VBAで「オブジェクト変数または With ブロック変数が設定されていない」時の対処法|実行時エラー91を初心者向けに解説
- マクロ エラー1004の原因と修正方法|実行時エラーの対処法を初心者向けに解説
※外部リンク※
- On Error ステートメント |Microsoft Learn
- Excel VBA マクロ On Error GoToについて |Microsoft Learn
- エラー メッセージ |Microsoft Learn
※参考書籍 (PR)※
- 【Excel VBAのエラーを直す本 なぜ、あなたのVBAはスムーズに動かないのか?】(Amazon)
- 【実務で使えるExcel VBAプログラミング作法 ~「動けばOK」から卒業しよう! 生産性が上がるコードの書き方】(Amazon)
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。
