- 締切済み
エクセル2003 IF ネスト 回避方法
エクセルに詳しい方々 こんばんわ。 エクセル2003を使っております。 現在ある課題をもとに関数を組んでおりますが IFのネストに頭を悩ませております。 強引ではありますが現在組んた数式を貼り付けます。 *要はIF(COUNTIF・・・からの7式をどうにか短くしネストを回避したい です。 IF(OR(AND(E$150>=$ED$102,E$150<=$ED$103), AND(E$150>=$ED$104,E$150<=$ED$105), AND(E$150>=$ED$106,E$150<=$ED$107), AND(E$150>=$ED$108,E$150<=$ED$109), AND(E$150>=$ED$110,E$150<=$ED$111), AND(E$150>=$ED$112,E$150<=$ED$113), AND(E$150>=$ED$114,E$150<=$ED$115), AND(E$150>=$ED$116,E$150<=$ED$117), AND(E$150>=$ED$118,E$150<=$ED$119), AND(E$150>=$ED$120,E$150<=$ED$121), AND(E$150>=$ED$122,E$150<=$ED$123), AND(E$150>=$ED$124,E$150<=$ED$125), AND(E$150>=$ED$126,E$150<=$ED$127), AND(E$150>=$ED$128,E$150<=$ED$129), AND(E$150>=$ED$130,E$150<=$ED$131)), IF(COUNTIF($E$132:$E$138,E$152),$E$16, IF(COUNTIF($F$132:$F$138,E$152),$F$16, IF(COUNTIF($G$132:$G$138,E$152),$G$16, IF(COUNTIF($H$132:$H$138,E$152),$H$16, IF(COUNTIF($I$132:$I$138,E$152),$I$16, IF(COUNTIF($J$132:$J$138,E$152),$J$16, IF(COUNTIF($K$132:$K$138,E$152),$K$16,"")),"")
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kagakusuki
- ベストアンサー率51% (2610/5101)
KURUMITO様、 >AND関数をたくさん使われていますが一つにまとめることができますね。 >AND(E$150>=$ED$102,E$150<=$ED$131) と仰いますが、ED102~ED131の範囲内の、偶数行のセルの中にED102よりも小さな値のセルや、奇数行のセルの中にED131よりも大きな値のセルが存在していた場合には、その論理式では不具合が生じる恐れがあるのではないでしょうか?
- KURUMITO
- ベストアンサー率42% (1835/4283)
AND関数をたくさん使われていますが一つにまとめることができますね。全体として次のような式で良いように思います。 =IF(AND(E$150>=$ED$102,E$150<=$ED$131),IF(COUNTIF($E$132:$E$138,E$152),$E$16,IF(COUNTIF($F$132:$F$138,E$152),$F$16,IF(COUNTIF($G$132:$G$138,E$152),$G$16,IF(COUNTIF($H$132:$H$138,E$152),$H$16,IF(COUNTIF($I$132:$I$138,E$152),$I$16,IF(COUNTIF($J$132:$J$138,E$152),$J$16,IF(COUNTIF($K$132:$K$138,E$152),$K$16,""))))))),"")
- kagakusuki
- ベストアンサー率51% (2610/5101)
>いただいた式を反映させましたが思った結果が出ませんでした。 大変失礼致しました。 正しくは、 =IF(OR(AND(E$150>=$ED$102,E$150<=$ED$103),AND(E$150>=$ED$104,E$150<=$ED$105),AND(E$150>=$ED$106,E$150<=$ED$107),AND(E$150>=$ED$108,E$150<=$ED$109),AND(E$150>=$ED$110,E$150<=$ED$111),AND(E$150>=$ED$112,E$150<=$ED$113),AND(E$150>=$ED$114,E$150<=$ED$115),AND(E$150>=$ED$116,E$150<=$ED$117),AND(E$150>=$ED$118,E$150<=$ED$119),AND(E$150>=$ED$120,E$150<=$ED$121),AND(E$150>=$ED$122,E$150<=$ED$123),AND(E$150>=$ED$124,E$150<=$ED$125),AND(E$150>=$ED$126,E$150<=$ED$127),AND(E$150>=$ED$128,E$150<=$ED$129),AND(E$150>=$ED$130,E$150<=$ED$131)),IF(COUNTIF($E$132:$K$138,E$152),INDEX($E$16:$K$16,MIN(IF(COUNTIF($E$132:$K$132,E$152),MATCH(E$152,$E$132:$K$132,0),9E+99),IF(COUNTIF($E$133:$K$133,E$152),MATCH(E$152,$E$133:$K$133,0),9E+99),IF(COUNTIF($E$134:$K$134,E$152),MATCH(E$152,$E$134:$K$134,0),9E+99),IF(COUNTIF($E$135:$K$135,E$152),MATCH(E$152,$E$135:$K$135,0),9E+99),IF(COUNTIF($E$136:$K$136,E$152),MATCH(E$152,$E$136:$K$136,0),9E+99),IF(COUNTIF($E$137:$K$137,E$152),MATCH(E$152,$E$137:$K$137,0),9E+99),IF(COUNTIF($E$138:$K$138,E$152),MATCH(E$152,$E$138:$K$138,0),9E+99))),""),"") とすべきでした。 尚、これではあまりにも長過ぎますし、万一、検索する範囲が広がった場合には、更に長くなってしまいますので、次の様な関数は如何でしょうか? =IF(SUMPRODUCT(($ED$102:$ED$130<=E$150)*($ED$103:$ED$131>=E$150)*MOD(ROW($ED$103:$ED$131)-ROW($ED$102),2)),IF(COUNTIF($E$132:$K$138,E$152),OFFSET($K$16,,-LOG(SUMPRODUCT(2^(COLUMN($K$132)-COLUMN($E$132:$K$132))*(COUNTIF(OFFSET($E$132:$E$138,,COLUMN($E$132:$K$132)-COLUMN($E$132)),E$152)>0)),2)),""),"") それから、日付と曜日の関係でしたら、若しかしますと、もっと効率的な方法もあるかも知れませんので、E132~K138にどの様なデータが入力(或いは関数による自動表示)されているのかとか、何故、$ED$102~$ED$131のデータを、「E$150以上であるか否かを判定する際に使用するデータ(奇数行のデータ)」と「E$150以下であるか否かを判定する際に使用するデータ(偶数行のデータ)」を2つ列に分けて入力しないのか、といった詳しい内容を具体的な例を挙げて補足されては如何でしょうか? 後、どうでも良い事ですが、ANo.1を投稿する前に、64までネストが可能なExcel2010を使用して、御質問文にある関数を確認しました処、末尾の「)」の数が足りませんでした。 末尾部分は $K$16,"")),"") ではなく、 $K$16,""))))))),"") ではないでしょうか?
- kagakusuki
- ベストアンサー率51% (2610/5101)
まだまだ改良の余地はありますが、取り敢えずは、叩き台として第1案 =IF(OR(AND(E$150>=$ED$102,E$150<=$ED$103),AND(E$150>=$ED$104,E$150<=$ED$105),AND(E$150>=$ED$106,E$150<=$ED$107),AND(E$150>=$ED$108,E$150<=$ED$109),AND(E$150>=$ED$110,E$150<=$ED$111),AND(E$150>=$ED$112,E$150<=$ED$113),AND(E$150>=$ED$114,E$150<=$ED$115),AND(E$150>=$ED$116,E$150<=$ED$117),AND(E$150>=$ED$118,E$150<=$ED$119),AND(E$150>=$ED$120,E$150<=$ED$121),AND(E$150>=$ED$122,E$150<=$ED$123),AND(E$150>=$ED$124,E$150<=$ED$125),AND(E$150>=$ED$126,E$150<=$ED$127),AND(E$150>=$ED$128,E$150<=$ED$129),AND(E$150>=$ED$130,E$150<=$ED$131)),IF(COUNTIF($E$132:$K$138,E$152),INDEX($16:$16,MIN(IF(COUNTIF($E$132:$K$132,E$152),MATCH(E$152,$E$132:$K$132,0),0),IF(COUNTIF($E$133:$K$133,E$152),MATCH(E$152,$E$133:$K$133,0),0),IF(COUNTIF($E$134:$K$134,E$152),MATCH(E$152,$E$134:$K$134,0),0),IF(COUNTIF($E$135:$K$135,E$152),MATCH(E$152,$E$135:$K$135,0),0),IF(COUNTIF($E$136:$K$136,E$152),MATCH(E$152,$E$136:$K$136,0),0),IF(COUNTIF($E$137:$K$137,E$152),MATCH(E$152,$E$137:$K$137,0),0),IF(COUNTIF($E$138:$K$138,E$152),MATCH(E$152,$E$138:$K$138,0),0))),""),"")
お礼
なんとか自力で成り立つようになりました。 ありがとうございました。
補足
早速のご回答ありがとうございます。 いただいた式を反映させましたが思った結果が出ませんでした。 すみません。 内容を具体的にお伝えいたします。 ANDの式は具体的に日付を引っ張っております。 E 150が04/02 ED 102が04/01 ED 103が04/05 (AND(E$150>=$ED$102,E$150<=$ED$103)→E150にある04/02は条件に当てはまる。 IF(COUNTIFの式は上記条件に当てはまった場合E132~E138にE152とマッチしてるものがあれば E16に置き換えなさいというものです。ちなみにE152は曜日です。 IF(COUNTIF($E$132:$E$138,E$152),$E$16→当てはまるとして 結果Aの表示にしたいです。
お礼
関数の内容は把握できました。 おっしゃる通り例文が悪かったです。 また、関数が不足しておりました。 失礼いたしました。