セルのエラー値の種類を調べる方法を解説します。
CVErr関数を使用します。
基本構文
' セルのエラー値が#N/Aか調べる If Range("A1").Value = CVErr(xlErrNA) Then
ただしこのコードはいつもと逆で、
セル値がエラーでない場合はVBAの実行時エラーになってしまいます。
実際に判定する場合は、
IsError関数でエラーであることを確認してから判定してください。
If IsError(Range("A1").Value) Then If Range("A1").Value = CVErr(xlErrNA) Then
判定に使用できるCVErr関数の引数は以下の通りです。
| 定数 | エラー番号 | エラー値 |
|---|---|---|
| xlErrDiv0 | 2007 | #DIV/0! |
| xlErrNA | 2042 | #N/A |
| xlErrName | 2029 | #NAME? |
| xlErrNull | 2000 | #NULL! |
| xlErrNum | 2036 | #NUM! |
| xlErrRef | 2023 | #REF! |
| xlErrValue | 2015 | #VALUE! |
解説
CVErr関数を使用すると、渡した定数に応じたエラー値を生成できます。
これをセルのエラー値と比較することで、
セルのエラー値がどのエラーに該当するかを調べることができます。
前述のとおりCVErr関数で生成したエラー値を正常のセル値と比べると、
| 実行時エラー '13' 型が一致しません。 |
エラーになってしまいます。
よって実際には、IsError関数でエラーになっているかを調べてから、
CVErr関数を使用しなければいけません。
If IsError(Range("A1").Value) Then If Range("A1").Value = CVErr(xlErrNA) Then
Select Case の使用
CVErr関数はSelect Caseステートメントでも使用できます。
使用する場合は以下のように記述します。
If IsError(Range("A1").Value) Then Select Case Range("A1").Value Case CVErr(xlErrNull) ' #Null! 時の処理 Case CVErr(xlErrDiv0) ' #DIV/0! 時の処理 End Select End If
Select Caseを使用する場合も、
正常のセル値を判定すると「型が一致しません」エラーになります。
こちらも通常のIf文と同様、IsError関数で判定してから使用してください。
より詳しい仕様の解説
実際に使用するなら上記の理解で十分と思いますが、
一応詳しい仕様を解説しておきます。
まずCVErr関数ですが、より正確には
「整数を受け取ってそのエラーコードのエラーに変換する」
関数です。
つまりCVErr(1)とすれば「エラー 1」が取得され、
存在しないエラーまで生成できてしまいますのでご注意ください。
その上でxlErrNAなどの定数がそのまま2042という整数になっているため、
CVErr(xlErrNA)という記述で「エラー 2042」つまり#N/Aを取得しています。
続いて「型が一致しません」エラーの出る条件ですが、
こちらは比較演算子「=」の仕様で出ているエラーであり、
エラー値と通常の値を比較すると発生するエラーになっています。
例えばRange("A1")が#N/Aとなっているときに、
If Range("A1") = "" Then
こちらがエラーになるのは左辺だけがエラー値だからであり、
逆にRange("A1")が「1」や「あ」などの正常値だった場合に、
If Range("A1") = CVErr(xlErrNA) Then
こちらがエラーになるのは右辺だけがエラー値だからです。
これらのエラーを回避するために、
If IsError(Range("A1").Value) Then If Range("A1").Value = CVErr(xlErrNA) Then
こう書くことで右辺左辺ともにエラー値にしている訳ですね。
これら仕様を理解したうえで注意したいのが、誤って
CVErr(Range("A1"))
という記述を書いても動いてしまうという点です。
これはA1セルに入ったものが数値であればエラーにならず、
その数値をエラーコードとしたエラーを生成してしまいます。
この点に注意して運用してください。
エラー値を数値に変換する - CLng関数
CVErr関数の逆、エラー値を数値に変換する場合は、
意外にもCLng関数を使うだけでOKです。
Debug.Print CLng(CVErr(xlErrNA)) ' 2042
ただし、CLng関数は当然普通の数値に対しても動く関数ですので、
使用する場合は結局IsError関数が必要な点にご注意ください。
' A1セルが#N/Aエラーか判定 If IsError(Range("A1").Value) Then If CLng(Range("A1").Value) = xlErrNA Then
特に読みやすくなっているわけでもないため、
別段使用する必要はないかなと思います。
メリットとしてはSelect Case の記述が短くて済むくらいでしょうか。
If IsError(Range("A1").Value) Then Select Case CLng(Range("A1").Value) Case xlErrNull ' #Null! 時の処理 Case xlErrDiv0 ' #DIV/0! 時の処理 End Select End If
もしエラー値を数値として扱いたい場面に遭遇したら、
CLng関数を使用してください。