IF 関数 – 入れ子になった式と問題の回避

IF 関数 – 入れ子になった式と問題の回避

IF 関数を使うと、条件をテストして結果 (True または False) を返すことにより、値と予想値の間の論理的な比較を行うことができます。

  • =IF(条件が True であればある処理を行い、それ以外の場合は別の処理を行う)

そのため、IF ステートメントには 2 つの結果があります。1 つ目の結果は比較が True の場合であり、2 つ目の結果は比較が False の場合です。

IF ステートメントは非常にしっかりしており、多くのスプレッドシート モデルの基礎になりますが、スプレッドシートの多くの問題の原因でもあります。理想的には、IF ステートメントは "男性/女性" や "はい/いいえ/不明確" のような最小限の条件に適用する必要がありますが、4 個以上の IF 関数を入れ子*にする必要がある複雑なシナリオの評価が必要になることもあります。

* "入れ子" とは、複数の関数を 1 つの式に結合する方法のことです。

論理関数の 1 つである IF 関数を使うと、条件が true または false の場合に、それぞれ別の値を返すことができます。

構文

IF(logical_test, value_if_true, [value_if_false])

次に例を示します。

  • =IF(A2>B2,"予算超過","OK")

  • =IF(A2=B2,B4-A4,"")

引数名

説明

logical_test   

(必須)

テストする条件

value_if_true   

(必須)

logical_test の結果が TRUE の場合に返す値

value_if_false   

(省略可能)

logical_test の結果が FALSE の場合に返す値

解説

Excel では、最大 64 個の IF 関数を入れ子にすることができますが、そのような構造は推奨されません。それはなぜでしょうか。

  • 複数の IF ステートメントを正しく構築し、ロジックが各条件を経由し、最後まで正しく計算されるようにするには、膨大な思考が必要になります。式の入れ子構造を 100% 正確に構築しなければ、式の機能する確率が 75% になり、25% の確率で予想外の結果が返されるといったことが起こる可能性があります。残念ながら、予想外の結果が返される確率が 25% などは低い方です。

  • 複数の IF ステートメントは、保守管理が非常に困難です。自分で作成しようとした式を後から理解するのも難しいですが、他人が作成しようとした式を解明するのはさらに大変です。

IF ステートメントが際限なく拡大し続けるような場合は、一度マウスを置いて方針を再検討する必要があります。

以下では、複数の IF を使って複雑な入れ子の IF ステートメントを適切に作成する方法、そして Excel の他のツールを使用する必要がある場合について説明します。

生徒のテストの点をそれに対応する成績の文字に変換する、比較的標準的な入れ子の IF ステートメントの例を次に示します。

入れ子になった複雑な IF ステートメント - E2 の式は =IF(B2>97,"A+",IF(B2>93,"A",IF(B2>89,"A-",IF(B2>87,"B+",IF(B2>83,"B",IF(B2>79,"B-",IF(B2>77,"C+",IF(B2>73,"C",IF(B2>69,"C-",IF(B2>57,"D+",IF(B2>53,"D",IF(B2>49,"D-","F"))))))))))))
  • =IF(D2>89,"A",IF(D2>79,"B",IF(D2>69,"C",IF(D2>59,"D","F"))))

    この複雑な入れ子の IF ステートメントは、以下のような単純なロジックで構成されています。

  1. テストの点数 (セル D2) が 89 より大きい場合、学生の成績は A です

  2. テストの点数が 79 より大きい場合、学生の成績は B です

  3. テストの点数が 69 より大きい場合、学生の成績は C です

  4. テストの点数が 59 より大きい場合、学生の成績は D です

  5. それ以外の場合、学生の成績は F です

この具体的な例では、テストの点と成績の文字の間の相関関係が変換する可能性は低く、メンテナンスはあまり必要ないので、比較的安全です。しかし、成績を A+、A、A- などに分ける必要があるとするとどうなるでしょうか。4 つの条件 IF ステートメントを書き換えて 12 の条件にする必要があります。次のような式になります。

  • =IF(B2>97,"A+",IF(B2>93,"A",IF(B2>89,"A-",IF(B2>87,"B+",IF(B2>83,"B",IF(B2>79,"B-", IF(B2>77,"C+",IF(B2>73,"C",IF(B2>69,"C-",IF(B2>57,"D+",IF(B2>53,"D",IF(B2>49,"D-","F"))))))))))))

それでもまだ正しく機能して期待した結果を得られますが、作成にかかる時間は長くなり、正しく動作することを確認するためのテストにも長い時間がかかります。もう 1 つの明らかな問題は、点数と成績の文字を手入力する必要があることです。入力ミスが発生する確率はどれくらいでしょうか。この複雑な条件を 64 回入力することを想像してみてください。確かに可能ですが、このように面倒なことを行って究明するのが困難なエラーが発生することに耐えられますか。

ヒント: Excel のすべての関数には、開始と終了のかっこ () が必要です。Excel の編集では、作業しやすいように式の各部分が色分けされて表示されます。たとえば、上の式を編集する場合、カーソルを各終了かっこ ")" の後に移動すると、対応する開始かっこが同じ色になります。この機能は入れ子になった複雑な式で特に役に立ち、必要な対応するかっこがあることを確認できます。

その他の例

売上レベルに基づいて販売手数料を計算する非常に一般的な例を次に示します。

セル D9 の式は IF(C9>15000,20%,IF(C9>12500,17.5%,IF(C9>10000,15%,IF(C9>7500,12.5%,IF(C9>5000,10%,0)))))
  • =IF(C9>15000,20%,IF(C9>12500,17.5%,IF(C9>10000,15%,IF(C9>7500,12.5%,IF(C9>5000,10%,0)))))

この式の意味は、C9 が 15,000 より大きい場合は 20% を返す、C9 が 12,500 より大きい場合は 17.5% を返す...です。

前の成績の例とよく似ていますが、この式は大きい IF ステートメントの保守が難しくなる場合があることのよい例です。新しい報酬レベルを追加したり、既存の金額や割合の値を変更したりすることになったら、どうする必要がありますか。多くの手作業が必要です。

ヒント: 数式バーで改行を挿入して、長い式を読みやすくすることができます。改行位置で Alt + Enter キーを押すだけです。

ロジックの順序が正しくない手数料シナリオの例を次に示します。

順序が間違っている D9 の式 =IF(C9>5000,10%,IF(C9>7500,12.5%,IF(C9>10000,15%,IF(C9>12500,17.5%,IF(C9>15000,20%,0)))))

何が間違っているかわかりますか。売上の比較の順序を前の例と比べてみてください。どういう方向で行われていますか。そうです、小さい値から大きい値に向かって行われており ($5,000 から $15,000)、その逆ではありません。しかし、なぜそれが大きな問題なのでしょうか。なぜなら、この式では $5,000 を超えるすべての値が最初の評価を通過できないからです。売上が $12,500 であるものとします。これは $5,000 より大きいので IF ステートメントは 10% を返し、そこで停止します。多くの場合、この種のエラーは悪影響があるまで気付かないので、大きな問題になる可能性があります。入れ子になった複雑な IF ステートメントには大きな落とし穴がいくつかあることはわかりましたが、それではどうすればよいのでしょうか。ほとんどの場合、IF 関数を使って複雑な式を作る代わりに、VLOOKUP 関数を使用できます。VLOOKUP を使うときは、最初に参照テーブルを作る必要があります。

セル D2 の式 =VLOOKUP(C2,C5:D17,2,TRUE)
  • =VLOOKUP(C2,C5:D17,2,TRUE)

この式は、C5:C17 の範囲で C2 の値を検索します。値が見つかった場合は、同じ行の D 列から対応する値を返します。

セル C9 の式は =VLOOKUP(B9,B2:C6,2,TRUE)
  • =VLOOKUP(B9,B2:C6,2,TRUE)

同様に、この式は B2:B22 の範囲でセル B9 の値を探します。値が見つかった場合は、同じ行の C 列から対応する値を返します。

注: どちらの VLOOKUP も式の最後で TRUE 引数を使っています。これは、近似一致を探すことを意味します。つまり、参照テーブルの厳密な値だけでなく、それらの間の値も一致します。この例では、参照テーブルを昇順に並べる必要があります。

VLOOKUP の詳細については、こちらを参照してください。いずれにしても、12 レベルの複雑な入れ子になった IF ステートメントよりはるかに簡単なことは確かです。目立ちはしませんが他にも次のような利点があります。

  • VLOOKUP の参照テーブルは開いて簡単に確認できます。

  • テーブルの値は簡単に更新でき、条件が変化しても式を変更する必要はありません。

  • ユーザーが参照テーブルを見たり変更したりできないようにしたい場合は、別のワークシートに置くだけで済みます。

ご存じですか?

複数の入れ子になった IF ステートメントを 1 つの関数で置き換えることができる IFS 関数が提供されるようになっています。最初の成績の例には、次のように 4 つの入れ子になった IF 関数がありました。

  • =IF(D2>89,"A",IF(D2>79,"B",IF(D2>69,"C",IF(D2>59,"D","F"))))

これを、次のように簡単な 1 つの IFS 関数に置き換えることができます。

  • =IFS(D2>89,"A",D2>79,"B",D2>69,"C",D2>59,"D",TRUE,"F")

IFS 関数は、すべての IF ステートメントとかっこを心配する必要がないため便利です。

注: この機能は、Office 365 サブスクリプションを購入しているユーザーのみが使用できます。Office 365 のサブスクリプションを使用している場合は、最新バージョンの Office をインストールしているかどうかを確認してください

Office 365 または Excel の最新バージョンを試してみる

補足説明

Excel Tech Community では、いつでも専門家に質問できます。Microsoft コミュニティでは、サポートを受けられます。また、Excel User Voice では、新機能についての提案や改善案を送信することができます。

関連トピック

ビデオ: 高度な IF 関数
IFS 関数 (Office 365、Excel 2016 以降)
COUNTIF 関数は、1 つの条件に基づいて値をカウントします
COUNTIFS 関数は、複数の条件に基づいて値をカウントします
SUMIF 関数は、1 つの条件に基づいて値を合算します
SUMIFS 関数は、複数の条件に基づいて値を合算します
AND 関数
OR 関数
VLOOKUP 関数
Excel の数式の概要
壊れた数式のエラーを回避する方法
よくある数式のエラーをエラー チェックで修正する
論理関数
Excel 関数 (アルファベット順)
Excel 関数 (機能別)

スキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

この情報は役に立ちましたか?

ご意見をいただきありがとうございます。

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×