Excelマクロのエラー処理でよく使うon errorステートメントについて自分なりに整理したので備忘記録代わりに記事にしておきます。
Excelマクロでエラーが発生したときにはOn Errorステートメントで対応する
On errorステートメントの使いかた、役割を一つずつ理解するためにまずはこちらのマクロから考えます。
Sub test1()
Dim i As Long
i = 123
MsgBox i
End Sub
このマクロですが、変数「i」に対して数値データである「123」を格納してメッセージボックスに表示させるシンプルなものです。
実行するとこのように表示されます↓
このマクロを少し書き換えてわざとエラーを発生させてみます。
具体的にはこのようにマクロを書き換えます↓
Sub test1()
Dim i As Long
i = "tax"
MsgBox i
End Sub
このマクロを実行すると下記のようなエラーメッセージが表示されます↓
どこでエラーになっているかを確認してみると変数「i」にデータを格納する箇所でエラーが発生しているのが確認できます↓
ではなぜ、エラーになったかというと、変数「i」に対して文字データである「tax」を格納しようとしたからです。
というのも変数「i」は変数宣言の際に変数の「型」を「long型」にしているため、数値データ以外を格納することができません。
文字データを変数「i」に格納したいのであれば変数の型を「string型」や「variant型」にすると上手くいきます。
このマクロでエラーを発生させないようにするに「On error resume next」を使ってみます。
マクロをこのように1文追加します↓
Sub test1()
Dim i As Long
On Error Resume Next
i = "tax"
MsgBox i
End Sub
このマクロを実行すると下記のようになり、エラーメッセージは表示されません↓
このように「On error resume next」を使用するとエラーが発生する箇所を無視して次の命令を実行します。(今回の場合はメッセージボックスに変数「i」の内容を表示するという処理です)
On error goto 0の役割について
次に「On error goto 0」の役割についてです。「On error goto 0」と記載するとエラー処理を無効化することができます。
エラー処理の無効化といってもわかりにくいので、 少しでもわかりやすくするためにさきほどのマクロをさらに追加していきます。
今回はこのようにしてみます↓
Sub test1()
Dim i As Long
On Error Resume Next
i = "tax"
i = "money"
MsgBox i
End Sub
このマクロを実行すると下記のようになります↓
このマクロでは
- 変数「i」に対して文字データの「tax」を格納したタイミング
- 変数「i」に対して文字データの「money」を格納したタイミング
の二つのタイミングでエラーが発生しているのですが、前述の「On error resume next」の働きによってエラーが無視されている状態(エラー処理が有効になっている状態)です。
なので最終的にメッセージボックスが表示されています。
で、このマクロの途中に「On error goto 0」を追加してみます↓
Sub test1()
Dim i As Long
On Error Resume Next
i = "tax"
On Error GoTo 0
i = "money"
MsgBox i
End Sub
「On error goto 0」を追加したうえでこのマクロを実行すると下記のようにエラーになります↓
どこでエラーになっているかを確認してみると変数「i」に文字データである「money」を格納する箇所でエラーが発生しているのが確認できます↓
「On error goto 0」と記載することで「On error resume next」が動作しないようになっており、結果としてエラーメッセージが表示されるようになりました。
このように「On error goto 0」と記載することで「On error resume nex」tが動作しないように(無効化)することができます。
めちゃくちゃざっくりいうと下記のマクロと同じ状態になっている感じでしょうか↓
Sub test1()
Dim i As Long
i = "money"
MsgBox i
End Sub
On error goto**(任意の文字等)について
最後に「On error goto **」についてです。**の部分には任意の文字を使用します。「On error goto **」と記載するとエラーが発生した際にこちらが指定した場所までマクロの処理を飛ばすことができます。
こんなイメージです
言葉で言ってもわかりにくいのでこちらもマクロを準備しました。
こんな感じで使います↓
Sub test1()
Dim i As Long
On Error GoTo myerror
i = "tax"
MsgBox i
Exit Sub
myerror:
MsgBox "変数「i」に文字データは格納できません"
End Sub
今回はOn Error GoTo myerrorとしました。「myerror」の部分が**に該当する部分です。
で、このマクロを実行するとこのようになります↓
変数「i」に文字データである「tax」が格納されたことでエラーが発生して、こちらが指定した場所(13行目のmyerror:部分)までマクロの処理がスキップされ、赤枠部分のマクロが実行されています。
このようにエラーが発生した際にこちらが指定した場所までマクロの処理を飛ばすことができるのがOn error goto**の使い方です。
On error goto**を使う際にはエラーが発生しなかった時に備えてExit subでマクロの処理から抜ける処理もセットで行うこと。
On error goto**を使う際に気を付けておきたいのが、エラーが発生しなかった場合のマクロの記述です。
具体的にはExit Subを使用して、マクロの処理から抜けるように記述しておく必要があります。
11行目のハイライト部分がそれになります↓
Sub test1()
Dim i As Long
On Error GoTo myerror
i = 7777
MsgBox i
Exit Sub
myerror:
MsgBox "変数「i」に文字データは格納できません"
End Sub
上のマクロですが、数値データしか受け付けない変数「i」に対して、数値データである「7777」を格納していますので、特にエラーが発生せずにマクロが実行されます。
実行結果がこちら↓
この時に「Exit Sub」を記載してマクロの処理から抜けるように指示をしておかないと次の処理がどんどん行われることになります。
試しに「Exit Sub」を削除してマクロを実行すると
Sub test1()
Dim i As Long
On Error GoTo myerror
i = 7777
MsgBox i
myerror:
MsgBox "変数「i」に文字データは格納できません"
End Sub
こうなって↓
こうなります↓
このようにエラーが発生した際の処理まで実行されてしまいますので「Exit Sub」を書き忘れないようにしましょう。
まとめ
Excelマクロのエラー処理の際によく使う「On error resume next」「On error goto 0」「On error goto**」に関する自分の理解を整理しました。
細かな表現に関して間違っているところもあるかもしれませんが、多分こんな感じかと思います。
【本日の近況報告】
五木食品の棒ラーメン「火の国熊本とんこつラーメン」を体験。なかなか美味でした。
【本日の1曲】
Batmobile/Burning Love
定期的にサイコビリーを聴きたくなってバットモービルを聴いていたらこちらのカバーが流れてきました。
エルビスプレスリーがオリジナルだと思っていたんですが、実は違うことに気づきました。
オリジナルはアーサーアレクサンダー?ってカントリー歌手の人のようです。