数式がエラーのセルのRange.Valueはエラーになる

Excelのセルで「#N/A」や「#NAME?」といった表示を見たことがあると思います。これらはセルの数式が正しく動作できていないことを表しており、多くの場合は数式の修正が必要になります。

セルの値を取得するには「Range(“A1”).Value」のように書くとA1セルの内容を取得することができますが、セルに数式が設定されている場合で、かつ、その数式がエラーになっている場合はValueプロパティがエラーになります。

以下の関数はA1セルに「ABCDEFG()」という存在しない関数を埋め込んで、そのセルの値を参照しています。

「ABCDEFG()」という関数は存在しないためセルの表示には「#NAME?」と表示されます。その状態でValueプロパティを使ってセルの値を取得しようとすると実行時エラー13が発生します。

エラーダイアログが表示されるとそこでVBAの処理は止まってしまいます。これを回避する方法を以下で紹介します。

IsError関数

上記のようにセルのエラーが発生している場合にRangeオブジェクトのValueプロパティなどの参照を行うとエラーが発生してそこで処理が止まってしまいます。本来であればそういうエラーが無いようにセルの数式を修正しておいた方がいいのですが、状況によってはエラーのままVBAの処理を続行しなければならないこともあります。

そういう場合は、IsError関数を使います。

構文
Function IsError(Expression) As Boolean

Expression エラーか判定する式や値を指定します。
戻り値 引数がエラーの場合はTrue、エラーでない場合はFalseを返します。

サンプルコード

以下のコードは上記のコードにIsError関数でセルの値がエラーかどうかの判定を加えています。

コード内のコメントに書いている通りですが、A1セルの値(Range(“A1”).Value)がエラーかどうかをIsError関数で判定し、エラーでない場合は変数にセルの値を代入し、エラーの場合はイミディエイトウィンドウにCVErr関数を使ってエラー内容を出力しています。

セルのエラーの種類

IsError関数で判定できるセルの数式のエラーにはいくつかの種類があり、それぞれセル上での表示が異なります。そして、エラーの種類ごとにVBAで扱える定数としてXlCVError列挙型が定義されています。

RangeオブジェクトのValueプロパティをDebug.Printなどで参照したときに「エラー 2029」などと表示されるのはエラーの種類の値を示しています。そのため「エラー 2029」であれば「#NAME?」を意味します。

XlCVError列挙型の定数には不明なものも多いですが、一応全て載せておきます。

繰り返しになりますが、いずれのエラーもIsError関数で検出できます。

定数 定数値 エラー 内容
xlErrBlocked 2047 不明 不明
xlErrCalc 2050 不明 不明
xlErrConnect 2046 不明 不明
xlErrDiv0 2007 #DIV/0! 数式で0での割り算が発生している。
xlErrField 2019 不明 不明
xlErrGettingData 2043 不明 不明
xlErrNA 2042 #N/A Excel関数の引数が不適切で正しく動作していない。
xlErrName 2029 #NAME? Excel関数名が間違っている。
xlErrNull 2000 #NULL! Excel関数の引数にスペースが入っている。
xlErrNum 2036 #NUM! Excel関数の引数の値が不正。
xlErrRef 2023 #REF! Excel関数で参照しているセルが無い。
xlErrSpill 2045 不明 不明
xlErrUnknown 2048 不明 不明
xlErrValue 2015 #VALUE! Excel関数の引数が間違っている。