検索

キーワード


【Excel VBA】エラーが発生した時だけ、別の処理を行う方法

  • 公開日:2021-01-12 13:23:51
  • 最終更新日:2021-03-03 22:52:42

こんににちはIMMRです。

VBAに限ったことではないですが、プログラムを実行したが、

エラーが発生して、処理が止まってしまうことはあると思います。


例えば下記のようなブックがあったとします。


図1 割り算を行う処理が記載してあるブック

割り算を行う処理が記載してあるブックイメージ


そして、下記がプログラムです。

図2 割り算を行う処理が記載してあるブックのVBAプログラム

割り算を行う処理が記載してあるブックのVBAプログラムイメージ


これは、セルB3に記載された数値 ÷ セルD3に記載された数値 の結果をセルF3に入力するというプログラムです。

 

本来の動作は以下になります。


図3 ブックに数値を入力(処理が正常に動作する数値)

ブックに数値を入力(処理が正常に動作する数値)イメージ

セルB3に6を入力します。

セルD3に3を入力します。


そして、プログラムを実行してみます。


図4 ブックに数値入力後の処理結果(正常)

ブックに数値入力後の処理結果(正常)イメージ


6(セルB3)÷3(セルD3)なので答えの2がセルF3に入力されます。


しかし、次のように数値を入力するとどうでしょうか。

図5 ブックに数値を入力(処理がエラーする数値)

ブックに数値を入力(処理がエラーする数値)イメージ


図6 ブックに数値を入力後の処理結果(エラー発生)

ブックに数値を入力後の処理結果(エラー発生)イメージ

もちろんエラーになります。

これは、6÷0を実施したからです。

ゼロ除算で明確な計算結果出すことができないからエラーとなっています。


エラーが発生したら、それに対しての処理を行いたい場合もあると思います。

しかし、VBAではエラーが発生してしまうとデバックモードが止まって処理が中止します。


ここでは、エラーが発生した時に処理を実行する方法を説明します。


1.エラーが発生したら指定の箇所まで飛ぶ

下記のように、エラーが発生した時のラベルを作成します。

そして、それ以降にエラーが発生した時に行いたい処理を記述します。



On Error GoTo エラー発生時のラベル

処理イメージ

    Exit Sub
エラー発生時のラベル:

エラー発生時


※エラー発生時のラベルは任意の名前でいいです。変数のように事前の宣言もいりません。

 処理の途中でエラーになった場合は、処理を行うのを中止して、

 エラー発生時のラベルまで飛び、その下に記述したエラー発生時の処理を行います。

 ここで大事なのが、処理とエラー発生時のラベルの間にあるExit Subですが、

 これによって、正常に処理が完了したらプロシージャーから抜けることを意味します。

 これがないと、正常の時(エラーが発生しなかった)でもエラー発生時の処理を行ってしまうからです。


2.使用例

下記が使用例となります。


サンプルコード

Sub test17()

    On Error GoTo error_go

    Range("F3") = Range("B3") / Range("D3")
    Exit Sub
error_go:
    MsgBox ("エラーが発生しました。")

End Sub


・まず、初めに、On Error GoTo error goを記載します。これによりエラーが発生したら、

 その下にあるerror go: というラベルの箇所まで行い、ラベル以降の処理を行います。 ※ラベル名は、error go です。

・Range("F3") = Range("B3") / Range("D3")は通常の処理です。

・Exit Subはプロシージャーから抜けるためのものです。

 これがないと、エラーが発生しなかった時も、error goのラベル以下の処理をしてしまいます。


3.実行

では、上記コードを投稿した下記、ブックで処理を行います。

図7 ブックに数値を入力(処理がエラーする数値)

ブックに数値を入力(処理がエラーする数値)イメージ


セルB3には、6

セルD3には、0を入力しました。


この状態で実行すると

図8 ブックに数値を入力後の処理結果(エラー後の処理)

ブックに数値を入力後の処理結果(エラー後の処理)イメージ


Error GoTo error goの記載がないとエラーが発生した時点でプログラムが止まってしまいますが、

止まらずに、error goのラベルまで行き、その下に記載したメッセージを表示することが出来ました。



ちなみに正常に終了する動作も確認します。

図9 ブックに数値を入力(処理が正常に動作する数値)

ブックに数値を入力(処理が正常に動作する数値)イメージ


セルB3には、6

セルD3には、3を入力しました。


この状態で実行すると

図10 ブックに数値入力後の処理結果(正常)

ブックに数値入力後の処理結果(正常)イメージ


正常に処理が終了します。

「エラーが発生しました。」というメッセージは出ません。


先ほどのExit forがないと下記のようにエラーが発生してないのにも関わらず以下のように「エラーが発生しました。」と

メッセージが出てしまいます。

図11 ブックに数値入力後の処理結果(正常なのにエラー発生時の処理を実行)

ブックに数値入力後の処理結果(正常なのにエラー発生時の処理を実行)イメージ


これだとエラーが発生したのか、正常終了なのかが、わかりにくくなってしまいます。

Exit forを使うことは、大切なことなのです。


【著者】

Imamura

今まではExcel VBAの開発をしてきました。
開発を主にしたものや他の業務の効率化を目指して行ったものさまざまです。
現在は、他のプログラミング言語に挑戦して、スキルアップを目指しています。

よく読まれている記事