本ページには広告が含まれています。

Excel VBA CVErr関数 独自のエラー番号を設定する

Excel VBA CVErr関数で独自エラー番号を設定する

Excel VBAの「CVErr関数」について解説します。

スポンサーリンク

CVErr関数とは

Excel VBA の CVErr関数とは、セルのエラーを判定したり、独自エラーを作成できる関数です。

指定した数値(エラー番号)を、バリアント型のエラー値に変換した値を返します。

CVErr関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を理解しておくことが重要です。

構文

CVErr(errornumber)

日本語にすると CVErr(エラー番号)

※ 引数は省略できません。

引数

CVErr 関数の引数は次のとおりです。

引数説明
errornumber【必須】任意の有効な数値(エラー番号)を指定します。

有効な数値(エラー番号)とは、Err オブジェクトの Number プロパティの設定に対応する、
範囲 0 ~ 65,535 の整数です。

セルで発生するエラーには、後述する XlCVError列挙体に定義されている定数を指定できます。

戻り値

引数に指定したエラー番号のエラー値をバリアント型に変換した値が返ります。

解説

CVErr は、エラー番号を作成するだけの関数です。Error関数のようにエラーを発生させることはできませんので、エラーをキャッチしたりエラー情報を取得する機能などはありません。

ユーザーが作成したプロシージャの中でエラー値を作成する場合は、ユーザーが定義するエラー値に対して任意のエラー番号を設定できます。独自に定義したエラー番号は、VBAで発生するエラー番号とは別物です。VBAエラーと同じ番号を指定しても問題ありません。

ただし、Excel ワークシートのセルにエラー値を設定する場合は、XlCVError列挙体で定義されているメンバー定数または値を指定します。定義されていないエラー番号は指定できません。

戻り値のデータ型はバリアント型です。CVErr 関数の戻り値は暗黙的に変換することはできません。

戻り値をバリアント型以外の変数に代入しようとした場合は「エラー 13 型が一致しません。」が発生します。型変換関数 (CLng関数やCstr関数など) で明示的に変換してから代入する必要があります。

セルのエラー定数一覧

セルで発生するエラーの種別を表す定数が、XlCVError列挙型のメンバーに定義されています。

定数セルのエラー表示
xlErrNull2000#NULL!
xlErrDiv02007#DIV/0!
xlErrValue2015#VALUE!
xlErrRef2023#REF!
xlErrName2029#NAME?
xlErrNum2036#NUM!
xlErrNA2042#N/A
xlErrGettingData 2043 #GETTING_DATA
xlErrSpill2045#SPILL!
xlErrConnect2046#CONNECT!
xlErrBlocked2047#BLOCKED!
xlErrUnknown2048#UNKNOWN!
xlErrField2049#FIELD!
xlErrCalc2050#CALC!

Excel にスピル機能が搭載されたことで新しいタイプの関数が増えたため、定義されている定数も増えています。

使用例

CVErr 関数の使用例を二つ紹介します。「セルのエラーを代入する例」と「独自のエラーを作成する例」です。

セルのエラーを代入する例

セルにエラーを代入するコード例です。変数(Variant)は介さずに直接セルに書き込んでいます。

Sub CVErr_test_01()
'セルのエラーを書き込む
Range("A1") = "XlCVError定数"
Range("A2") = CVErr(2000) '(xlErrNull)
Range("A3") = CVErr(xlErrDiv0)
Range("A4") = CVErr(xlErrValue)
Range("A5") = CVErr(xlErrRef)
Range("A6") = CVErr(xlErrName)
Range("A7") = CVErr(xlErrNum)
Range("A8") = CVErr(xlErrNA)
Range("A9") = CVErr(xlErrGettingData)
Range("A10") = CVErr(xlErrSpill)
Range("A11") = CVErr(xlErrConnect)
Range("A12") = CVErr(xlErrBlocked)
Range("A13") = CVErr(xlErrUnknown)
Range("A14") = CVErr(xlErrField)

'セルのエラー値をテキストに変換して書き込む
Range("B1") = "テキストに変換"
Range("B2") = CStr(CVErr(Range("A2")))
Range("B3") = CStr(CVErr(Range("A3")))
Range("B4") = CStr(CVErr(Range("A4")))
Range("B5") = CStr(CVErr(Range("A5")))
Range("B6") = CStr(CVErr(Range("A6")))
Range("B7") = CStr(CVErr(Range("A7")))
Range("B8") = CStr(CVErr(Range("A8")))
Range("B9") = CStr(CVErr(Range("A9")))
Range("B10") = CStr(CVErr(Range("A10")))
Range("B11") = CStr(CVErr(Range("A11")))
Range("B12") = CStr(CVErr(Range("A12")))
Range("B13") = CStr(CVErr(Range("A13")))
Range("B14") = CStr(CVErr(Range("A14")))
Range("B15") = CStr(CVErr(Range("A15")))

'エラー番号に変換して書き込む
Range("C1") = "エラー番号"
Range("C2") = CLng(CVErr(xlErrNull))
Range("C3") = CLng(CVErr(xlErrDiv0))
Range("C4") = CLng(CVErr(xlErrValue))
Range("C5") = CLng(CVErr(xlErrRef))
Range("C6") = CLng(CVErr(xlErrName))
Range("C7") = CLng(CVErr(xlErrNum))
Range("C8") = CLng(CVErr(xlErrNA))
Range("C9") = CLng(CVErr(xlErrGettingData))
Range("C10") = CLng(CVErr(xlErrSpill))
Range("C11") = CLng(CVErr(xlErrConnect))
Range("C12") = CLng(CVErr(xlErrBlocked))
Range("C13") = CLng(CVErr(xlErrUnknown))
Range("C14") = CLng(CVErr(xlErrField))
Range("C15") = CLng(CVErr(xlErrCalc))
End Sub

このコード例は、A列のセルにエラーを書き込んでいます。B列のセルには、A列のセルの値からエラー値(Variant)を作成していますが、セルに書き込む際にテキストに変換しています。さらにC列にはエラー値(Variant)をLong型の数値(エラー番号)に変換して書き込んでいます。

セルのエラーを代入するVBAコード例の実行結果

セルに書き込むエラーの種類を判別

変数に代入する場合の例を確認します。

Sub CVErr_test_02()
  Dim myErr As Variant
  myErr = CVErr(xlErrDiv0) '変数に「エラー 2007」が入る。

  Dim strErr As String
  strErr = myErr '実行時エラー'13':型が一致しません。

  Dim lngErr As Long
  lngErr = myErr '実行時エラー'13':型が一致しません。
End Sub

CVErr関数の戻り値は必ず Variant型 で返ります。

最初の変数は Variant型 なので代入できます。

2番目(String型)と3番目(Long型)の変数は型が相違しているため「実行時エラー’13’」でコードは中断されてしまいます。暗黙的に型は変換されないことがわかります。

実行時エラー'13' : 型が一致しません。

データ型は明示的に変換してから代入します

データ型を変えるには「型変換関数」を使って明示的に変換します。

Sub CVErr_test_03()
  Dim myErr As Variant
  myErr = CVErr(xlErrDiv0)
  Debug.Print (myErr)   'エラー 2007

  Dim strErr As String
  strErr = CStr(myErr)
  Debug.Print (strErr)  '"エラー 2007"

  Dim lngErr As Long
  lngErr = CLng(myErr)
  Debug.Print (lngErr)  '2007
End Sub

String型への変換は「CStr関数」、数値型(Long)への変換は「CLng関数」を使っています。

これで、それぞれの変数に代入できました。

独自のエラーを作成するサンプル

データが数値かどうかチェックして結果を返す簡単なサンプルです。

'CVErrを使ったユーザー定義関数でデータチェックするサンプル
Sub CVErr_test_04()
  Dim vdat As Variant
  Dim inp As Variant
  '数値がインプットされた設定
  inp = 15
  vdat = chk_CVErr(inp)
  Debug.Print vdat '30(15×2)正常値が返る
  '文字列がインプットされた設定
  inp = "ぬえ"
  vdat = chk_CVErr(inp)
  Debug.Print vdat 'エラー 9999(数値以外は指定エラー番号が返る)
End Sub

'正当な引数(数値)なら2倍にして返す、数値以外はエラーを返す
Function chk_CVErr(inp As Variant) As Variant
  If IsNumeric(inp) Then
    chk_CVErr = inp * 2     '数値なら2倍して返す
  Else
    chk_CVErr = CVErr(9999) '数値以外はエラーを返す
  End If
End Function

実行結果イミディエイトの画像がこちらです。

実行結果イミディエイトの画像

数値かどうかのチェックは IsNumeric 関数を使っています。
IsNumeric は数値として認識できる場合は True、それ以外は False を返します。

エラー番号は任意に設定できます。

おわりに

Excel VBA「CVerr関数」でエラーを作成する理由の一つは、セルで発生するエラーを変数に代入するためです。
そしてもう一つは、Functionプロシージャなどを使ってユーザー定義の独自エラーを作成するためです。独自のエラー番号は自由に設定できます。

今回例示したユーザー定義関数の引数は一つでしたが、複数の引数を受け取って評価・確認することもできます。引数が正しくなければ関数は期待する結果を返しません。そのような場合に CVErr を使用して、実行された正しくない処理の内容に応じで通知するエラー番号を返すことができます。エラー番号でどの部分がエラーなのかがわかるようにすることもできます。

解説はここまでにします。少しでもみなさまのお役に立てたなら幸いです(^^;

関数一覧はこちらです。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルはダウンロードできます

このページで使用したサンプルファイルの登録はありません(^^;

ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!