Excel VBAのエラー処理とは?On Errorの使い方とエラーハンドリングの基本を解説

Excel VBAのエラー処理とは?On Errorの使い方とエラーハンドリングの基本を解説

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。

Excelのマクロ(VBA)を作成していると、次のような経験はないでしょうか。

  • マクロ実行中に突然エラーが表示される

  • 処理が途中で止まり、ファイルが中途半端な状態になる

  • どこでエラーが発生したのか分からない

特にファイル操作やデータ処理を行うマクロでは、エラーが発生すると処理が途中で止まり、思わぬトラブルにつながることがあります。

そのような問題を防ぐために重要なのが エラー処理(エラーハンドリング) です。

VBAでは On Error ステートメント を使うことで、

  • エラーが発生したときの処理を指定する

  • エラーを無視して処理を続行する

  • エラー内容をメッセージで表示する

といった制御を行うことができます。

この記事では、

  • VBAのエラー処理(エラーハンドリング)の基本

  • On Error の使い方

  • エラーを無視する方法

  • エラーメッセージの表示方法

などを マクロ初心者の方にも分かりやすく解説します。

なお、実際のエラーの原因や対処法については、以下の記事でも詳しく解説しています。

関連記事

マクロを安全に動かすためにも、ぜひエラー処理の基本を覚えておきましょう。


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のエラー処理の基本的な考え方は、

  1. エラー処理を設定する

  2. 通常の処理を実行する

  3. エラーが発生した場合のみエラー処理を実行する

という流れになります。

次の章では、実際に 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
このコードの流れは次のようになります。
  1. On Error GoTo ErrHandler でエラー処理を設定

  2. Workbooks.Open でファイルを開く

  3. エラーがなければ処理完了メッセージを表示

  4. エラーが発生した場合は ErrHandler へ移動

ここで重要なのが Exit Sub です。

Exit Sub

これを入れておかないと、エラーが発生していなくても
処理がそのまま ErrHandler のコードまで実行されてしまいます。

そのため、一般的なエラー処理では次のような構造で書くことが多いです。

通常処理

Exit Sub

エラー処理

この形を覚えておくと、VBAのエラーハンドリングを書くときに迷いにくくなります。

Excel VBAでOn Error GoTo ErrHandlerを使用してエラー発生時にメッセージを表示する例
On Error GoTo ErrHandler を使うと、エラーが発生したときに指定したエラー処理へ移動できます。
この例では、ファイルが見つからない場合に「エラーが発生しました」とメッセージを表示します。

なお、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 を使いすぎるとエラーに気づきにくくなるため注意が必要です。

Excel VBAでOn Error Resume Nextを使いエラーが出ても処理を続けるサンプル
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

この場合の処理の流れは次のようになります。

  1. On Error Resume Next でエラーを無視する設定

  2. ブック取得を試す

  3. On Error GoTo 0 でエラー処理を解除

このように 必要な処理だけ一時的にエラーを無視することができます。

もし On Error GoTo 0 を書かない場合、
その後の処理でもエラーが無視され続けてしまう可能性があります。

そのため、On Error Resume Next を使った場合は、
処理が終わったら On Error GoTo 0 を書く習慣をつけると安全です。

Excel VBAでOn Error Resume Nextと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

このようにエラーメッセージを表示しておくと、
トラブルが発生したときの原因を把握しやすくなります。

Excel VBAでErr.NumberとErr.Descriptionを表示するエラー処理の例
Err.Number と Err.Description を使うと、 エラー番号とエラー内容を表示できます。 原因の特定やデバッグに役立ちます。

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

この方法は、次のような処理でよく使用されます。

  • ファイルが存在するか確認する

  • シート取得を試す

  • オブジェクト取得の確認

エラー処理と組み合わせることで、
より安全なマクロを作成することができます。

Excel VBAでErr.Numberを使ってファイルを開けなかったときにメッセージを表示する例
On Error Resume Next と Err.Number を使うと、ファイルを開けなかったかどうかを判定できます。 この例では、エラー発生時に「ファイルを開くことができませんでした」と表示しています。

▼コピペ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)
のように参照先を明示すると、常に元のブックのセルを読み取れるため安全です。

ただし、すべてのエラーを無視してしまうと
問題に気づきにくくなることもあります。

そのため、次のような対策を組み合わせると、より安全なマクロになります。

  • エラー内容をログとして記録する

  • メッセージを表示してユーザーに知らせる

などの対策を組み合わせると、より安全なマクロになります。

Excel VBAでThisWorkbook.Worksheets(\"Sheet1\")を指定して複数ファイルを順番に開くループ処理の例
複数ファイルを順番に開く場合は、ThisWorkbook.Worksheets(\”Sheet1\”) のように参照先を明示すると安全です。
存在しないパスは無視し、存在するファイルだけを順番に開けます。

エラー発生時に処理をリトライする

ネットワークファイルや外部データを扱う場合、
一時的な問題で処理が失敗することがあります。

そのような場合は、処理を再試行(リトライ)する仕組みを作ることもあります。

簡単な例はこちらです。

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回まで処理を再試行

  • それでも失敗した場合はメッセージ表示

という仕組みになっています。

このような方法を使うことで、
一時的なエラーに対して柔軟に対応することができます。

Excel VBAでエラー発生時に最大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

このようにしておくと、

  • エラー処理の管理がしやすい

  • コードの重複を減らせる

といったメリットがあります。

ただし、初心者のうちは まず基本的なエラー処理の書き方を覚えることが大切です。

慣れてきたら、少しずつコードの整理や共通化も検討してみましょう。

Excel VBAで共通のSubを呼び出してエラーメッセージ表示を共通化する例
エラーメッセージ表示を別のSubにまとめると、同じ処理を複数のマクロで使い回しやすくなります。
コードの重複を減らしたいときに便利です。

VBAのエラー処理を理解するには、基本的なマクロの仕組みを知っておくことも大切です。

もしこれからVBAを学びたい場合は、次の記事も参考にしてみてください。

▶ VBAを独学で学ぶには?初心者でもわかるマクロの勉強手順とおすすめ教材

マクロの基本から順番に学ぶことで、エラー処理の理解もしやすくなります。


まとめ

VBAのエラー処理は、エラーが出たときにただ止まるのではなく、
「どのように対応するか」をあらかじめ決めておく仕組みです。

基本として覚えておきたいのは、次の3つです。

  • On Error GoTo
    → エラーが発生したときに、指定した処理へ移動する方法です。
    エラーメッセージを表示したり、安全に終了したりしたい場合によく使われます。

  • On Error Resume Next
    → エラーが発生しても処理を止めず、次の行へ進める方法です。
    ただし、必要な場面だけに絞って使うことが大切です。

  • On Error GoTo 0
    → 設定したエラー処理を解除し、通常の状態に戻す方法です。
    On Error Resume Next を使ったあとに書いておくと安心です。

特に、ファイル操作や複数ブックを扱うマクロでは、
エラーハンドリングを入れておくことで 途中停止や中途半端な処理結果を防ぎやすくなります。

まずは難しく考えすぎず、

  • エラー時にメッセージを出す

  • 必要な処理だけエラーを無視する

  • 無視したあとは解除する

この3つを意識するだけでも、マクロの安全性はかなり変わります。

VBAに慣れてきたら、エラー処理を整理したり、共通化したりする方法も少しずつ取り入れてみましょう。

VBAのエラー処理を覚えておくと、マクロの安全性や保守性が大きく向上します。
まずは基本的な 「On Error 」の使い方から慣れていきましょう。

ここまで、VBAのエラー処理の基本について解説しました。

最後によくある疑問をQ&A形式でまとめます。


よくある質問(FAQ)

VBAのOn Error GoTo 0とは?

On Error GoTo 0 は、設定していたエラー処理を解除する命令です。

たとえば On Error Resume Next で一時的にエラーを無視している場合、そのままにしておくと後続の処理でもエラーが無視され続けてしまいます。
そこで、必要な処理が終わったあとに On Error GoTo 0 を書いて、通常の状態に戻します。

エラーを無視する処理を書いたあとは、セットで覚えておくと安心です。


VBAのOn Error Resume Nextとは何ですか?

On Error Resume Next は、エラーが発生しても処理を止めず、次の行へ進める命令です。

たとえば、

  • ブックが開いているか確認したい

  • ファイルが存在するか試したい

  • 一部の処理だけエラーを無視したい

といった場面で使われます。

ただし、何でも無視してしまうと本当の不具合にも気づきにくくなるため、
必要な範囲だけ使い、終わったら On Error GoTo 0 で解除するのが基本です。


VBAでエラーがあるかどうか調べるには?

VBAでは、Err.Number を使うことでエラーが発生したかどうかを確認できます。

たとえば、エラーが発生していない場合は Err.Number0 になり、エラーがある場合は 0 以外の番号が入ります。

If Err.Number <> 0 Then
 MsgBox "エラーが発生しました"
End If

このように書くと、処理のあとでエラーの有無を確認できます。


VBAでエラーメッセージを表示するにはどうすればよいですか?

VBAでは、MsgBox を使ってエラーメッセージを表示できます。

単純にメッセージを出すだけなら、次のように書けます。

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

さらに、エラー番号や内容も表示したい場合Err.NumberErr.Description を使います。

MsgBox Err.Number & " : " & Err.Description

これにより、どのようなエラーだったのかを分かりやすく表示できます。


VBAでエラーを無視しても大丈夫ですか?

場合によります。
一時的な確認処理や存在チェックなどでは、On Error Resume Next を使うことがあります。

ただし、エラーを無視しすぎると

  • 本来気づくべき不具合を見逃す

  • 原因調査がしにくくなる

  • 想定外のまま処理が進んでしまう

といった問題につながることがあります。

そのため、必要な処理だけ限定して使うことが大切です。


エラーハンドリングは毎回入れたほうがよいですか?

すべてのマクロに必須とは限りませんが、少なくとも次のような処理では入れておくと安心です。

  • ファイルを開く、保存する、コピーする

  • 複数のブックやシートを操作する

  • 外部ファイルや共有フォルダを扱う

  • 途中で止まると困る処理を行う

特に、ファイル操作系のマクロではエラー発生時の影響が大きくなりやすいため、エラーハンドリングを入れておく価値があります。


VBAのエラー処理と実行時エラーは何が違いますか?

実行時エラーは、マクロ実行中に実際に発生するエラーそのものです。
一方、**エラー処理(エラーハンドリング)**は、そのエラーが発生したときにどう対応するかを決めておく仕組みです。

たとえば、

  • 実行時エラー9

  • 実行時エラー91

  • 実行時エラー1004

などは「発生するエラーの種類」です。

それに対して On Error GoTo などは、エラー発生時の対応方法になります。

【関連記事】

※外部リンク※

    ※参考書籍 (PR)

    ※本ボックスにはアフィリエイトリンク(PR)が含まれます。
    くわしくは プライバシーポリシー へ。

    Excel VBAのエラー処理とは?On Errorの使い方とエラーハンドリングの基本を解説
    最新情報をチェックしよう!