VBAのOn Error完全ガイド|使い方・種類・注意点をわかりやすく解説

スポンサードリンク
VBA

この記事を読んでわかること

  • VBAの「On Error」とは何なのかを知れる
  • 「On Error」の種類や使い方を学べる
  • 「On Error」を扱う際の注意点がわかる

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

スポンサードリンク

VBAのOn Errorとは?

「On Error」は、マクロ実行中にエラーが発生したとき、動作を指定することができる命令です。

On Errorの解説1

なぜそんなことが必要になるのでしょうか?

なぜOn Errorが必要なのか

「On Error」が必要な理由はただ一つで、「止まらないマクロ」を実現するためです。
「On Error」を使用しないと、エラーが発生した時点でマクロが強制終了してしまいます。

On Errorの解説2

「On Error」を使用することで、エラーが発生しても無視して進行することもできるため、最後まで処理を実行することができます。

なかなかピンと来ないと思いますので、もう少しわかりやすい例で解説いたします。

日常に例えて解説

1~5までの5つの処理をさせたくて、「1・2・3・4・5」とプログラムを書いたとします。
このとき、2つめでエラーが発生してしまうと、2以降のプログラムは処理されず、異常終了されてしまいます。
わかりやすく例を挙げてみましょう。

朝起きてからのルーティンを決めたとします。

  1. 顔を洗う
  2. トイレに行く
  3. 朝ごはんを食べる
  4. 歯を磨く
  5. 家を出る

2つ目の「トイレに行く」で誰かがトイレに入っていたら、トイレに行けずエラーになります。

エラーの例え

プログラミングの世界では、ここで止まってしまって家を出ることができません。
「3.ごはんが炊けてなかったら」「4.歯ブラシが無かったら」という場合も同じです。

しかし「On Error」を使うことで、何らかのエラーが発生しても処理を止めず、最後まで完了させることができるのです。
上の例では、「誰かがトイレに入っていたらトイレに行かない」、「ごはんが炊けてなかったらパンを食べる」など、スキップしたり、別の処理をさせたりできます。

If文のエラー版といったところでしょうか…。

<「On Error」を使わなかった場合>

  1. 顔を洗う:正常終了
  2. トイレに行く:エラー発生 できない
  3. 朝ごはんを食べる:できない
  4. 歯を磨く:できない
  5. 家を出る:できない

「On Error」を使った場合>

  1. 顔を洗う:正常終了
  2. トイレに行く:エラー発生(スキップ)
  3. 朝ごはんを食べる:正常終了
  4. 歯を磨く:正常終了
  5. 家を出る:正常終了 いってきます!
スポンサードリンク

On Errorの種類と使い方

「On Error」には大きく分けて3つの種類があります。

  • スキップ
  • ジャンプ
  • On Errorの解除

1つ1つ解説していきましょう。

スキップ

On Error Resume Next

エラーが発生した処理をスキップしてプログラムを進める記述です。
まずは「On Error」を使わない例から紹介いたします。
下記のVBAコードを見てください。

Sub スキップ()
    Worksheets("存在しないシート").Select ' エラー発生
    Debug.Print "Utatane" ' 実行されない
End Sub

前提知識{マクロの基礎・作り方から実行まで
前提知識{「Debug.Print」で値を表示させる方法

2行目で存在しないシートを選択した例です。
シートが存在しなかったため、エラーが発生し、3行目の処理は実行されません。

存在しないシートを選択した場合のエラー

では次に、「On Error」のスキップを使ってエラーが出た処理を無視した例です。

Sub スキップ()
    On Error Resume Next ' エラーが発生してもスキップ
    Worksheets("存在しないシート").Select ' エラー発生 → スキップされる
    Debug.Print "Utatane" ' 実行される
End Sub
utatane

2行目で「On Error」のスキップを記述しているため、その後の処理でエラーが出た場合はスキップされます。
結果、3行目の処理でエラーが出ますがスキップされ、4行目の処理が実行されます。

さきほどは実行できなかった「Utatane」の表示が実行できました。
これが「On Error」の効果です。

ジャンプ

On Error GoTo ジャンプする場所

ジャンプする場所:

エラーが発生した場合に別の場所にジャンプすることができます。
下記VBAコードはその使用例です。

Sub ジャンプ()
    On Error GoTo エラー ' エラーが発生したら、「エラー」へジャンプ
    Worksheets("存在しないシート").Select ' エラー発生 → 「エラー」へジャンプ
    Debug.Print "完了しました" ' 実行されない

エラー:
    Debug.Print "エラーによりシートが開けませんでした。" ' これが実行される
End Sub

2行目がジャンプの記述です。
エラーが発生した場合にジャンプする場所を指定します。

3行目でエラーが発生したため、指定の場所にジャンプします。
(エラーが発生しなければ「完了しました」が表示される)

6行目がジャンプしてくる場所です。
ここにエラーが発生した場合の処理を記述します。
結果、「エラーによりシートが開けませんでした。」が表示されるわけです。

このように、エラーが発生した場合としなかった場合とで違う処理をさせることができます。

On Errorの解除

On Error GoTo 0

一番重要なところです。
「On Error」を使うと、その後ずっとエラースキップなどが適用されます。
そこで「On Error」を解除することが必要です。

スキップと併せて解除を用いた例です。

Sub スキップと解除()
    On Error Resume Next ' エラーが発生してもスキップ
    Worksheets("存在しないシート").Select ' エラー発生 → スキップされる
    Debug.Print "Utatane1" ' 実行される

    On Error GoTo 0 ' On Errorの解除
    Worksheets("存在しないシート").Select ' エラー発生 → 解除後なのでスキップされない
    Debug.Print "Utatane2" ' 実行されない
End Sub

6行目で「On Error」を解除したため、
7行目のエラースキップは行われず、処理が中断されます。

予期せぬエラーがスキップされてしまう恐れがある場合は、必ず「On Error」を解除しておきましょう。

スポンサードリンク

エラー内容を取得

「Errオブジェクト」を利用することで、エラー内容を取得することも可能です。
まずはエラーが発生していない場合のエラー内容を取得してみましょう。

Sub エラー内容を表示()
    Debug.Print "エラー番号:" & Err.Number & vbCrLf & "内容:" & Err.Description & vbCrLf & "発生元:" & Err.Source
End Sub
  • Err.Number:エラー番号
  • Err.Description:エラー内容の説明
  • Err.Source:エラーの発生元
  • Err.Clear:エラー情報の初期化
エラーなしの場合の出力結果

エラー番号が「0」と表示されました。
これがエラーなしの状態です。

次にエラーが発生した場合の内容を取得してみましょう。

Sub エラー内容を表示()
    On Error Resume Next ' エラーが発生してもスキップ
    Worksheets("存在しないシート").Select ' エラー発生 → スキップされる
    If Err.Number <> 0 Then ' エラーが発生している場合の処理
        Debug.Print "エラー番号:" & Err.Number & vbCrLf & "内容:" & Err.Description & vbCrLf & "発生元:" & Err.Source
        Err.Clear ' エラー情報の初期化
    End If
    On Error GoTo 0 ' On Errorの解除
End Sub

前提知識{条件分岐(If)

Ifを使って、エラーなし(エラー番号が0)以外ならエラーの内容を取得するようにしています。

エラーが発生した場合の出力結果

エラー内容が取得できました。

「これを見ても何のエラーかわからないよ…」と思うかもしれませんが、私たちが見るのではなく、プログラムに判断させます。

例えばエラー番号によって、違うところにジャンプさせたりスキップさせたりできるため、さらに幅広いエラー処理をさせることができるわけです。

スポンサードリンク

より実践的な応用例

下記VBAコードは、ファイルを開く際に「On Error」を使ってファイルが存在するかを確認した例です。

Sub ファイルが存在するかを確認してから開く()
    Dim filePath As String
    filePath = "C:\Utatane\test.xlsx" ' ファイルパスの代入
    
    On Error Resume Next ' エラーのスキップ
    Workbooks.Open Filename:=filePath ' ファイルを開く
    If Err.Number <> 0 Then ' エラーが発生した場合の処理
        Debug.Print "ファイルを開くことができませんでした: " & vbCrLf & Err.Description ' エラー内容の表示
        Err.Clear ' エラー情報の初期化
    End If
    On Error GoTo 0 ' On Errorの解除
End Sub
ファイルが存在しない場合の出力結果

前提知識{変数の宣言や使い方
前提知識{ファイルを開く

複数のファイルを開いて処理する場合など、処理を止めたくない時に便利です。

スポンサードリンク

注意すべきポイント

On Errorの解除を忘れずに

一度「On Error」を記述すると、解除の記述があるまでずっとエラースキップなどが適用されたままになってしまいます。
場合によっては予期せぬ結果になる場合があるため、エラー処理を行いたい部分が過ぎたら、必ず「On Error」を解除するようにしてください。

On Errorが「」前カッコなら、解除は後ろカッコみたいなものでしょうか。
2つで1つということを頭に入れておきましょう。

Err.Clearを忘れずに

エラー内容を初期化する「Err.Clear」も大切な記述です。
これを記述しないと、エラー内容がリセットされず、予期せぬバグが発生する場合があります。

使い過ぎに注意

「On Error」は非常に便利なのですが、使いすぎるとバグを見逃しやすくなるという欠点があります。
特に「スキップ」はエラーを無視することになるため、予期せぬ結果になる可能性が高いです。
無視してOKなエラーが発生する箇所に絞って使用するようにしてください。

スポンサードリンク

最後に

VBA(Excelマクロ)の「On Error」について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました