0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Excel VBA】CVErr関数|エラー値を返す方法と注意点

Last updated at Posted at 2025-08-05

この記事ではCVErr関数の使い方と注意点について解説します。
他のよく使うVBA関数一覧はこちら。

CVErr関数の使い方と注意点

CVErr関数は、指定したエラー番号を表すエラー値(Error型)を生成する関数です。  
セルに#N/Aや#DIV/0!などのエラーを明示的に入れたいときや、関数からエラー値を返したいときに使います。

構文

CVErr(エラー番号)
  • エラー番号 : VBA定義またはユーザー定義のエラー定数または数値(例:xlErrDiv0、2042 など)
  • 戻り値 : 指定したエラー番号に対応する Variant型(Errorサブタイプ)のエラー値

VBAで定義されているエラー定数

定数 エラー番号 セルのエラー値
xlErrDiv0 2007 #DIV/0!
xlErrNA 2042 #N/A
xlErrName 2029 #NAME?
xlErrNull 2000 #NULL!
xlErrNum 2036 #NUM!
xlErrRef 2023 #REF!
xlErrValue 2015 #VALUE!

使用例

セルに"#N/A"を代入する

Sub Sample()
    Range("A1").Value = CVErr(xlErrNA)
End Sub

▶ 出力結果
セルA1には #N/A が表示されます。
sample01.png

xlErrNA#N/Aを表すVBA定数(値は2042)です。

関数内で条件に応じてエラー値を返す

Sub Sample()
    Dim result1 As Variant
    Dim result2 As Variant

    result1 = Safedivision(1.234, 0)
    Range("A1").Value = result1

    result2 = Safedivision(2.468, 2)
    Range("B1").Value = result2
End Sub

Function Safedivision(a As Double, b As Double) As Variant
    If b = 0 Then
        ' 第2引数「b」が0の場合は0除算エラー番号を返す
        Safedivision = CVErr(xlErrDiv0)
    Else
        ' 第2引数「b」が0以外の場合は除算結果を返す
        Safedivision = a / b
    End If
End Function

▶ 出力結果
sample02.png

関数の戻り値にエラー値を使う場合は、戻り値の型をVariantにする必要があります。

IsError関数と組み合わせて判定する

Sub Sample()
    Dim val As Variant
    val = CVErr(xlErrValue)

    If IsError(val) Then
        Debug.Print "エラーです:" & CStr(val)
    End If
End Sub

▶ 出力結果

エラーです:エラー 2015

xlErrValue#VALUE!を表す定数(値は 2015)です。
このようにCVErrで作成したエラー値はIsError関数を使って安全に検出・処理できます。

Debug.Print "エラーです:" & valはエラーになります。
CVErrは Variant 型の中のエラー型です。
&演算子は文字列型との連結を期待しますが、Variant/Errorを自動で文字列に変換できないため「型が一致しません」エラーになります。
CStrで文字列化してから連結したり、IsErrorでエラー判定によって出力内容を分岐させましょう。

ユーザー定義のエラー番号を作って返す

CVErr関数では、VBAに既存で定義されていない任意のエラー番号(たとえば99998888など)を使って、
バリデーションや条件分岐などで使用できるユーザー独自のエラー値を作成することができます。

Const USER_DEFINE_ERR1 As Long = 9999
Const USER_DEFINE_ERR2 As Long = 8888

Sub Sample()
    Dim val As Variant
    Dim inputval As Variant
    
    inputval = InputBox("数値を入力")
    
    If IsNumeric(inputval) Then
        If inputval < 0 Then
            val = CVErr(USER_DEFINE_ERR1)
        Else
            val = inputval
        End If
    Else
        val = CVErr(USER_DEFINE_ERR2)
    End If
    
    If IsError(val) Then
        Debug.Print "誤った入力です : " & CStr(val) ""
    Else
        Debug.Print val
    End If
End Sub

▶ 出力結果

誤った入力です : エラー 9999    ' 0未満の数値を入力した場合(USER_DEFINE_ERR1)
誤った入力です : エラー 8888    ' 数値以外を入力した場合(USER_DEFINE_ERR2)
1   ' 0以上の数値を入力した場合

⚠️注意

CVErrは必ずVariant型に代入する

Sub Sample()
    Dim val As Long
    val = CVErr(xlErrNA)
End Sub

▶ 出力結果
error.png

CVErrの戻り値は「エラー値のVariant型」であり、LongやDouble型の変数には代入できません

関連するVBA関数

  • IsError関数
  • IsEmpty関数
  • IsNumeric関数

その他のVBA関数

【Excel VBA】VBAでよく使う関数一覧&基本の使い方

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?