神奈川大学 経済学部 経済情報処理

Tips: IF関数とフローチャート


0. フローチャートとは?

フローチャート(flow chart)とは、プログラムの処理の流れを図示して整理するための図表の書き方の一つです。他にも同じような目的の図表はたくさんありますので別に何をつかってもいいのですが、Excelの IF関数程度の処理を整理するのであれば古典的なフローチャートで十分です。

1. IF関数と判断

IF関数と対応するフローチャートの要素は「判断」と呼ばれるひし形の要素です。通常、判断対象になるのは論理式(*1)であり、論理式の答えが真(TRUE)のときと、偽(FALSE)のときで処理を2分岐させます(*2)。IF関数は論理式の値によって「真の場合」「偽の場合」の2つの計算のどちらを行うかを決めるので、IF関数は「関数」といいながら実質的には判断を実行しているわけで、ここが分かりにくい理由の一つです。

IF関数を形式的に書くと、

IF(論理式, 論理式が真の場合の計算式, 論理式が偽の場合の計算式)

となります。これは、フローチャートの記号を使って描くとこんなかんじになります。

具体的な例として、「H1セルの内容が100より大きかったらH1*0.9 を結果として返す。そうでなければ H1*1.1 を返す」という 処理を考えてみましょう。

この処理をフローチャートの記号で描くと、こんな感じ。

IF関数で表現するためには、これを素直にIF関数の型にあてはめてやればいいので

=IF(H1>100, H1*0.9,H1* 1.1)

となるわけです。

2. より複雑な論理式が入っている判断とIF関数

2.1 複数の条件が同時に成立するときに TRUEになるケース(AND関数利用)

「5科目の平均点が60点以上 かつ 5科目の最低点が 40点以上なら合格、そうでなければ不合格」

という条件を、まずフローチャートで書いてみましょう。論理式は「平均点>=60 かつ 最低点 >=40」ですから、フローチャートは以下のようになります。

このままではExcelの形式になっていませんから、論理式の部分を Excelの形式で書き直してやります。便宜上(注3)平均点は A1セル、最低点は A2セルに入っているとします。Excelでは、「かつ(論理積)」を表すためにはAND( )関数を使いますから、論理式は

AND(A1>=60, A2>=40)

となります。フローチャートにするとこんな感じ。

これをそのまま IF関数の形式に落とし込んでやると、

=IF(AND(A1>=60, A2>=40), "合格", "不合格)

となります。

2.2 複数の条件が同時に成立するときに TRUEになるケース(IF関数を複数回利用)

さて、2.1では複数の条件を扱うために AND関数を使いましたが、これはAND関数なしでも記述することができます(注4)。平均点と最低点の条件を整理すると、

となります。平均点を先に見ると、平均点が60点未満の人は、最低点が何点であろうと不合格です。ですから、この条件は

「もし 平均点が60点以上 ならば 最低点をチェックする さもなければ 不合格」

とまず書き直すことができます。さらに、「最低点をチェックする」の部分を展開すると、

「もし 平均点が60点以上 ならば (もし 最低点が40点以上 ならば 合格 さもなければ 不合格) さもなければ 不合格)」

となります。ちょっとややこしくなったのでフローチャートで整理すると、こんな感じです。2.1のケースと異なり、"不合格"という結果を出す箱が2つになっていることに注意してください。

論理式の部分をExcelの式で書き直すと、こんな感じになります。

IF関数は、IF(論理式, 真の場合の処理, 偽の場合の処理) という形式ですから、このフローチャートは論理式が2つあったりして素直には IF関数の形式におちません。そこで、左下のごちゃごちゃを一度見ないことにします。

この形式なら、IF関数に機械的に落とせます。こんな感じ。

=IF(A1>=60, 真の場合の処理, "不合格")

「真の場合の処理」としてまとめておいた「ごちゃごちゃ」だけ取り出してみると、こんな感じになります。

これまた、機械的にIF関数に落とせるので、上で「真の場合の処理」としてマスクしておいた部分は

IF(A2>=40, "合格", "不合格")

と書くことができました。あとは、この書き直したモノを埋め込んでやればいいので、全体としては

=IF(A1>=60, IF(A2>=40, "合格", "不合格"),"不合格")

と書くことができます。

2.3 ANDで書くか、IF関数を複数回使うか?

上のケースは、どちらかといえば ANDで記述した方がスマートです。IF関数を複数回使うと、"不合格"という処理結果を2カ所で定義する必要がありますからちょっとカッコワルイ。しかし、処理の内容によっては、IF関数を複数回重ねて書く方がすっきりということもよくあります。こんなケースを考えてみましょう。

「試験の成績が90点以上ならS, 80点以上90点未満ならA, 70点以上80点未満ならB, 60点以上70点未満なら C, 60点未満なら Dと判断する」

これを素直にフローチャートにすると、こんな感じです。

しかし、よく考えてみると得点の範囲に重複はないので、2つめ以降の判断に入っている「○○点未満」という条件は実は冗長です。たとえば、2つめの判断では、

(得点 >= 80点) かつ (得点 < 90点)

となっていますが、そもそもこの判断に処理が回ってくるのは最初の判断で FALSEとなったときだけですから、得点は90点以上ではない=90点未満の時だけです。冗長な条件を削除すると、こんな感じ。

得点データがA1セルに入っているとして、IF関数に落とし込むと

=IF(A1>=90, "S",IF(A1>= 80, "A", IF(A1>=70, "B", IF(A1>=60, "C", "D"))))

となります。だいぶシンプルに記述できました。

(注1) 論理式ではなく数値などで分岐を行える判断もプログラミング言語によっては存在しますが、Excelとは関係ないのでそこはスルーで。
(注2) 3つ以上の分岐を行える判断もプログラミング言語によっては存在しますが、以下同文。
(注3) 普通に処理するなら、average( )関数や min( )関数を使って平均点や最低点は計算しますが、IF関数の話とは直接関係ないので省略。
(注4) Excelに限りませんが、同じロジックを実行するためのコードはいろいろな書き方が可能です。商売人なら実行速度やメモリ効率を気にするところですが、所詮Excelなので、「書く人、読む人にとって分かりやすい」ことを優先するのがいいでしょう。