指定した値がエラー値かどうかをブール型の値(TrueまたはFalse)で返します。
ExcelのISERROR関数と使い勝手が異なるだけでなく、下記の例のように使用するオブジェクトによって微妙な差異が生じるため注意が必要です。
使用例
例1
サンプルとしてこのようなテーブルを用います。
このテーブルに基づくクエリを作り、次のような列を設けます。
割り算結果: IIf(IsError([分子]/[分母]),"",[分子]/[分母])
式の意味としては「割り算の結果がエラーになるようなら空文字列を出力し、そうでなければ割り算の結果をそのまま出力する」となります。
Excelでは見慣れた表現のように思えますが……
しかしエラーはエラーのまま出力され、意図したような結果が得られません。
このようにクエリでは計算途中で発生するエラーを条件分岐に用いようとしてもうまくいきません。また、一旦エラーが発生するとどのような関数で評価・演算してもやはりエラーとなります。単にエラーとなった列を参照してもエラーとなります。
なお、この例では「IIf([分母]=0,"",[分子]/[分母])」とすれば意図した結果が得られます。ただし、ここではExcelっぽく空文字列に変換していますが、空文字列に変換すると列全体が文字列型になり集計に支障も出ますので、Nullに変換することをご検討ください。
例2
サンプルとして上記の例1で作ったものと同じクエリを用います。
このクエリをレコードソースとしてレポートを作成し、左側に各フィールドの値を表示します。
そして右側に2つのテキストボックスを作り、コントロールソースをそれぞれ次のように設定します。
=IIf(IsError([分子]/[分母]),"",[分子]/[分母])
=IIf(IsError([割り算結果]),"",[割り算結果])
さて、クエリと同様にエラーはどう評価してもエラーにしかならない、と考えると、これらもエラーを出力しそうに見えます。しかし……
前者はエラーを出力してしまうものの、後者は式の意図どおりにエラーを空文字列に変換することができました。
フォームやレポートの場合でも、式の途中でエラーが発生するとそこからどうやってもエラーになります。
しかし単に他のコントロールの値やコントロールソース(テーブルやクエリのフィールド)を参照しただけならば、その値がエラーであっても直ちにエラーとはならず別の値に変換したり、条件付き書式の条件として用いることができます。
例3
コード
VBAでの使用例です。
VBAでも単純にエラーを発生させてしまうとやはりエラーメッセージと共に処理が中断してしまいますが、On Error Resume Nextにより処理を継続させることができ、IsError関数による分岐処理も可能となります。
Sub Func_IsError() Dim ans As String On Error Resume Next 'エラーが発生しても処理継続 ans = InputBox("計算式を入力してください") If IsError(Eval(ans)) Then MsgBox "エラーです" Else MsgBox Eval(ans) End If End Sub
出力
左はInput関数によるダイアログ、中央は「1/1」と入力した際のMsgbox関数による表示、右は「1/0」と入力した際のMsgbox関数による表示です。
例4
コード
IsError関数はCVErr関数により生成された「エラー値」とそれ以外の値を区別して評価することができます。
これを例えばユーザー定義関数の戻り値として使用することで、文字列や数値などの通常の戻り値とエラーという結果を明確に区別して扱うことができます。
なおエラー値はそのまま表示することができませんがCInt関数やCStr関数で変換することで表示することができます。
Sub Func_IsError() Dim a As Variant, b As Variant a = 123 b = CVErr(123) MsgBox "a : " & IsError(a) & vbCrLf & _ "b : " & IsError(b) MsgBox CInt(b) End Sub
出力
左が最初のMsgbox関数による表示、右が2番目のMsgbox関数による表示です。
書式
IsError(値)
備考
EXCELの同名関数とはたらきが異なり、エラーのハンドルが厄介です。「Accessはわかりにくい」と思われる原因の一つなのではないかと思います。