IFは、条件を満たすかどうかで表示を変える関数です。「80点以上なら合格、そうでなければ不合格」といった判定に使います。
条件分岐のすべての出発点になる関数です。
書式
=IF(条件, 真の場合, 偽の場合)
| 引数 | 内容 |
|---|---|
| 条件 | 判定する式。結果が TRUE か FALSE になるもの |
| 真の場合 | 条件を満たしたときに返す値 |
| 偽の場合 | 満たさなかったときに返す値。省略すると FALSE が表示される |
3つ目の引数は省略しないでください。 省略すると条件を満たさないセルに FALSE という文字が並びます。何も表示したくないなら "" を指定します。
基本の使い方
A2に点数が入っているとします。
=IF(A2 >= 80, "合格", "不合格")
A2が90なら「合格」、70なら「不合格」が返ります。
文字列を返すときはダブルクォートで囲む必要があります。数値や数式ならクォートは不要です。
=IF(A2 >= 80, A2 * 1.1, A2)
条件に使える比較演算子
| 演算子 | 意味 | 例 |
|---|---|---|
= |
等しい | A2 = "東京" |
<> |
等しくない | A2 <> "" |
> |
より大きい | A2 > 100 |
>= |
以上 | A2 >= 100 |
< |
未満 | A2 < 100 |
<= |
以下 | A2 <= 100 |
「以上」と「より大きい」の取り違えは実務で頻発します。境界の値をテストデータに必ず入れて確認してください。 80点ちょうどが合格になるか、を実際に見るのが確実です。
複数の条件を組み合わせる
かつ(すべて満たす)
AND を使います。
=IF(AND(A2 >= 80, B2 >= 80), "合格", "不合格")
または(どれかを満たす)
OR を使います。
=IF(OR(A2 >= 80, B2 >= 80), "合格", "不合格")
否定
NOT で反転できますが、<> を使うほうが読みやすいことが多いです。
=IF(A2 <> "東京", "地方", "首都圏")
3段階以上に分ける(ネスト)
IFの中にIFを入れると、段階を増やせます。
=IF(A2 >= 90, "A", IF(A2 >= 80, "B", IF(A2 >= 70, "C", "D")))
上から順に判定され、最初に当てはまったところで止まります。 そのため、条件は厳しい順(大きい順)に並べる必要があります。逆順にすると全部が最初の条件に吸い込まれます。
ただし、3段階を超えたら IFS に切り替えるほうが読みやすくなります。
=IFS(A2 >= 90, "A", A2 >= 80, "B", A2 >= 70, "C", TRUE, "D")
括弧の対応を数えなくて済むぶん、後から直すのが格段に楽です。
空白の判定でつまずくところ
「空欄なら何も表示しない」はよく使う書き方です。
=IF(A2 = "", "", A2 * 1.1)
ここで注意したいのが、数式で "" を返したセルは「空白」ではないという点です。見た目は空欄ですが、COUNTA では1件として数えられ、ISBLANK は FALSE を返します。
厳密に「何も入力されていない」を判定したいなら ISBLANK を使います。
=IF(ISBLANK(A2), "未入力", "入力済み")
見た目の空欄をまとめて扱いたいなら A2 = "" のほうが実用的です。どちらが必要かを意識して選んでください。
エラーを条件にしたいとき
「エラーだったら別の値を出す」には、IFではなく IFERROR を使います。
=IFERROR(A2 / B2, "計算できません")
IFで書こうとすると ISERROR との組み合わせになり、同じ計算を2回書くことになります。IFERROR一択です。
よくある失敗
数式が長くなって直せなくなる
ネストが4段を超えたら IFS に。判定表が固定なら、別シートに対応表を作って XLOOKUP で引くほうが保守しやすくなります。条件が増えたときに表へ1行足すだけで済みます。
文字列の比較で大文字小文字が区別されない
IFの = は大文字小文字を区別しません。"abc" = "ABC" は TRUE です。区別したいなら EXACT を使います。
=IF(EXACT(A2, "ABC"), "一致", "不一致")
数値と文字列を比べている
"100"(文字列)と 100(数値)は等しくありません。他システムから貼り付けたデータで起きがちです。VALUE() で数値化するか、貼り付け時に形式を揃えてください。
実例:売上表に判定列を足す
実務でIFを使う場面のほとんどは「表に判定の列を1本足す」という形です。具体的に組み立ててみます。
売上表があり、A列に担当者、B列に売上金額が入っているとします。ここに「目標達成かどうか」を出すC列を足します。目標は50万円とします。
C2に入れる数式はこうなります。
=IF($B2>=500000, "達成", "未達")
これを下にコピーすれば全行に判定が付きます。B列にドル記号を付けていないのは、行ごとに違う金額を見たいからです。列だけ固定しているのは、右にコピーしても列がずれないようにするためです。
次に、目標額を数式の中に直接書くのをやめます。数式に数字を埋め込むと、目標が変わったときに全行を直すことになります。 目標額をE1などのセルに置き、そこを参照してください。
=IF($B2>=$E$1, "達成", "未達")
E1を書き換えるだけで全行の判定が変わります。この「数字を数式に埋め込まない」という習慣は、IFに限らずすべての数式で効いてきます。 後から仕様が変わったときの手戻りがまったく違います。
さらに、達成率も出したいとします。単純に割ると未入力の行でエラーになるので、先に空白を判定します。
=IF($B2="", "", $B2/$E$1)
判定と計算を1本の数式に詰め込みすぎないこと。 列を分けたほうが、あとから見たときに何をしているか分かります。他人に引き継ぐファイルなら、なおさらです。
条件式の書き方でつまずくところ
数値と文字列の比較
=IF(A1="100", "○", "×") と =IF(A1=100, "○", "×") は別物です。前者は文字列の「100」との比較、後者は数値の100との比較です。セルに数値が入っているのに文字列と比べると、常に「×」になります。
他のシステムから貼り付けたデータは、見た目が数値でも文字列として入っていることがよくあります。左寄せで表示されていたら文字列の可能性が高いと考えてください。
大文字と小文字
=IF(A1="OK", ...) は、A1が「ok」でも「Ok」でも真になります。比較は大文字と小文字を区別しません。 区別したい場合はEXACT関数を使います。
=IF(EXACT(A1,"OK"), "○", "×")
部分一致で判定したい
IFの条件式では部分一致ができません。「〜を含む」で判定したい場合は、COUNTIFやSEARCHと組み合わせます。
=IF(COUNTIF(A1,"*東京*")>0, "対象", "対象外")
COUNTIFはワイルドカードが使えるため、単独のセルに対して使うとこういう判定ができます。
範囲を条件にしてしまう
=IF(A1:A10>100, ...) のように範囲を渡すと、環境によって結果が変わります。IFの条件には1つの値を渡してください。 範囲全体を判定したいならANDやORを使います。
ネストが深くなったときの考え方
条件が3つ4つと増えると、IFの入れ子は急速に読めなくなります。目安として、入れ子が3段を超えたら別の書き方を検討してください。
IFSに置き換える。 条件と結果を平らに並べられるので、読みやすさが大きく変わります。→ IFS関数の使い方
対応表を作ってVLOOKUPで引く。 判定の基準が「◯以上◯未満」の区分なら、表にしたほうが管理が楽です。基準が変わったときも表を直すだけで済みます。
SWITCHを使う。 値が完全一致で振り分けられる場合は、こちらのほうが簡潔です。→ SWITCH関数の使い方
列を分ける。 一度に判定しようとせず、途中の判定を別の列に出してから最終判定をする。数式は長くなりませんし、どこで間違えたかも追いやすくなります。
判定の結果に何を返すか
IFが返すのは文字列だけではありません。数値、数式、空白、別のセルの参照、何でも返せます。
=IF($B2>=$E$1, $B2*0.05, 0)
これは達成していれば報奨金を計算し、していなければ0を返します。
=IF($B2>=$E$1, VLOOKUP($A2,マスタ!$A:$C,3,FALSE), "")
条件を満たすときだけ検索する、という書き方もできます。無駄な検索を減らせるので、行数が多い表では速度にも効きます。
空白を返したいときは "" を使いますが、これは「空文字」であって「空セル」ではありません。 ISBLANKでは空と判定されず、COUNTAでは数えられます。この違いでつまずくことが多いので、覚えておいてください。→ ISBLANK関数の使い方
判定の列を設計する
表に判定の列を足すとき、何を返すかで後の使い勝手が変わります。
真偽値を返す設計。 そのまま条件付き書式の条件に使え、合計すれば件数になります。集計との相性がもっとも良い形です。人が読む表では分かりにくいので、表示用には別の列を用意します。
文字列を返す設計。 「達成」「未達」のように人が読める形です。分かりやすい反面、集計には使いにくくなります。件数を数えるには条件付きの件数関数が必要です。
数値を返す設計。 区分を数値で表す形です。並べ替えの基準に使えます。表示は対応表で名称に変換します。
空文字を返す設計。 条件に合わないときは何も表示しない形です。見た目はすっきりしますが、件数を数えるときに混乱の元になります。
実務では、集計用の真偽値の列と、表示用の文字列の列を分けるのが確実です。列が増えますが、それぞれの用途に最適な形を持てます。作業列は非表示にできます。
どれか一つにまとめる場合は、そのファイルで何を優先するかで決めてください。集計が主なら真偽値、人が見るのが主なら文字列です。
条件式を読みやすく書く
条件式の書き方には、読みやすさの差があります。同じ動作でも、書き方次第で理解の速度が変わります。
比較する向きを揃えてください。 基準値を右に置くか左に置くか、表の中で統一します。「売上が基準以上」と「基準が売上以下」は同じ意味ですが、混在すると読みにくくなります。
否定を重ねないでください。 「空欄でない、かつ、対象外でない」より、「入力済み、かつ、対象」のほうが読めます。条件そのものを書き換えられないか検討してください。
基準値はセルに置いてください。 数式に埋め込むと、何を基準にしているのかが数式を読まないと分かりません。セルに置いて名前を付ければ、数式を見ただけで意図が伝わります。
長い条件は分けてください。 三つ以上の条件を一本に書くより、作業列に分けたほうが読めます。どの条件で外れたのかも分かります。
改行を使ってください。 数式バーの中で改行できます。条件と結果で行を分けると、構造が見えます。
これらは動作に影響しません。しかし、三か月後に自分が読むとき、あるいは他人が引き継ぐときに、大きな差になります。
よくある質問
Q. 条件を2つ以上にしたいのですが
ANDまたはORで包みます。=IF(AND(A1>100, B1="東京"), "○", "×") のように書きます。→ AND関数 / OR関数
Q. 「〜以外」を判定したいときは
<> を使います。=IF(A1<>"", "入力あり", "未入力") のように書きます。NOT関数を使う方法もありますが、<> のほうが短く済みます。
Q. エラーが出ているセルを判定したいのですが
IFの条件式ではエラーを普通に比較できません。ISERROR や IFERROR を使ってください。→ IFERROR関数の使い方
Q. 結果を色で変えたいのですが
IFでは色は変えられません。条件付き書式を使ってください。→ 条件付き書式で行全体に色を付ける方法
Q. 空白なのに「未達」と出ます
空白のセルは0として扱われるため、>= の判定では基準を下回ります。先に空白を判定して除外してください。
Q. TRUE / FALSE をそのまま出したいのですが
=A1>=100 と書くだけで TRUE / FALSE が返ります。IFで包む必要はありません。
Q. IFの結果で計算するとエラーになります
IFが文字列を返している場合、それを使って計算するとエラーになります。計算に使う列と表示用の列は分けてください。
Q. 数式が長くなりすぎて読めません
改行を入れられます。数式バーで Alt+Enter(スプレッドシートは Ctrl+Enter)を押すと、途中で改行できます。動作は変わりません。
まとめ
- 書式は
=IF(条件, 真の場合, 偽の場合) - 3つ目の引数を省略しない。不要なら
"" - 複数条件は AND / OR と組み合わせる
- ネストは厳しい順に並べる。4段を超えたら IFS
- 数式が返す
""は「空白」ではない
