セルに数式が入力されていたとします。
数式の計算結果は、セル(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