HOME > 即効テクニック > Excel VBA > 関数関連のテクニック > セルの数式エラーを判定する

即効テクニック

関数関連のテクニック

セルの数式エラーを判定する

(Excel 97/2000/2002/2003/2007/2013/2016)
セルに数式が入力されていたとします。
数式の計算結果は、セル(Rangeオブジェクト)のValueプロパティでわかります。
また、入力されている数式自体を調べたいときは、Formulaプロパティを使います。

Sub Sample1()
  MsgBox ActiveCell.Formula
End Sub   
では、この数式がエラーになっているかどうかを調べるには、どうしたらいいでしょう。 ここでは、アクティブセルに入力した数式が「#NAME?」や「#DIV/0!」などのエラーを返しているとします。 任意の数式がエラーかどうかを判定するには、IsError関数を使えます。
Sub Sample2()
  If IsError(ActiveCell.Value) Then
    MsgBox "エラーです"
  Else
    MsgBox "正常です"
  End If
End Sub   
数式がエラーを返していると、RangeオブジェクトのValueプロパティは数値や文字列ではなく、エラー値を返します。 したがって、次のようにエラー値を文字列として扱うと、マクロの方で実行時エラーが発生します。
Sub Sample3()
  MsgBox ActiveCell.Value
End Sub
エラーの内容を調べるときは、MsgBoxではなくDebug.Printを使ってください。
Sub Sample4()
  Debug.Print ActiveCell.Value
End Sub   
実行すると、イミディエイトウィンドウに「エラー 2029」や「エラー 2007」などが出力されます。 この「2029」や「2007」が、数式で発生しているエラー番号です。 それぞれのエラー番号には、次の定数が割り当てられています。 エラー番号をエラー値に変換するには、CVErr関数を使います。
Sub Sample5()
  Dim msg As String
  If IsError(ActiveCell.Value) Then
    Select Case ActiveCell.Value
      Case CVErr(xlErrDiv0): msg = "#DIV/0!"
      Case CVErr(xlErrNA): msg = "#N/A"
      Case CVErr(xlErrName): msg = "#NAME?"
      Case CVErr(xlErrNull): msg = "#NULL!"
      Case CVErr(xlErrNum): msg = "#NUM!"
      Case CVErr(xlErrRef): msg = "#REF!"
      Case CVErr(xlErrValue): msg = "#VALUE!"
    End Select
    MsgBox msg & "エラーです"
  Else
    MsgBox "正常です"
  End If
End Sub