和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルのエラー値の種類を調べる - CVErr関数

セルのエラー値の種類を調べる方法を解説します。

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関数を使用してください。