皆様こんにちは、ノグチです。
VBA標準のエラーって、VBAを知らない人にとってはそもそもエラーメッセージの内容すら理解できないですよね。
せめて「何行目がおかしいよ」くらい表示してくれたらな~と思ったことはありませんか?
私はいつも思っています(笑)。
そんな時に使えるのがOn Error GoTo。
今回は、この構文を使って、VBAがエラーになった時に指定したメッセージを表示する方法をご紹介します。
これを使えば、VBAエラー時のメッセージを、VBAツールを使う人にわかりやすい内容にすることができますよ!
On Error GoToとは
さて、先述した On Error GoTo構文。
これは、On Error GoTo以下の処理がエラーになったとき、指定した場所までジャンプして、ジャンプ先に記述された処理を実行させる、というものです。
この構文を使えば、VBAがエラーになったときにエラー原因になっている場所をメッセージで表示したりするように、エラー時の動作を指定することができるんです!
エラー時処理を記述したVBAコードの実行例
今回のOn Error GoToご説明用の例として、以下のような価格表と、価格表のC列とD列を乗算してE列に合計を表示していく、というVBAコードを用意しました。
Sub new_culc()
Dim rowc As Long '処理行数カウンター
'*********************************
'計算処理
'*********************************
rowc = 3
Do While Cells(rows, 1).Value <> ""
'B列とC列を乗算して、D列に結果を表示する
Cells(rows, 4).Value = Cells(rowc, 2).Value * Cells(rows, 3).Value
'次の行へ
rowc = rowc + 1
Loop
まずは、このコードを使ってVBAがエラーになった時の動作を確認してみましょう。
乗算に限らず、VBAにおいては、計算処理に使う値は「数値型」でなくてはいけません。
そこで、VBAでエラーを表示させるために、価格表のD列にわざと「文字列型」の値を入力しておきます。
「ファイル」の行C列の数値に、「個」という「文字列型」の値を加えてからVBAを実行してみると・・・
はい、おなじみのエラーメッセージが表示されます。
関数やVBAに慣れている人なら、「ふむふむ、B列とC列の計算処理で型が合わないということは、B列かC列のどこかに数値型以外の値があるのかな」と原因のアタリはつけられそうです。
また、今回の例では表のデータ件数が少ないので、どこが悪さをしているのか、価格表を見ればすぐわかりそうです。
でも、ExcelやVBAに全く詳しくない人がこのエラーを見たとしたら…?
或いはこれが数千件、数万件のリストだったとしたら…?
目視での原因探しは辛いですよね。
On Error GoToの記述方法
では先のエラーを、On Error GoToを使って任意のメッセージを表示するように、VBAのコードを修正していきましょう。
On Error GoTo構文は、エラー時の動作を指定したい処理の前に、下記のように記述します。
これで、On Error GoTo以降に記述した処理がエラーになった時に、行ラベル以下に記述した処理が実行されるようになります。
On Error GoToを使うときの注意点
さて、On Error GoToを使うにあたって、注意点があります。
VBAがエラーになった場合に実行したい処理を行ラベル以降に記述するのはご説明した通りです。
しかし、処理が正常に実行できた時にまで、エラー時用の処理を実行されては困りますよね。
そこで、On Error GoTo構文を使う場合は「End Sub」の直前に「Exit Sub」を記述して、「Exit Sub」と「End Sub」の間にエラー時の処理を記述してください。
正常な処理が実行できた時にまでエラー時用の処理が実行されないように、これは忘れないで!
On Error GoToでエラー時に指定メッセージを表示する
On Error GoToの記述方法と注意点を踏まえて、例でお見せしたVBAのコードにOn Error GoToの処理を加えたものがこちら。
Dim rowc As Long '処理行数カウンター
'*********************************
'計算処理
'*********************************
rowc = 2
'エラーになった場合の処理
On Error GoTo Er_line
Do While Cells(rows, 1).Value <> ""
'C列とD列を乗算して、E列に結果を表示する
Cells(rows, 4).Value = Cells(rowc, 2).Value * Cells(rows, 3).Value
'次の行へ
rowc = rowc + 1
Loop
Exit Sub
'*********************************
'エラー時の処理
'*********************************
Er_line:
MsgBox "「" & Cells(rowc, 1).Value & "」の計算でエラーになりました。_
金額と個数は数字で入力してください。"
End Sub
C列とD列を乗算する計算処理がエラーになったら「Er_line」という行ラベルの処理をしなさい、という記述です。
「Er_line」以下には、エラーになった行の品目と、指定したメッセージを表示する、という処理を記述しています。
このコードを実行してみると…
この通り、VBAの標準メッセージの代わりに、指定したメッセージが表示されました。
これならどこの行がエラーの原因になっているのかわかりますね。
最後に
今回は、「On Error GoTo」を使って、VBAエラー時に、標準のエラーメッセージの代わりに任意のメッセージを表示させる方法をご紹介しました。
エラー時に実行させる処理は、そのVBAがどういった目的で作られているのか、誰が使うのかによって違ってきます。
場合によっては、エラーになったら、そのレコードの処理を飛ばして次のレコードの処理をさせる方がいいこともあるでしょう。
いずれにせよ、この On Error GoTo~は、人間=コードを書く人が、VBAがどこで、どんな原因でエラーになるのかを把握しておかなければ、VBAのコードに書き加えることもできません。
どんなエラーが出てくるのかを把握しておけば、下記記事のように、各エラーに応じた任意メッセージを表示させることもできますよ。
どんなエラーがどんな時に起こるのか、エラーに対してどういう処理をさせるのがそのVBAにとって最適なのか、色々試してみてくださいね。
それでは、最後までお読みいただき有難うございました!