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列挙型のメンバーに定義されています。
定数 | 値 | セルのエラー表示 |
---|---|---|
xlErrNull | 2000 | #NULL! |
xlErrDiv0 | 2007 | #DIV/0! |
xlErrValue | 2015 | #VALUE! |
xlErrRef | 2023 | #REF! |
xlErrName | 2029 | #NAME? |
xlErrNum | 2036 | #NUM! |
xlErrNA | 2042 | #N/A |
xlErrGettingData | 2043 | #GETTING_DATA |
xlErrSpill | 2045 | #SPILL! |
xlErrConnect | 2046 | #CONNECT! |
xlErrBlocked | 2047 | #BLOCKED! |
xlErrUnknown | 2048 | #UNKNOWN! |
xlErrField | 2049 | #FIELD! |
xlErrCalc | 2050 | #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型の数値(エラー番号)に変換して書き込んでいます。
セルに書き込むエラーの種類を判別
変数に代入する場合の例を確認します。
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’」でコードは中断されてしまいます。暗黙的に型は変換されないことがわかります。
データ型は明示的に変換してから代入します
データ型を変えるには「型変換関数」を使って明示的に変換します。
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サンプルファイルはダウンロードできます
このページで使用したサンプルファイルの登録はありません(^^;
ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!