数式がエラーのセルのRange.Valueはエラーになる
Excelのセルで「#N/A」や「#NAME?」といった表示を見たことがあると思います。これらはセルの数式が正しく動作できていないことを表しており、多くの場合は数式の修正が必要になります。
セルの値を取得するには「Range(“A1”).Value」のように書くとA1セルの内容を取得することができますが、セルに数式が設定されている場合で、かつ、その数式がエラーになっている場合はValueプロパティがエラーになります。
以下の関数はA1セルに「ABCDEFG()」という存在しない関数を埋め込んで、そのセルの値を参照しています。
1 2 3 4 5 6 7 8 9 |
Sub cellError1() Dim s As String '// A1セルに不正な数式を設定 Range("A1").Formula = "=ABCDEFG()" '// 実行時エラー13が発生 s = Range("A1").Value End Sub |
「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関数を使ってエラー内容を出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub cellError3() Dim s As String '// A1セルに不正な数式を設定 Range("A1").Formula = "=ABCDEFG()" '// A1セルの値がエラーではない場合 If IsError(Range("A1").Value) = False Then s = Range("A1").Value Else '// 「エラー 2029」がイミディエイトウィンドウに出力される Debug.Print CVErr(Range("A1").Value) End If End Sub |
セルのエラーの種類
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関数の引数が間違っている。 |