「80 点以上なら合格」「達成率 120% 以上は S、100% 以上は A……」「目標が未入力の行はエラーを出さずに空欄に」——業務の表は条件分岐だらけです。

その主役が IF。誰もが最初に覚える関数ですが、条件が 3 つ 4 つと増えると IF(IF(IF(...))) のネストになり、括弧の対応が人間に追えなくなります。この記事では、ネストを平らにする IFS、条件を束ねる AND / OR、エラーを既定値に丸める IFERROR まで、条件分岐の関数をまとめて整理します。そのうえで、ReoGridIFS / IFERRORV4.5 で対応)を使って WinForms / WPF アプリの中で同じ数式をそのまま動かすところまで解説します。

この記事は Excel 定番関数シリーズの続編です。「値を引く」 VLOOKUP / XLOOKUP、「条件で集計する」 SUMIF / COUNTIF、「日付を計算する」 EDATE / WORKDAY、「文字列を加工する」 LEFT / MID / SUBSTITUTE に続く「条件で分岐する」編です。


まず結論 — 4 つの使い分け

IFIFSAND / ORIFERROR
何をする条件 1 つで二択条件を上から順に判定して多分岐複数条件を束ねて1 つの真偽にするエラーを既定値に置き換える
典型例合格 / 不合格S / A / B / C のランク分け「両方 80 以上」「どちらか欠席」VLOOKUP の #N/A 対策、0 除算対策
覚え方二択なら IF三択以上なら IFSIF の条件欄に入れて使う数式全体を包む

ポイントは 2 つです。

  1. 二択は IF、三択以上は IFS。IF のネストは 2 段まで——3 段を超えたら IFS に書き換える
  2. AND / OR は単体で使う関数ではなく、IF や IFS の条件欄に入れて条件を束ねる部品

IF — 条件 1 つの二択

IF(条件, 真の場合の値, [偽の場合の値])。すべての基本です。

=IF(B2>=80, "合格", "不合格")     80 点以上なら合格
=IF(C2="", "未提出", "提出済")    空欄チェック

小ネタを 1 つ。第 3 引数(偽の場合)は省略できますが、省略すると FALSE という文字が表示されます。「該当しないときは空欄にしたい」なら、"" を明示してください。

=IF(B2>=80, "合格")        → 不合格の行に FALSE と表示されてしまう
=IF(B2>=80, "合格", "")    → 不合格の行は空欄になる

ネスト IF 地獄と、IFS での書き換え

点数を S / A / B / C の 4 ランクに分けたいとします。IF だけで書くとこうなります。

=IF(B2>=90, "S", IF(B2>=70, "A", IF(B2>=50, "B", "C")))

3 段ならまだ読めますが、5 ランク 6 ランクになると括弧の対応が追えず、閉じ括弧を 1 つ間違えただけでエラーになります。修正を引き継いだ人が解読に苦しむ、いわゆる「ネスト IF 地獄」です。

IFS を使うと、「条件, 値」のペアを並べるだけの平らな形になります。

=IFS(B2>=90, "S", B2>=70, "A", B2>=50, "B", TRUE, "C")

押さえるべきルールは 3 つです。

  1. 上から順に評価され、最初に真になったペアの値が返る。だから条件は厳しい(狭い)順に書く。B2>=50 を先頭に書くと、90 点も 70 点もそこに吸われてしまう
  2. どの条件にも一致しないとエラーになる。「それ以外」の既定値は、最後に TRUE, 値 のペアを置くのが定番イディオム(TRUE は必ず真になるので、ここまで落ちてきたら必ず拾われる)
  3. 引数は必ず偶数個(条件と値のペア)。奇数個だとエラー

AND / OR / NOT — 条件を束ねる

「筆記実技の両方が 80 点以上」のように条件が複数あるときは、AND / OR で束ねて IF の条件欄に入れます。

=IF(AND(B2>=80, C2>=80), "合格", "不合格")   両方 80 以上なら合格
=IF(OR(D2="欠席", B2<30), "再試験", "-")      欠席 または 30 点未満なら再試験
=IF(NOT(E2="対象外"), "集計対象", "")         「対象外」以外なら集計対象
  • AND(条件1, 条件2, …)すべて真のとき真
  • OR(条件1, 条件2, …)どれか 1 つでも真なら真
  • NOT(条件) — 真偽を反転する

IFS の条件欄でも同じように使えます。「達成率 100% 以上かつ実績 300 以上なら表彰」のような複合条件も、IF(AND(...), ...) の形にそのまま落とせます。


IFERROR — エラーを既定値に丸める

条件分岐と並んで業務の表に欠かせないのがエラー処理です。VLOOKUP で見つからないときの #N/A、目標値が未入力のままの 0 除算——計算そのものは正しくても、画面にエラーが並ぶと表として使い物になりません

IFERROR(式, エラー時の値) で数式全体を包むと、エラーのときだけ指定した値に置き換わります。

=IFERROR(VLOOKUP(A2, 商品マスタ!A:C, 3, FALSE), "未登録")   見つからなければ「未登録」
=IFERROR(D2/C2, "")                                        0 除算なら空欄

IFERROR#N/A を含むすべてのエラーを捕捉します。「エラーかどうかを条件として使いたい」だけなら、判定関数 ISERROR / ISNA / ISBLANK を IF と組み合わせる方法もあります。

なお、XLOOKUP は第 4 引数に「見つからないときの値」を直接書けるので IFERROR で包む必要がありません。VLOOKUPMATCH を使う場面での定番テクニック、と覚えてください。


C# アプリの中で動かす — ReoGrid V4.5

ここからが本題です。これらはすべて Excel の関数ですが、Office をインストールせずに、ReoGrid ならアプリの中でそのまま計算できます。IF / AND / OR / NOT は以前から、IFS / IFERRORV4.5 で対応しました。

営業成績の一覧から達成率を計算し、S / A / B / C のランクを付ける例です。

using unvell.ReoGrid;

var sheet = grid.CurrentWorksheet;

// 営業成績(B:担当, C:目標, D:実績)。高橋の行は目標が未設定(0)
sheet.SetRangeData("B2:D6", new object[,]
{
    { "佐藤", 500, 620 },
    { "鈴木", 500, 480 },
    { "高橋",   0, 150 },
    { "田中", 400, 260 },
    { "伊藤", 300, 360 },
});

for (int r = 2; r <= 6; r++)
{
    // 達成率。目標 0 の行は 0 除算になるので IFERROR で空欄に丸める
    sheet[$"E{r}"] = $"=IFERROR(D{r}/C{r}, \"\")";

    // ランク判定:120% 以上 S / 100% 以上 A / 70% 以上 B / それ未満 C
    // 達成率が空欄の行は、先に IF で弾いて「-」にしてから IFS に渡す
    sheet[$"F{r}"] = $"=IF(E{r}=\"\", \"-\", IFS(E{r}>=1.2, \"S\", E{r}>=1, \"A\", E{r}>=0.7, \"B\", TRUE, \"C\"))";

    // 複合条件:達成率 100% 以上 かつ 実績 300 以上なら表彰
    sheet[$"G{r}"] = $"=IF(AND(E{r}>=1, D{r}>=300), \"表彰\", \"\")";
}

// 計算結果を取り出す
var satoRank  = sheet.GetCellData<string>("F2");   // "S"(達成率 124%)
var itoAward  = sheet.GetCellData<string>("G6");   // "表彰"(達成率 120%・実績 360)

IF の偽側に IFS を入れる、VLOOKUPIFERROR で包む——こうした関数の入れ子の組み合わせもそのまま評価されます。しきい値(1.2 や 0.7)を別セルに置いて参照させれば、評価基準を画面上で変更できるランク判定表が数行で作れます。ユーザーがセルに =IFS(...) を直接打ち込んでも、同じように再計算されます。

なお F 列で先頭に空欄チェックを置いているのには理由があります。空文字と数値の大小比較は言語や環境によって挙動が異なる危うい操作で、Excel では「文字列は数値より大きい」扱いになるため、空欄の行がいきなり "S" と判定されてしまいます。数値以外が混ざりうるセルは、先に IF で弾いてから IFS に渡す——ReoGrid でも Excel でも安全に動く定番の書き方です。

ReoGrid 実装メモ:

  • AND / OR に渡せるのは個々の条件(スカラー値)だけです。Excel で見かける =AND(B2:B10>0) のような範囲まるごとの判定は現時点では未対応なので、条件をカンマで並べてください
  • NOT の引数は論理値のみです(=NOT(1) のような数値の暗黙変換は不可)
  • 文字列の = 比較は大文字・小文字を区別します(Excel は区別しない)。表記ゆれが混ざるデータは、全角・半角の正規化と同様、UPPER / ASC などで揃えてから比較するのが確実です

まとめ

  • 二択は IF、三択以上は IFS。ネスト IF は 3 段を超えたら書き換えどき
  • IFS上から順に評価されるので条件は狭い順に。既定値は最後に TRUE, 値 を置く
  • AND / OR / NOT は IF・IFS の条件欄に入れる部品。複合条件はこれで束ねる
  • IFERROR#N/A も 0 除算もまとめて既定値に丸める。VLOOKUP との併用が定番
  • ReoGrid V4.5IFS / IFERROR に対応。Office 不要で、WinForms / WPF アプリ内で同じ数式がそのまま動く

「探す」「集計する」「日付」「文字列」に続いて「条件分岐」を押さえたことで、業務アプリで使う表計算の道具はほぼ出揃いました。

ReoGrid 4.5 の新機能を見る / 30 日トライアルを試す


次に読むもの