エクセルVBA Err.Numberを使ってエラー番号に応じた処理を指定する

★気に入ったらシェアをお願いします!


Excel,VBA,Errオブジェクト,メッセージ表示

皆様こんにちは!ノグチです。

前回はこちらの記事でOn Error GoTo構文を用いた、エクセルVBAでエラーとなる場合の処理を指定する方法をご案内しました。

ただのエラーじゃ勿体無い!On Error GoToでVBAエラー時に任意のメッセージを表示する
エクセル VBAの標準エラーメッセージを、On Error GoTo構文を使って任意のメッセージを表示する方法をご紹介しています。 これを使えば、どこのセルがエラーになっているのかをメッセージで表示して、VBAツールを使う人にエラーの原因と対策を伝えることができますよ。
今回は前回からのエラーつながりで、ErrオブジェクトとNumberプロパティを用いて、VBAのエラー内容に応じたメッセージを表示する方法をご案内します!

エラー番号とは?

まず、エクセルVBAで表示されるエラーには、それぞれ番号が振られています。

例えば、下記のメッセージ。

これは計算処理の対象にしていたセルに、数字型以外の値が入っていた為にエラーになったものです。
excel, vba, エラー,on error goto,メッセージ

上記のメッセージをみてみると、「実行時エラー’13’」と書いてありますよね。

この’13’という数字がエラーに振られた番号、エラー番号です。

このエラー番号は各エラーに一意の番号が振られていますので、この番号を使えば、エラー内容に沿ったメッセージを表示したり、処理を記述する為の条件に利用することができます。

Errオブジェクトとは?

エラーの内容に応じたメッセージを出すためには、まず先述したエラーの番号をVBAで取得する必要があります。

その時にまず使用するのがErrオブジェクト

Errオブジェクトは、

VBAでエラーになった時にエラーの情報を一時的に格納しておいてくれる

というものです。

このErrオブジェクトとプロパティを使えば、格納されたエラー情報を引き出すことができるようになるのです。

Numberプロパティとは?

さて、エラー情報はErrオブジェクトを使うとして、VBAにはエラーの情報のうち、どんな種類のエラー情報が欲しいのか?までを指定しなければいけません。

今回はエラー情報のうちエラー番号が欲しいので、これを取得するためにErrオブジェクトのNumberプロパティを使います。

NumberプロパティはErrオブジェクトのプロパティの一つで、エラー情報のうち、エラー番号を取得してくれるというものです。

ErrオブジェクトとNumberプロパティを使えば、Errオブジェクトに格納されたエラー情報を使ってエラーの種類に応じた処理を指定することができるのです。

こんな風に。
Excel VBA エラーメッセージ Errオブジェクト

Errオブジェクトを使ってVBAのエラー番号を捕まえるためには、Nmuberプロパティを付け加えて以下のように記述します。

Err.Number

これで、エラー情報うち、エラー番号を捕まえられるようになります。

では、このErrオブジェクトとNumberプロパティを使ったエラー番号に応じた任意メッセージを表示する方法を、例を用いてご紹介していきます。

実行時エラーの例

実行時エラーの例として、価格表の総額(B列)を発注数(C列)で割り戻して単価(D列)を算出するというコードを例として用意しました。

価格表の3行目、「ファイル」の発注数は、敢えて空欄にしています。
Excel,vba,Errオブジェクト,価格表

このコードを使って価格表の割り算処理をすると、表の3行目「発注数」の値が空白になっているのでエラーになってしまいます。

こんな感じ。
Excel,vba,エラーメッセージ,Err

はい。エラーコードとともに実行時エラーが表示されます。

では、このエラーコード’11’をErrオブジェクトとNumberプロパティで取得して、任意のメッセージを表示する処理にしてみましょう。

Err.Numberを使ってエラー番号をに応じた処理を実行させる

では、先ほどの実行時エラーの番号を、Err.Numberを使って捕まえてみましょう。

今回の実行時エラーのエラーコードは11なので、

「エラーコードが11の場合は指定したメッセージを表示する」という処理にしてみます。

Err.Number~と記述してある部分が捕まえたエラーコードの値に応じた処理を指定している部分です。

このコードで先ほどの3行目の発注数が空白だった価格表の計算処理を実行すると、『実行時エラーの例』でお見せしたように、指定したメッセージを表示させることができるのです。

エラー番号による処理分岐

上記コードの、If Err.Number~の部分をIF ~ Elese やSelect Caseを使った分岐条件で記述すると、

発生したエラーの番号を分岐の条件に使うことで、複数パターンのエラーに対して処理指定をすることもできます。

先ほどのエラー処理部分に、エラーコードが13だった場合の処理も加えてみます。

こんな感じ。

これで、処理に使うセルの値が空白か0になっている場合(エラー番号が11の場合)と、計算対象のセルに文字列が入っている場合(エラー番号が13の場合)に、それぞれのエラー番号ごとに指定したメッセージを表示させることができるようになります。

まとめ

いかがでしたでしょうか。

今回はErrオブジェクトを使って、エラーコードにあったエラー処理を指定する方法をお伝えしました。

今回の例ではエラーの度にメッセージを表示させて計算処理を止めていますが、エラーになってもメッセージを表示せず、別シートにエラー内容を記述して次のレコードの処理に進むような、処理を止めないで処理を続けることもできます。

処理対象のデータが多い場合は、毎回エラーで処理を止めるよりもこちらの方法のほうが便利だったりします。

エラートラップに限らず、エラーの内容によって処理を分岐させる方法はVBA以外のプログラミング言語でもよく使用されますので、興味のある方は頭の隅っこにでも置いておかれるとよいかと思います。

それでは、最後までお読みいただきありがとうございました!


The following two tabs change content below.

ノグチ

元製造子会社SE、ERPパッケージシステムコンサルタント(販売管理、購買管理、生産管理、設備管理他)。 業務システム保守・導入両方やった経験をお伝えすることで、少しでもシステムや手作業に悩まされる人が減ればいいなぁ、楽にお仕事してもらえたらいいなぁと日々夢見ております。