皆様こんにちは!ノグチです。
前回はこちらの記事でOn Error GoTo構文を用いた、エクセルVBAでエラーとなる場合の処理を指定する方法をご案内しました。
http://tonari-it.com/excel-vba-on-error-goto/
今回は前回からのエラーつながりで、ErrオブジェクトとNumberプロパティを用いて、VBAのエラー内容に応じたメッセージを表示する方法をご案内します!
エラー番号とは?
まず、エクセルVBAで表示されるエラーには、それぞれ番号が振られています。
例えば、下記のメッセージ。
これは計算処理の対象にしていたセルに、数字型以外の値が入っていた為にエラーになったものです。
上記のメッセージをみてみると、「実行時エラー’13’」と書いてありますよね。
この’13’という数字がエラーに振られた番号、エラー番号です。
このエラー番号は各エラーに一意の番号が振られていますので、この番号を使えば、エラー内容に沿ったメッセージを表示したり、処理を記述する為の条件に利用することができます。
Errオブジェクトとは?
エラーの内容に応じたメッセージを出すためには、まず先述したエラーの番号をVBAで取得する必要があります。
その時にまず使用するのがErrオブジェクト。
Errオブジェクトは、
VBAでエラーになった時にエラーの情報を一時的に格納しておいてくれる
というものです。
このErrオブジェクトとプロパティを使えば、格納されたエラー情報を引き出すことができるようになるのです。
Numberプロパティとは?
さて、エラー情報はErrオブジェクトを使うとして、VBAにはエラーの情報のうち、どんな種類のエラー情報が欲しいのか?までを指定しなければいけません。
今回はエラー情報のうちエラー番号が欲しいので、これを取得するためにErrオブジェクトのNumberプロパティを使います。
NumberプロパティはErrオブジェクトのプロパティの一つで、エラー情報のうち、エラー番号を取得してくれるというものです。
ErrオブジェクトとNumberプロパティを使えば、Errオブジェクトに格納されたエラー情報を使ってエラーの種類に応じた処理を指定することができるのです。
こんな風に。
Errオブジェクトを使ってVBAのエラー番号を捕まえるためには、Nmuberプロパティを付け加えて以下のように記述します。
これで、エラー情報うち、エラー番号を捕まえられるようになります。
では、このErrオブジェクトとNumberプロパティを使ったエラー番号に応じた任意メッセージを表示する方法を、例を用いてご紹介していきます。
実行時エラーの例
実行時エラーの例として、価格表の総額(B列)を発注数(C列)で割り戻して単価(D列)を算出するというコードを例として用意しました。
価格表の3行目、「ファイル」の発注数は、敢えて空欄にしています。
Sub new_culc()
Dim rowc As Long '処理行数カウンター
'******************************
'計算処理
'******************************
rowc = 2
Do While Cells(rowc, 1).Value <> ""
'C列D列で除算して、E列に結果を表示する
Cells(rowc, 4).Value = Cells(rowc, 2).Value / Cells(rowc, 3).Value
'次の行へ
rowc = rowc + 1
Loop
End Sub
このコードを使って価格表の割り算処理をすると、表の3行目「発注数」の値が空白になっているのでエラーになってしまいます。
こんな感じ。
はい。エラーコードとともに実行時エラーが表示されます。
では、このエラーコード’11’をErrオブジェクトとNumberプロパティで取得して、任意のメッセージを表示する処理にしてみましょう。
Err.Numberを使ってエラー番号をに応じた処理を実行させる
では、先ほどの実行時エラーの番号を、Err.Numberを使って捕まえてみましょう。
今回の実行時エラーのエラーコードは11なので、
「エラーコードが11の場合は指定したメッセージを表示する」という処理にしてみます。
Sub new_culc()
Dim rowc As Long '処理行数カウンター
'******************************
'計算処理
'******************************
rowc = 2
Do While Cells(rowc, 1).Value <> ""
'C列D列で除算して、E列に結果を表示する
Cells(rowc, 4).Value = Cells(rowc, 2).Value / Cells(rowc, 3).Value
'エラーになった場合の処理
On Error GoTo Err_line
'次の行へ
rowc = rowc + 1
Loop
Exit Sub
'******************************
'エラー処理
'******************************
Err_line:
If Err.Number = 11 Then
MsgBox "「" & Cells(rowc, 1).Value & "」の発注数が空白または0です。0以外の数値を入力してください。 "
End If
End Sub
Err.Number~と記述してある部分が捕まえたエラーコードの値に応じた処理を指定している部分です。
このコードで先ほどの3行目の発注数が空白だった価格表の計算処理を実行すると、『実行時エラーの例』でお見せしたように、指定したメッセージを表示させることができるのです。
エラー番号による処理分岐
上記コードの、If Err.Number~の部分をIF ~ Elese やSelect Caseを使った分岐条件で記述すると、
発生したエラーの番号を分岐の条件に使うことで、複数パターンのエラーに対して処理指定をすることもできます。
先ほどのエラー処理部分に、エラーコードが13だった場合の処理も加えてみます。
'******************************
'エラー処理
'******************************
Err_line:
Select Case Err.Number
Case "13"
MsgBox "「" & Cells(rowc, 1).Value & "」の総額と発注数は_
数字で入力してください。"
Case "11"
MsgBox "「" & Cells(rowc, 1).Value & "」の発注数に_
'0'以外の数値を入力してください。"
End Select
こんな感じ。
これで、処理に使うセルの値が空白か0になっている場合(エラー番号が11の場合)と、計算対象のセルに文字列が入っている場合(エラー番号が13の場合)に、それぞれのエラー番号ごとに指定したメッセージを表示させることができるようになります。
まとめ
いかがでしたでしょうか。
今回はErrオブジェクトを使って、エラーコードにあったエラー処理を指定する方法をお伝えしました。
今回の例ではエラーの度にメッセージを表示させて計算処理を止めていますが、エラーになってもメッセージを表示せず、別シートにエラー内容を記述して次のレコードの処理に進むような、処理を止めないで処理を続けることもできます。
処理対象のデータが多い場合は、毎回エラーで処理を止めるよりもこちらの方法のほうが便利だったりします。
エラートラップに限らず、エラーの内容によって処理を分岐させる方法はVBA以外のプログラミング言語でもよく使用されますので、興味のある方は頭の隅っこにでも置いておかれるとよいかと思います。
それでは、最後までお読みいただきありがとうございました!