2023年11月20日11時00分 / 提供:マイナビニュース
今回も条件分岐が複数ある場合について話を進めていこう。前回の連載では、関数を途中で改行することにより、関数を見やすく記述する方法を紹介した。今回は複数の条件を一気に処理するのではなく、個別に処理して、その結果を統合する手法を紹介していこう。条件が複雑になるときは、今回の例のように「個別に処理」していくのも効果的だ。
関数IFで個別に「条件に応じた判定」を行う方法
前回や前々回の連載で紹介したように、関数IFSを使って「複数の条件分岐」をいちどに処理することも可能である。ただし、関数IFSの記述が長くなるため、頭が混乱してしまう恐れがある。
そこで今回は、それぞれの条件分岐を「個別に処理」して、その結果を統合する手法を紹介していこう。色々な条件が複雑に絡み合うときは、各条件を個別に処理していく手法も探ってみるとよい。
まずは、前回の連載と同じ「体脂肪率の判定」について、それぞれの条件を関数IFで個別に処理していく方法を紹介しよう。体脂肪率の判定基準は前回と同じで、それぞれ以下のようになっている。
【男性の体脂肪率】
低:15%未満
標準:15%以上、25%未満
高:25%以上
【女性の体脂肪率】
低:25%未満
標準:25%以上、35%未満
高:35%以上
このグループ分けを関数IFで個別に行うときは、「性別」と「体脂肪率」を基準に以下のような条件分岐を行えばよい。
・男、15未満 ・・・・・・・ 低
・男、15以上、25未満 ・・・ 標準
・男、25以上 ・・・・・・・ 高
・女、25未満 ・・・・・・・ 低
・女、25以上、35未満 ・・・ 標準
・女、35以上 ・・・・・・・ 高
まずは、処理用のセルを用意する。ここでは、以下の図のようなセル範囲を用意した。ここで、それぞれの条件分岐を関数IFで個別に処理していく。
最初の条件分岐は、性別が「男」で体脂肪率が「15未満」の場合に「低」と判定する、というものだ。これを関数IFで記述すると以下の図のようになる。なお、条件に合致しない場合(偽の場合)は「空文字」を出力するように指定してある。
次の条件分岐は、性別が「男」で体脂肪率が「15以上、25未満」の場合に「標準」と判定する、というものだ。こちらは以下の図のように関数IFを記述すればよい。
同様の手順で、以降の条件分岐についても関数IFを記述していく。たとえば、「男、25以上」の条件分岐は、以下に示した関数IFをJ3セルに入力すればよい。
■J3セルに入力した関数IF
=IF(AND(D3="男",E3>=25),"高","")
念のため、性別が「女」の場合の条件分岐についても関数IFの記述を紹介しておこう。これらを実現する関数IFの記述は、それぞれの以下のようになる。
■L3セルに入力した関数IF
=IF(AND(D3="女",E3>=25,E3=35),"高","")
これで6個の条件分岐をすべて処理できたことになる。以下の図に示した例の場合、「男、15以上、25未満」の条件に合致しているので「標準」の文字だけが表示されることになる。
これら6個の関数IFをオートフィルでコピーすると、以下の図のような結果が得られる。いずれのデータも「6個の条件分岐」のうち「1個だけに合致する」はずなので、各行に1カ所だけ文字が表示される、という結果になる。
あとは、これらの結果から「文字が表示されているセル」だけを抽出すればよい。この処理は、文字列を結合する関数CONCATで実現できる。
上図のように関数をCONCATを入力すると、「H3~M3セルの文字を結合したデータ」が出力される。今回の例では「文字が表示されているセル」は1カ所しかないので、結果として「文字が表示されているセル」だけを抽出するのと同じ処理になる。
あとは、この関数CONCATをオートフィルでコピーするだけ。このような手法でも前回の連載と同じ結果を得ることができる。
このように、条件に応じてデータを「グループ分け」するときは、関数IFと関数CONCATを組み合わせると、複数の条件分岐を「個別に処理」できるようになる。覚えておくとよい。
関数IFで個別に「条件に応じた計算」を行う方法
続いては、条件に応じて計算を分岐させる例を紹介していこう。今度は、あるクリーニング店の会計を例を話を進めていく。この店では、会員の方向けに10%OFFの割引サービスを実施している。さらに、月曜日の場合は15%OFF、近所の方に配布するDM(チラシ)を持参した場合は25%OFF、といった割引サービスも実施されている。
・「会員」の場合 ・・・・・・ 10%OFF
・「月曜」の場合 ・・・・・・ 15%OFF
・「DM」の場合 ・・・・・・ 25%OFF
これらの割引は同時に使用することが可能で、最大50%OFFの割引を受けられる仕組みになっている。
そのほか、クリーニングを終えた衣類を早期に引き取ってくれた方に「50円券」や「10円券」の金券も配布しており、これらも複数枚の同時使用が可能となっている。
・「50円券」の割引金額 ・・・・ 50円×枚数
・「10円券」の割引金額 ・・・・ 50円×枚数
この場合、条件に応じた「▲▲%OFF」の割引に加えて「50円券」や「10円券」による値引きも考慮し、「割引後の料金」を計算しなければならない。
そこで、これらの割引金額を個別に計算するセルとして、以下のようなセル範囲を用意した。
それでは、各条件における「割引金額」を計算していこう。まずは、「会員」であった場合の割引金額について。「会員」の場合は10%OFFの割引を行うので、割引金額は「合計金額×0.1」で計算できる。これを関数IFで処理すると以下の図のような記述になる。
同様の手順で他の割引サービスについても「割引金額」を計算していく。「月曜」の場合は15%OFF、「DM」の場合は25%OFFなので、それぞれを処理する関数IFは、以下の図のような記述になる。
さらに、「50円券」と「10円券」による値引き額も計算していく必要がある。こちらは「使用した枚数」が数値で入力されているので、関数IFを使わずに計算することが可能だ。それぞれの「割引金額」(値引き額)を計算する数式は、以下の図のようになる。
これらの「割引金額」を関数SUMで合計し、それを「合計金額」から引き算すると、「割引後料金」を求められる。
あとは、これらの関数と数式をオートフィルでコピーするだけ。これで、すべての「割引後料金」を求めることが可能となる。
このように、条件が複数あり、それぞれで計算方法が変化していく場合は、各条件について個別に計算を行い、それを関数SUMなどで合計すると、複雑な処理を「理解しやすい形」で実現できるようになる。
上記の処理を1つの数式(関数)で記述することも不可能ではないが、かなり頭が混乱してしまうだろう。このような場合は、各条件の処理を個別に計算して、その結果を統合するように作業を進めていくとよい。
割引の併用を認めない場合は?
参考までに、「▲▲%OFF」の割引サービスが併用不可になっているケースについても紹介しておこう。この場合、「会員」、「月曜」、「DM」の割引サービスのうち「割引金額が最も大きいもの」だけを「割引後料金」に反映させる必要がある。
このような場合は、関数MAXを使って「割引金額が最も大きくなる数値」だけを引き算すればよい。さらに、「50円券」と「10円券」による値引き額を引き算すると、数式の記述は以下の図のようになる。
あとは、この数式を関数オートフィルでコピーするだけ。これで「▲▲%OFF」の割引を併用できないケースの「割引後料金」を計算できる。
このように各条件の処理を個別に計算しておくと、「併用不可」などのケースにも手軽に対応できるようになる。複数条件を扱うときの処理方法の一例として、参考にして頂ければ幸いだ。