こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCELのIF文を短く記述するには…

希望の動作にせっかくたどり着けましたが、長すぎて拒絶されます。
以下の関数を短く記述するにはどのようにすれば宜しいでしょうか?
ご教示お願いします。


=IF(AND($C$13>0,$C$13<=12),ROUND(VLOOKUP($B$23,B5:Q23,MATCH($C$13,B5:Q5,0),FALSE)/$C$13,0),""
&IF(AND($C$13>12,$C$13<=24),ROUND(VLOOKUP($B$23,B25:Q32,MATCH($C$13,B25:Q25,0),FALSE)/$C$13,0),""
&IF(AND($C$13>24,$C$13<=36),ROUND(VLOOKUP($B$23,B45:Q52,MATCH($C$13,B45:Q45,0),FALSE)/$C$13,0),""
&IF(AND($C$13>36,$C$13<=48),ROUND(VLOOKUP($B$23,B54:Q61,MATCH($C$13,B54:Q54,0),FALSE)/$C$13,0),""
&IF(AND($C$13>48,$C$13<=60),ROUND(VLOOKUP($B$23,B63:Q70,MATCH($C$13,B63:Q63,0),FALSE)/$C$13,0),""
&IF(AND($C$13>60,$C$13<=72),ROUND(VLOOKUP($B$23,B72:Q79,MATCH($C$13,B72:Q72,0),FALSE)/$C$13,0),""
&IF(AND($C$13>72,$C$13<=84),ROUND(VLOOKUP($B$23, B85: Q92,MATCH($C$13,B85:Q85,0),FALSE)/$C$13,0),""
&IF(AND($C$13>84,$C$13<=96),ROUND(VLOOKUP($B$23, B94:Q101,MATCH($C$13,B94:Q94,0),FALSE)/$C$13,0),""
&IF(AND($C$13>96,$C$13<=108),ROUND(VLOOKUP($B$23,B103:Q110,MATCH($C$13,B103:Q103,0),FALSE)/$C$13,0),""
&IF(AND($C$13>108,$C$13<=120),ROUND(VLOOKUP($B$23,B112:Q119,MATCH($C$13,B112:Q112,0),FALSE)/$C$13,0),""
&IF(AND($C$13>120,$C$13<=132),ROUND(VLOOKUP($B$23,B125:Q132,MATCH($C$13,B125:Q125,0),FALSE)/$C$13,0),""
&IF(AND($C$13>132,$C$13<=144),ROUND(VLOOKUP($B$23,B134:Q141,MATCH($C$13,B134:Q134,0),FALSE)/$C$13,0),""
&IF(AND($C$13>144,$C$13<=156),ROUND(VLOOKUP($B$23,B143:Q150,MATCH($C$13,B143:Q143,0),FALSE)/$C$13,0),""
&IF(AND($C$13>156,$C$13<=168),ROUND(VLOOKUP($B$23,B152:Q159,MATCH($C$13,B152:Q152,0),FALSE)/$C$13,0),""))))))))))))))

投稿日時 - 2013-04-06 16:33:44

QNo.8030181

困ってます

質問者が選んだベストアンサー

こんにちは。
> 以下の関数を短く記述するにはどのようにすれば宜しいでしょうか?
というご質問ですので、必ずしも、今質問者さんが抱えている問題
を解決に導くような答えには、ならないかも知れませんが、
素直に返事を書いてみました。

=ROUND(VLOOKUP($B$23,INDEX((B5:Q23,B25:Q32,B45:Q52,B54:Q61,B63:Q70,B72:Q79,B85:Q92,B94:Q101,B103:Q110,B112:Q119,B125:Q132,B134:Q141,B143:Q150,B152:Q159),0,0,($C$13+11)/12),MATCH($C$13,INDEX((B5:Q5,B25:Q25,B45:Q45,B54:Q54,B63:Q63,B72:Q72,B85:Q85,B94:Q94,B103:Q103,B112:Q112,B125:Q125,B134:Q134,B143:Q143,B152:Q152),0,0,($C$13+11)/12),0),FALSE)/$C$13,0)

要するに
 =ROUND(VLOOKUP($B$23,可変範囲1,MATCH($C$13,可変範囲2,0),FALSE)/$C$13,0)
というひとつの式が骨格ですね。
なので、その可変範囲をINDEX関数の領域指定を使うことで指定し、
IF関数による類似式の列挙を回避して短くしました。

ただ、この式自体が正しく機能するのかどうか、
「実際のシートを見てない」「何を計算したいのか確認のしようがない」こちらとしては
判断できません。
C13は必ず 1以上168以下 の数値だと担保されている、ということだけは察しがつきますが、
MATCH関数でVLOOKUP関数の引数としての列を指定する部分とか、
「数式が期待している」通りに条件が整っていないとエラー出そう点は幾つかありますね。
とりあえず、ご提示の数式しかわかりませんし、検証もできませんから、
"直訳"するかのごとく、骨格はそのまま、短くする工夫だけ、を例示しました。

一応、
 INDEX(参照,行番号,列番号,領域番号)
の扱い方だけ補足しておきますが、
[参照]の処は、()の内側に、(領域1,領域2,領域3,領域4,....)のように指定してあって
[領域番号]で何番目の領域かを決めています。
[行番号]、[列番号]は本来、何行めで何列めのセル、という風に指定するものですが、
ここに 0 を指定することで、行全体、列全体、つまり、範囲内のすべてのセル、となります。

単純な例で、
 INDEX((A1:B2,C3:D4,E5:F6),0,0,2)
は、C3:D4 への参照を返します。

また、領域番号には通常、有効な領域番号を正整数で指定するものですので、
 ($C$13+11)/12)
は、$C$13が正の数という前提で、
 INT($C$13+11)/12)
と書くべきものを省略してることも伝えておきます。
 INDEX((A1:B2,C3:D4,E5:F6),0,0,2.34)
でも、C3:D4 への参照を返しますので。

それと、ご提示の数式ですが、""& の使い方はこれであっているのでしょうか?
""& の後に数値を続けて、その数値を数字文字列にするという意味になりますが、
ご提示のものは、C13が12以下ならば数値、それ以外は数字文字列になっています。
私の方は(エラーになるような状況でなければ)すべて数値を返すように、
その部分は"意訳"しています。

とりあえず以上です。

投稿日時 - 2013-04-06 22:49:45

お礼

ご回答ありがとうございます。
頂戴した関数を貼り付けると見事に希望の動作を致しました。
別sheetに纏めてから取り出すのと動作は同じですが、今後のために自分でもこのように書けるよう勉強させていただきます。
ありがとうございました。

投稿日時 - 2013-04-07 09:57:38

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

 検索範囲の左端の列にB23と同じ値が無い場合や、検索範囲の上端の行にC13と同じ値が無い場合においてもエラーとはならない様に考慮しますと、以下の様な関数となります。

=IF(AND($C$13>0,ISNUMBER(1/COUNTIF(OFFSET(B5,INDEX({0,20,40,49,58,67,80,89,98,107,120,129,138,147},-INT(-$C$13/12)),,IF($C$13>12,7,18)),$B$23)/COUNTIF(OFFSET(B5:Q5,INDEX({0,20,40,49,58,67,80,89,98,107,120,129,138,147},-INT(-$C$13/12)),),$C$13))),ROUND(VLOOKUP($B$23,OFFSET(B5:Q159,INDEX({0,20,40,49,58,67,80,89,98,107,120,129,138,147},-INT(-$C$13/12)),),MATCH($C$13,OFFSET(B5:Q5,INDEX({0,20,40,49,58,67,80,89,98,107,120,129,138,147},-INT(-$C$13/12)),),0),FALSE)/$C$13,0),"")

投稿日時 - 2013-04-07 01:26:35

お礼

ご回答ありがとうございます。
データ入力側で該当する値が必ず存在するよう規制していますので、No.3 cj_mover様の書式を使用させていただきましたが、今後のために自分でもこのように書けるよう勉強させていただきます。
ありがとうございました。

投稿日時 - 2013-04-07 09:58:00

その“寿限無”式は貴方の質問に対する回答だったのでしょうか?
「貴方の質問」の内容は何だったのですか?
質問番号があれば教えてください。
質問番号とは、例えば、
http://okwave.jp/qa/q8030181.html
の中の「8030181」のことです。

【独白】それにつけても、あのような寿限無式をアドバイスするとは、呆れたモンです。

投稿日時 - 2013-04-06 17:56:50

お礼

ご回答ありがとうございます。
自分で求めた一部分の結果を全体に当てはめると“寿限無”になってしまい困っていました。
決して呆れた回答者様が存在したわけではございませんので…

投稿日時 - 2013-04-07 09:57:05

ANo.1

式そのものが有っているかどうかわかりませんが、IF関数1つごとにデータを例えばR1セルから下方に並べるようにして最後にそれらの値を利用するようにしてはどうでしょう。
=IF(AND($C$13>0,$C$13<=12),ROUND(VLOOKUP($B$23,B5:Q23,MATCH($C$13,B5:Q5,0),FALSE)/$C$13,0),""
&IF
のような式になっていますが少なくともIF関数が完結した後で&を使う形になるでしょう。したがって正しくは""の後に )が付く形でないとおかしいですね。
=IF(AND($C$13>0,$C$13<=12),ROUND(VLOOKUP($B$23,B5:Q23,MATCH($C$13,B5:Q5,0),FALSE)/$C$13,0),"")
&
そのようにした場合には式の最後でのカッコ)は1つだけになりますね。
それにしても得られるデータは何のためになるのでしょう。

投稿日時 - 2013-04-06 17:10:42

お礼

ご回答ありがとうございます。
別sheetにデータを並べてVLOOKUPで参照できるようにし、必要な値を得ることが出来ました。
私のレベルではこの方法が一番わかりやすく簡単でした。
貴重なヒントを頂戴しありがとうございました。

投稿日時 - 2013-04-07 09:56:15

あなたにオススメの質問