SSブログ

エクセルのちょっといい話(8) [システムトレード]

先回は、IF関数の使い方についてご説明いたしました。今回も引き続き、IF関数について考えてみたいと思います。

IF関数は、様々な条件分岐を行なう際に大変重宝します。例えば、100点満点のテストの点数に応じて、80点以上なら"優"、60点以上なら"良"、40点以上なら"可"、40点未満なら"不可"、というような場合分けを行なうことを考えます。

A1セルに点数を入力するとした場合、普通であれば、それは次式のように表します。

  =IF(A1>=80,"優",IF(A1>=60,"良",IF(A1>=40,"可","不可"))) ・・・①

あるいは、もう少し簡単に、

  =IF(A1<40,"不可",IF(A1<60,"可",IF(A1<80,"良","優"))) ・・・②

とすることもできます。いずれにしても、頭から順番に処理を進めていくことになります。

この程度のネストであればこれでもいいのですが、例えば、株式関係のシートにおいて、株価に応じて呼値や手数料を変えていくということになると、ネストの階層は大変に深いものになってしまいます。場合によっては、エクセルの制限に抵触して一つのセルでは収まりきらないかもしれません。

ネストの階層が制限以内であったとしても、そのような複雑なネストを用いた数式は、全く見通しの悪いものになってしまいます。
何か解決策はあるのでしょうか?

実はIF関数のネストは、その処理結果が全て同一のデータ型である限りにおいて、分解して線形結合(1次結合)の形態にすることが可能です。
すなわち、複数のIF関数の足し算で表すことができるわけです。

上例の①式あるいは②式を線形結合で表すと、次式のようになります。

  =IF(A1>=80,"優","")&IF(AND(A1<80,A1>=60),"良","")
   &IF(AND(A1<60,A1>=40),"可","")&IF(A1<40,"不可","") ・・・③

ここで「&」は、文字列を足し合わせる際の演算記号です。すなわち、③式では各条件毎に分けられた4つのIF関数の和を求めていることになります。
各IF関数で条件に当てはまらない場合は、「""」(空白)を返すことがポイントです。

条件に合った場合のみ成績を返し、それ以外では空白を返すわけですから、③式の結果として成績が得られることになります。
式そのものは①式よりも長くなっていますが、IF関数のネストが解消され、条件が明確になっていることが分かります。

③式のネスト構造はAND関数を含めて2階層までですから、1セル当りの数式の制限文字数を超えない限り、いくらでも条件を追加することができます。
ちなみに、エクセル2003ではネストは7階層まで、数式の長さは1,024文字まで、エクセル2007ではネストは64階層まで、数式の長さは8,192文字までとなっています。

なお、③式では文字列を返す場合について示していますが、もちろん、数値を返す場合でも同じように求めることができます。
その場合は、③式における「""」を「0」に、「&」を「+」にすればOKです。

以上、IF関数を線形結合で表す方法についてご説明いたしました。この方法を用いることにより、複雑な条件分岐を含んだ計算式を分かりやすく表すことが可能となります。
ただし、計算式が長くなる分、処理速度的にはやや不利になるかもしれません。


PS.2008年10月6日のコラムで、重大な誤りが見つかりました。同内容を修正すると共に、修正内容等についてコメントに記しました。
関係各位には多大なるご迷惑をお掛けし、大変申し訳ありませんでした。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。