皆様こんにちは、ノグチです。
VBAを組んだり使ったりしているとき、「エラーなのはわかったけど、せめてどこのセルでエラーになっているのか表示してくれればいいのに・・・」と思ったことはありませんか?
忙しい業務の合間を縫ってVBAでツールを作って、これで仕事が早くなるぞ!と思ったら、マクロエラー。
自分で作ったVBAならまだしも、人が作ったものとなるとVBAのコードを読んで、デバッグで原因を追って・・・って意外と時間がかかるんですよね。
結果、「なんかエラーだけど原因がわからないからこのVBA使わなくなっちゃった」という何とも悲しい結末になることも…
そんな悲しい事態にならずに皆様に素敵なVBAライフを送っていただくために、
On Error GoTo~を使って、エラー原因と対応方法を、使う人に伝えやすくする方法
をご紹介します!
On Error GoToとは
VBAの標準のエラーって、VBAを知らない人にとってはそもそもエラーメッセージの内容すら理解できないですよね。
せめて「何行目がおかしいよ」くらい表示してくれたらな~と思ったことはありませんか?
私はいつも思っています(笑)。
そんな時に使えるのが「On Error GoTo~」。
これは主処理の後に記述しておいて、
その処理がエラーになった場合、特定の処理を実行させる、
というものです。
これを使えば、VBAがエラーになったときにエラーになった場所をメッセージで表示したりするように、エラー時の動作を指定してしまうことができるんです!
エラー時処理を記述したVBAコードの実行例
On Error GoToの使用例をお見せするために、以下のような価格表と、価格表のC列とD列を乗算してE列に合計を表示していく、というコードを用意してみました。
Sub new_culc() Dim rowc As Long '処理行数カウンター Dim culc As long '処理列数カウンター '********************************* '計算処理 '********************************* rowc = 3 culc = 3 Do While Cells(rows, culc + 2) <> "" 'C列とD列を乗算して、E列に結果を表示する Cells(rows, culc + 2) = Cells(rowc, culc) * Cells(rows, culc + 1) '次の行へ rowc = rowc + 1 Loop
このコードを使って、VBAがエラーになった時にどんな動作をするのか試してみます。
多くのプログラミング言語では、計算処理に使う値は「数値型」である必要がありますので、
価格表のD列に「数値型」以外の値を入れて実行してみましょう。
D列の「ファイル」の行の数値に「個」を追加して「文字列型」にしてからVBAを実行すると・・・
はい、おなじみのエラーメッセージが表示されます。
「ふむふむ、C列とD列の計算処理で型が合わないということは、C列かD列のどこかに数値型以外の値があるのかな」と原因のアタリはつきそうです。
しかし今回の例では表のデータ件数が少ないのでどこが悪さをしているのかすぐわかりそうですが、これが数千件、数万件のリストだったとしたら…?
目視での原因探しはちょっと辛いですよね。
では上記の例にOn Error GoTO~の処理を加えて、
「エラーになったら、エラーになった行の「品目」をメッセージとして表示する」
という処理を加えて実行してみます。
いかがでしょうか。これならどこの行がエラーの原因になっているのかわかりますね。
On Error GoToでエラー時にメッセージを表示させる
使用例で使ったコードに、On Error GoToの処理を加えたコードがこちら。
Sub new_culc() Dim rowc As Long '処理行数カウンター Dim culc As long '処理列数カウンター '********************************* '計算処理 '********************************* rowc = 3 culc = 3 Do While Cells(rows, culc + 2) <> "" 'C列とD列を乗算して、E列に結果を表示する Cells(rows, culc + 2) = Cells(rowc, culc) * Cells(rows, culc + 1) 'エラーになった場合の処理 On Error GoTo Er_line '次の行へ rowc = rowc + 1 Loop Exit Sub '********************************* 'エラー時の処理 '********************************* Er_line: MsgBox "「" & Cells(rowc, culc - 1) & "」の計算でエラーになりました。_ 金額と個数は数字で入力してください。" End Sub
16行目にC列とD列を乗算する計算処理がエラーになったら「Er_line」という、27行目にある行ラベルの処理をしなさい、という記述です。
このようにOn Error GoToは、エラーが出た時に特定の動作をさせたい処理(以下主処理と呼びます)の直後に記述して、エラーになったときに実行したい処理が記述されている行ラベルを引数に指定します。
そして、On Error GoTo~が記述されているプロシージャ内に、引数で指定した行ラベルでエラー時の処理を記述しておけば、主処理がエラーになった時、行ラベルで記述した処理が実行されるようになります。
他にも、処理行を変数に格納しているようなコードであれば、この変数をメッセージに表示するようにして「5行目を修正してください」のように、より明確な修正箇所を伝えることもできますよ!
On Error GoToを使う時の注意点
さて、On Error GoTo~の使い方は上で示した通り難しくなさそうですが、いくつか注意点があります。
エラー時の処理を記述する場所
エラー時の処理は、正常時終了した時に実行されては困りますよね。
このステートメントを使いたい場合は「End Sub」の直前に「Exit sub」を記述して、
「Exit sub」と「End Sub」の間にエラー時の処理を記述します。
正常に主処理が実行できた時にエラー時用の処理が実行されないように、このルールは忘れないで!
エラーが出る場所を探しておく
この処理は、人間がVBA実行時にエラーとなる場所にエラーとなる処理に加えることで初めて有効になります。
人間=コードを書く人 が、VBAがどこで、どんな原因でエラーになるのかを把握しておかないとOn Error GoToを書き加えることもできません。
テストの時にわざとありえない値を使ってみたりして、
エラーが出やすい場所=On Error GoToを使うと有効かもしれない場所
を見つけてみてくださいね。
まとめ
いかがでしたでしょうか。
本稿では、「On Error GoTo」を用いることで、エラー時に任意のメッセージを表示させる方法をご紹介しました。
エラー時に実行させる処理は、そのVBAがどういった目的で作られているのか、誰が使うのかによって違ってきます。
場合によっては、エラーになったら、その処理を飛ばして次の処理をさせる方がいいこともあるでしょう。
エラーに対してどういう処理がそのVBAにとって最適なのか、色々試してみてくださいね。
それでは、最後まで拝読いただき有難うございました!