数式のエラーは例外ではなくです。セルにはエラー表示が入り、それを参照した数式へ伝播します。

代表的なエラーと、それを引き起こす数式

一覧

表示列挙値主な原因
#DIV/0!Div0ゼロ除算
#VALUE!Value引数の型が合わない
#REF!Ref参照先が削除された
#NAME?Name未知の関数名・未定義の名前
#N/ANA検索で該当なし、引数不足
#NUM!Num計算結果が数値として表現できない
#NULL!Null交差しない範囲どうしの交差
#CIRCULAR!Circular循環参照

#CIRCULAR! は Excel には無い表示です。Excel は警告ダイアログで知らせますが、 V5 はヘッドレスで動く必要があるため値として返します

列挙型は unvell.ReoGrid.Core.Formula.FormulaError です。

エラーの伝播

引数のいずれかがエラーの場合、原則としてそのエラーがそのまま返ります。

A1 = 1/0        → #DIV/0!
A2 = A1 + 10    → #DIV/0!   (伝播する)
A3 = SUM(A1:A2) → #DIV/0!

例外は、エラーを受け取ることが役割の関数です — IFERROR / IFNA / ISERROR / ISERR / ISNA

エラーを処理する

ws.SetFormula(0, 0, "1/0");                  // #DIV/0!
ws.SetFormula(1, 0, "IFERROR(A1, 0)");       // エラーを既定値に置き換える
ws.SetFormula(2, 0, "IFNA(VLOOKUP(\"x\", A1:B9, 2, FALSE), \"該当なし\")");

string shown = ws.GetDisplayText(0, 0);      // "#DIV/0!"
関数捕まえる対象
IFERROR(値, 代替)すべてのエラー
IFNA(値, 代替)#N/A のみ

VLOOKUP の「該当なし」だけを扱いたい場合は IFNA を使ってください。IFERROR は 引数の型間違いなど本来直すべきエラーまで隠してしまいます。

プログラムから判定する

エラーセルの CellValueKindError になります。

ws.GetValue(r, c).Kind == CellValueKind.Error

表示文字列が必要なら GetDisplayText(r, c)"#DIV/0!" のような文字列を返します。

GetObjectValue(r, c) はエラーを表す文字列を返します。数値として扱おうとすると 失敗するため、集計処理では Kind を確認してください。

ISERRORISERR の違い

関数#N/A を真とするか
ISERRORする(すべてのエラー)
ISERRしない(#N/A 以外)

Excel と同じです。

次に読む

ページの内容は役に立ちましたか?