数式がエラーのセルのRange.Valueはエラーになる
Excelのセルで「#N/A」や「#NAME?」といった表示を見たことがあると思います。これらはセルの数式が正しく動作できていないことを表しており、多くの場合は数式の修正が必要になります。
VBAでこれらのセルの値を取得するために「Range(“A1”).Value」のように書くとA1セルの内容を取得することができますが、セルに数式が設定されている場合で、かつ、その数式が「#N/A」や「#NAME?」のようなエラーになっている場合はValueプロパティがエラーになり、実行時エラーが発生してプログラムが止まります。
この記事では、IsError関数を使ってセルの値がエラーかどうかを事前に判定し、安全にエラー処理を行う方法を解説します。
実務での使いどころ
-
外部参照やVLOOKUP結果が一部エラーになる可能性がある場合
-
数式セルを自動で読み取って集計するバッチ処理
-
実行エラーで処理が止まらないようにしたい場合
など、セルの状態が不安定なときの安全策として有効です。
エラー発生例
エラーが発生する例として、以下の関数は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 cellErrorSample() 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関数を使った活用例
エラーセルをスキップして処理を続行
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub エラーセルを除いて合計() Dim i As Long Dim total As Double total = 0 For i = 1 To 10 '// エラーでないセルだけ合計に加算 If Not IsError(Range("A" & i).Value) Then If IsNumeric(Range("A" & i).Value) Then total = total + Range("A" & i).Value End If End If Next i Debug.Print "合計: " & total End Sub |
エラーの種類を判定して処理を分岐
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub エラーの種類を判定() Dim cellValue As Variant Range("A1").Formula = "=VLOOKUP(""test"", B:B, 1, FALSE)" If IsError(Range("A1").Value) Then cellValue = Range("A1").Value '// エラーの種類によって処理を分岐 Select Case CVErr(cellValue) Case xlErrNA '// #N/A エラー Debug.Print "データが見つかりません" Case xlErrName '// #NAME? エラー Debug.Print "関数名が間違っています" Case xlErrDiv0 '// #DIV/0! エラー Debug.Print "0で割り算しています" Case xlErrRef '// #REF! エラー Debug.Print "参照先が無効です" Case Else Debug.Print "その他のエラー: " & CVErr(cellValue) End Select 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関数の引数が間違っている。 |
Debug.Printで表示される「エラー XXXX」について
エラーセルの値をDebug.Printで出力すると「エラー 2029」のように表示されます。この数値は上記の定数値に対応しています。
|
1 2 3 |
'// A1が#NAME?エラーの場合 Debug.Print Range("A1").Value '// → エラー 2029 Debug.Print CVErr(Range("A1").Value) '// → エラー 2029(同じ) |