LIGデザイナー採用
LIGデザイナー採用
2018.11.12

\ネスト地獄からの卒業/エクセルIF関数の複数条件「IFS関数」について考えました。

ゆりえ

こんにちは。経営企画室のゆりえです。会社全体のさまざまな数字を管理しています。これまでのLIGブログでは、エクセルやGoogleスプレッドシートの活用法に関する記事を書きました。

エクセルなどの表計算において頻出関数の1つ、IF関数。ある条件に対して、YES(TRUE)ならA、NO(FALSE)ならBというように条件分岐に応じた答えを返すことができる関数です。

IF関数はとても便利でよく使うのですが、複数条件に対応するためには、IF()のなかにさらにIF()を重ねて、さらにIF()……というふうにネストせざるをえません。表計算を自動化したいと思えば思うほど陥るIFのネスト地獄……! そんなときに、IF関数の複数条件に対応するIFS関数の出番です。今回は、使い方のご紹介とともに、IF関数との考え方の違いなどをお話させていただきます。

IFS関数

IFS関数について

関数
=IFS(条件1, 値1, 条件2, 値2, 条件3, 値3 ・・・ )
※2016年以降のエクセル、スプレッドシートに対応

IFS関数は、1つまたは複数の条件の真偽をチェックし、条件ごとに処理を分岐する関数です。IF関数の複数条件に対応できる関数で、何回もIFで囲む(ネストする)ことなく1つの数式で完成させることができるものです。最高です。IF関数に比べてあまり知られていないと思いますが、理解すればとても使いやすい関数です。

正しくは「イフエス」と読むそうですが、私はイフスと読んでおります。

使ってみる(例題)

お題。
このような表があります。それぞれの果物の販売個数に応じてA~Cにクラスを割り振ります。クラス部分をIFS関数を使って求めましょう。

D3のセルにこのように関数を入力します。


=IFS(C3>500, “A”, C3>200, “B”, C3>0, “C”)

この数式を日本語にすると「C3の値が、500より大きい場合Aを、200より大きい場合Bを、0より大きい場合Cを返す」という意味になります。条件それに対応する値を交互に次々と指定するだけなので、とてもシンプルでわかりやすい構造です。

エンター! すると、りんごの販売個数は500よりも大きいのでクラスは「A」。さらに、D3セルをコピーしD4~D5にペーストし数式を反映させると、オレンジは「B」、ぶどうは「C」ということがわかります。

できました。

このように、IFS関数を使うことで、条件が複数ある場合にもIF()を何個もネストせずに、1つの数式で条件分岐ができました。革命!

例題のIFS関数の条件分岐を図にするとこうなります。

気をつけるポイント

条件と対応する値を繰り返し指定するという、わかりやすい構造のIFS関数ですが、使ううえでの注意点がいくつかあります。

条件には正しい順番がある

前述の図の通り、条件によって次々と分岐をしていく関数なので、分岐させる条件の順番が重要となります。数式に入力した順番に分岐させていくので、解答の範囲を狭いところからどんどん広くしていく、もしくはまったく共通項のない条件を設定する必要があります。

たとえば、例題の数式で条件1と条件2を入れ替えてみます。


=IFS(C3>200, “B”, C3>500, “A”, C3>0, “C”)

すると、りんごのクラスは「A」が正解なのに、IFS関数の解答は「B」になってしまいました。

数式を日本語にしてみます。「C3の値が、200より大きい場合はBを返す(ここで計算終了! )、500より大きい場合はAを返す(ここで計算終了)、0より大きい場合はCを返す」となります。IFS関数の特徴として、1つ目の引数から順番に計算をし、条件に当てはまった時点で計算を終了するため、それより後ろの条件に当てはまるかどうかを見ていません。そのため、例題では間違ったクラス「B」を導いてしまいました。

条件の順番に気をつけないと間違った解答を導いてしまうので、日本語で読み上げてみたり図にしたり、いろいろなパターンでテストをおこなって、間違いがないか条件を1つずつ潰していくようにしましょう。

ちなみに、SUMIFS関数やCOUNTIFS関数も複数条件に対応する関数ですが、これらは条件に沿って分岐をするのではなく、データ郡のなかから条件に合致するデータを絞り込んで計算をするため、条件の順番が解答に影響することはありません。IFS関数はこれらと性質が異なる関数なのです。

条件の数には上限がある

IFS関数は、最大127個まで条件を指定できるそうです。多。


=IFS(条件1, 値1, 条件2, 値2, 条件3, 値3 ・・・, 条件127, 値127 )

条件やデータに変更があったときの修正や数式のテストがものすごく大変なので、条件が10を超えるくらいでIFS関数はしんどくなると思います。場合にもよりますが、条件が数十個になる場合などはIFS関数ではなく、VLOOKUP関数など別の関数を使う方法で解決するのが良いかと思います。

どの条件にも合致しないFALSEへの考慮

IF関数では、条件に対してNO(FALSE)の場合の挙動を必ず指定するのですが、IFS関数はYES(TRUE)かどうかの判定のみをおこなうため、そもそもFALSEという概念がありません。これは、IF関数とIFS関数との大きな違いであり、IFS関数を使ううえで必ず注意が必要なポイントです。

たとえば、りんごの販売個数が0だったとしましょう。C3のセルに0を入力します。

どん。すると、りんごのクラスがエラー「#N/A」になってしまいました。

このエラーはNo Answerという意味で、IFS関数で設定している3つのどの条件にも当てはまらないということを表しています。クラス「C」は販売個数1~200個なので、0個の場合の条件を指定していません。そのため、エラーとなったのです。

図にするとこうなります。

※ちなみにエラーについては以前こちらの記事でご紹介させていただきました。エラーは何がいけないのかヒントをくれる大先生。

さて、どの条件にも当てはまらない(3つ目の条件がNO)場合を指定したいのですが、IFS関数はYESの条件しか設定できません。どうすれば良いでしょうか。

これは、何も考えずに4つ目の条件として、TRUEと、それに対する値(今回は”-“)を追加することで解決します。


=IFS(C3>500, “A”, C3>200, “B”, C3>0, “C”, TRUE, “-“)

エンター!

りんごのクラスが「-」になり、無事エラーが解決しました。

このように、IFS関数を使う際は常に、どの条件にも当てはまらなかった場合として、条件の一番最後に「TRUE」および返す値を設定するようにしましょう。おまじないみたいなものだと思ってください。

さて、エラーは解決しましたし、基本的な使い方の説明はここまでですが、TRUEとはいったい何なのか気になりますよね。

IF関数との比較

ここで、例題のIFS関数の数式をIF関数を使って表現してみます。


=IF(C3>500, “A”, IF(C3>200, “B”, IF(C3>0, “C”, )))

出ました! ネストです。ネストしてますねー。私はこの、最後の「)))」の数がいつもわからなくなるので苦手です。

IFS関数なら1つでできたこの計算は、IF関数を条件分岐ごとに3つネストすることで計算できます。3つ目のIF()を見てください。3つ目の引数である「FALSE値」の部分に何も設定されていないことがわかります。

IFS()では値が見つからずにエラーとなった部分が、IF()ではエラーにはなりません。そう、IF関数とIFS関数とでは、結果が異なるのです!

つまり、IF関数では3つ目の引数「FALSE値」という概念があるため、どの条件にも当てはまらない場合にも値が返ってくるのに対し、IFS関数にはFALSE値という概念がなく、条件に当てはまる場合のみ答えを返すため、その条件に当てはまらない場合はエラーとなるということです。

さて、今回の例題では、3つ目のIF関数のFALSE値に”-“を入力することで解決ですね!


=IF(C3>500, “A”, IF(C3>200, “B”, IF(C3>0, “C”, “-“)))

りんごのクラスが「-」になりました!

図にするとこうです。

条件3のFALSE値が入り、関数が完結しました!

FALSEの働きもするTRUEという存在

IF関数とIFS関数の考え方の大きな違いは、FALSE値という概念の有無です。IFS関数は、そもそもFALSEという概念自体が想定されておらず、TRUE値のみで構成される関数です。そのため、このTRUE値の部分を利用して、FALSE値までもカバーするという考え方をする必要があります。そこで出てくるのがTRUEという特殊な関数です。

関数
=TRUE もしくは =TRUE()
※2007年以降のエクセル、スプレッドシートに対応

ほかの関数と組み合わせて使うことが多く、TRUEである(真である)ことを表すための関数です。()のなかに引数の入力は必要ありません。

ちょっと一瞬わかりづらいのですが、IFS関数の条件部分にTRUEを指定すると、TRUEは、TRUEかFALSEかでいうとTRUEであるため条件と一致するということになります。そのため、これが条件に入っている場合、絶対に条件に当てはまります。これを関数の一番最後に条件として追加しておくことで、それまでのすべての条件に合致しなかった場合=FALSE値の指定をすることができるのです。

TRUEを使ってFALSEを表現する、面白いです。

IF関数からの進化

IF関数にはあった概念が、2016年にできた新しいIFS関数ではなくなっている、というのが興味深いところです。この変化は、表計算において大きな意味があるのではないかと思います。TRUEはFALSEまで兼ねるという逆説的な大発見。そして、無駄な引数を省いた結果、最終的にはエラーにお任せをして導くという、なんてエコでシンプルな考え方でしょうか。多くの処理を可能にするための取捨選択をした結果、馴染みのあるものでも淘汰されるということが表計算の世界で起こっていることに感動しました。シンプルに柔軟に計算が可能になった分、関数の性質の理解とパターンを網羅する必要性をより感じるようになりました。

さいごに

IFS関数についてお話させていただきました。

すでに完成されていると感じていたものでもどんどん進化しているんだということを実感しました。ほかにも変化が起こっていると思うので勉強して追いついていきたいと思っています。

ありがとうございました。