• ベストアンサー

計算を速くするために単純化したいのですが、これ以上は難しいでしょうか?

A1に1から100までの整数を入力し、 A2には  A1が100以下の場合A  A1が80以下の場合B  A1が60以下の場合C  A1が40以下の場合D  A1が20以下の場合E を表示するために A2=IF(A1<=20,"E",IF(A1<=40,"D",IF(A1<=60,"C",IF(A1<=80,"B",IF(A1<=100,"A","?"))))) としたのですが、これよりも簡単にする方法はありますでしょうか。 実際のデータはもう少し刻みが多く、計算するデータの数も非常に多いので、計算時間を少しでも速くしたいと考えています。 実際に入力する値も整数で、戻り値も文字列です。 よろしくお願いします。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

こういう場合はVLOOKUPを使うといいです。 Sheet2のA1:B6に以下の表を作っておきます。 0   E 21   D 41   C 61   B 81   A 101   ? あとは、 A2=VLOOKUP(A1,Sheet2!A1:B6,2) とすればいいでしょう。

Sakana-Ya
質問者

補足

回答ありがとうございます。 入力する関数は、かなり少なくなりました。 さきほど、↓別の質問を見ていたところ、 http://okwave.jp/qa2539700.html 回答2で「VLOOKUP系の参照関数や配列数式はかなりのマシンパワーを浪費します~」とありました。 今回のIF関数でたくさん入力するのと、VLOOKUPでシンプルにまとめるのでは、一般的にはどちらが計算が速いのでしょうか? もしご存じでしたらよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (9)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.10

> 「ブックに記入された「数式の数」が問題になって来ます。」 > とおっしゃっており、数式の数としては1つですが、MIDとMATCHで > 2つ関数があるので、若干不利となってしまうのでしょうか? ひとつの数式内で使用されている関数の種類や数が重要なのではなく、   「ワークシート内の数式の総量」 がパフォーマンスを考える上では重要であり、これを「極力少なくする」よう にシートを設計するというのが、   「ブックに記入された「数式の数」が問題になって来ます。」 の意図だと思います。例えば...   ・お題: D1~D10000 にある金額を各行で千円未満切捨てし、        その合計を求める。(表示は特に必要なし)   ・解A: 作業列 E1:E10000 を設け、= ROUNDDOWN(D1/1000,0)とし、        各行の千未満切捨ての金額を計算し、それを SUMで合計   ・解B: =SUMPRODUCT(ROUNDDOWN(D1:D10000/1000,0)) & "千円" 解Aでは 10001 個の数式が必要なのに対し、解Bでは1個の数式で済みます。 このような工夫で省ける数式の数を極力まで減らします。 Excel では数式の参照するセルの値を書き換えると 再計算が発生します。 値を書き換える度、10001 個のセルの数式を計算するか、1 個のセルの数式 を計算するのか。 この計算の総量が一番パフォーマンスに影響するのです。 したがって、MIDとMATCHで2つの関数があるから不利...という点はさほど 重要ではなく、パフォーマンスを考える上では上記のような工夫が必要です。 使い慣れた方、あるいは、分かり易い方を使えば良いのだと思います。

Sakana-Ya
質問者

補足

わかりやすい説明ありがとうございました。 セル内の関数の数にとらわれるのではなく、ブック全体として計算量を減らすことを心がけようと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.9

度々済みません 訂正です 質問者さんのネストの数は仰る通り5ですね お察しの通り 「(」でカッコが式中同時に最大何個あけられたかで見ればいいと思いますよ 失礼致しました <(_ _)>

Sakana-Ya
質問者

補足

ネストの数は、てっきりIFの数かと思ってました。 =IF(A1>40,IF(A1>80,"A",IF(A1>60,"B","C")),IF(A1>20,"D","E")) の場合 IF(A1>40,~,~) → ネスト1つめ IF(A1>80,"A",~) → ネスト2つめ IF(A1>60,"B","C") → ネスト3つめ IF(A1>20,"D","E") → ネスト2つめ ということですね。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.8

P.S. おっと! ネストの深さですか 質問者の示されたIF文はネストが6 私のは3だと思います なので質問者さんの式だと 後2段ネストを深くすると エクセルに計算を拒否されてしまいますね これ困りものなのですよね 見た目式に異常はないのに結果がエラーになるのですから かく言う私もここでの質問に対し解答しようと作った式がこれに陥り 泣きを見た経験があります (ーー;)ヾ

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.7

p.s. 同じif文のネストで書くにしても 2分木法を使うとよりネストが減り 処理も効率化しますよ =IF(A1>40,IF(A1>80,"A",IF(A1>60,"B","C")),IF(A1>20,"D","E"))

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.6

ちょっと長くなってしまいましたが =CHOOSE(MATCH(1,FREQUENCY(A1,{100,80,60,40,20}),0),"A","B","C","D","E","") とか =CHAR(SUMPRODUCT(FREQUENCY(A1,{100,80,60,40,20})*{1;2;3;4;5;0})+64) とかでも出ますが 本来の趣旨からは外れてますかね (~ ~;)ヾ MIDでの構文が巧妙過ぎて、 その後では何を書いても霞みますぅ~ ちなみに上段の式は入力値が自然数ならば 小数点以下が付いていようが マイナスであろうが 101以上であろうが エラーとせず ちゃんと処理してくれます 解説はこちらでどうぞ http://pc.nikkeibp.co.jp/pc21/special/hr/hr6.shtml

Sakana-Ya
質問者

補足

回答ありがとうございます。 将来、小数点、マイナス等の取り扱いが必要となるかもしれなかったので助かります。 IF関数以外に、こんなにも方法があるとは、驚きました。

全文を見る
すると、全ての回答が全文表示されます。
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

No.2です。補足拝見しました。 確かにIFのネストもVLOOKUPも多用したり、データが多すぎると非常にマシンに負荷をかけます。が、どっちが計算が速いかまではちょっと私にはわかりません。 ただ、ご指摘のURLにある質問を見たところ、ファイルサイズが30MBとファイルサイズが巨大なので、パフォーマンスの問題が出ているようです。実際にファイルの大きさがそこまで極端に大きくないのであれば、とりあえず気にする必要はないと思います。(とは言え、データの数も非常に多いので、と書いていらっしゃいますね…。どれくらいの大きさなのでしょう) もし、データ量が多く、ひとつ値を入力するたびに計算に自動時間が走ってExcelが止まってしまうようであれば、 「ツール」>「オプション」>「計算方法」 を手動にし、データ入力後に「再計算実行」(F9を押しても可能)するという手もあります。

Sakana-Ya
質問者

補足

IF,VLOOKUPそれぞれ試してみようとおもいます。 作成途中で、最終的にどのくらいになるのかまだわかりませんが、現段階で6MB位です。 「計算方法→手動」利用してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

Match という手もあるかな。エラー処理してないけど。 =MID("ABCDE",MATCH(A1,{100,80,60,40,20},-1),1)

Sakana-Ya
質問者

補足

回答ありがとうございます。 回答1の方の意見では、計算速度の判断では、 「ブックに記入された「数式の数」が問題になって来ます。」 とおっしゃっており、数式の数としては1つですが、MIDとMATCHで2つ関数があるので、若干不利となってしまうのでしょうか? MIDという関数初めて知りました。 1つの答えを求めるのにも、いろいろな関数・組み合わせのアプローチがあるというがわかりました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

A2=LOOKUP(A1,{0,21,41,61,81,101},{"E","D","C","B","A","?"}) または A2=VLOOKUP(A1,{0,"E";21,"D";41,"C";61,"B";81,"A";101,"?"},2,TRUE) 上記の{}内はセル参照でも可、その場合は下記のように表を作成 0  "E" 21  "D" 41  "C" 61  "B" 81  "A" 101 "?" 上記の範囲がD1:E6なら A2=LOOKUP(A1,D1:D6,E1,E6) または A2=VLOOKUP(A1,D1:E6,2,TRUE)

Sakana-Ya
質問者

補足

回答ありがとうございます。 LOOKUPでセル参照以外の方法もあるんですね。 知りませんでした。 計算速度を考えた場合、LOOKUPとVLOOKUPでは速度はほとんど変わらないのでしょうか。 それともどちらかが若干速くなったりするのでしょうか。 また、回答2の方にも伺っているのですが、さきほど、↓別の質問を見ていたところ、 http://okwave.jp/qa2539700.html 回答2で「VLOOKUP系の参照関数や配列数式はかなりのマシンパワーを浪費します~」とありました。 IF関数でたくさん入力するのと、VLOOKUPでシンプルにまとめるのでは、一般的にはどちらが計算が速いのでしょうか? VLOOKUPでセル参照を使わなければ、そこまで負担がかからないような気がするのですが、いかがでしょうか? もしご存じでしたら回答よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>実際のデータはもう少し刻みが多く、 IF文では7つのネスト(重複)しか許可されていないので、それ以上の判断が必要な場合は別な方法で行う必要があります。 シート計算でどれだけの時間がかかるかの判断は、ブックに記入された「数式の数」が問題になって来ます。 複雑な数式を数千個以上登録されていると、再計算に時間が掛るようになってきます。

Sakana-Ya
質問者

補足

回答ありがとうございます。 ネスト(重複)というのは、IF関数の入れ子のことを指しているのでしょうか。 今回の A2=IF(A1<=20,"E",IF(A1<=40,"D",IF(A1<=60,"C",IF(A1<=80,"B",IF(A1<=100,"A","?"))))) の場合、5つと数えればよいのでしょうか? お手数ですがよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 計算式を教えてください。

    簡単に集計できる計算式があれば教えてください。 計算したい内容は毎日2種類の数値を入力しているのですがその数値には基準値があってその基準値を上回る部分だけを表示されるようにしたいのです。具体的には A列にはその日の商品「A」の実際の数値を入力 B列にはその日の商品「B」の実際の数値を入力 C列には商品「A」の数量-10ただし「A」「B」合計が20以下の場合は0 D列には商品「B」の数量-10ただし「A」「B」合計が20以下の場合は0 例えば、とある日の数量が商品「A」が12で商品「B」が10ならC列に2、D列に0とか、商品「A」が9で商品「B」が13ならC列に0、D列に2と自動的に表示されるといいのですが…IF関数でいろいろ試してみましたがギブアップです。どなたかこんな私に良きアドバイスをお願いいたします。

  • エクセルの計算式について

          A     B      C      D       E 1     -      -     #DIV/0!     -     #DIV/0! 2     -      -     #DIV/0!     -     #DIV/0! 3     -      -     #DIV/0!     -     #DIV/0! A1とB1 は整数値 C1には、=ROUNDDOWN((A1-B1)/A1,4) D1には、A1-B1 E1には、=ROUNDDOWN(IF((A1-B1)/A1>25%,(A1-B1)/0.35,0)+IF((A1-B1)/A1=25%,(A1-B1)/0.35,0),-3) が、2行目・3行目にも設定されている時  例えば、G1 のセルに E列の合計 SUM(E1:E3)を求めたいのですが、A1~B1 に整数が入ってないと(例えば、 0 の時)… G1 が、#DIV/0! となります。A1 B1 にだけ整数が入っていて、A2 B2 が 0 場合の、E列の合計が G1 に入るようにする方法について知りたいのですが…教えていただきたく、よろしくお願いいたします。

  • エクセルに以下のような複雑な計算をさせたいです。

    エクセルに以下のような条件の計算をさせたいです。 「2a , 3b , 5c , 6d , 8e , 10f」 a+b+c+d+e+fが上のどれよりも小さくなる場合の、 a,b,c,d,e,fの数字の組みわせで最も小さいものを求めたいです。 2a ≧ a+b+c+d+e+f 3b ≧ a+b+c+d+e+f 5c ≧ a+b+c+d+e+f 6d ≧ a+b+c+d+e+f 8e ≧ a+b+c+d+e+f 10f ≧ a+b+c+d+e+f (ただし、a,b,c,d,e,fは正の数) ※分かりやすいように、これらの数字は適当に入れたので、答えが無いかと思います。 実際は別の数字に置き換えます。 ※また、コンピュータが無限に計算し続けることを防ぐために上限を決めてもいいです 関数かマクロで計算させる方法を教えて下さい。 わかりやすくなるようにシンプルに説明しましたが、 実際は最大13組まで計算することになり、 自力でも計算してみましたが、とてつもなく時間がかかりました。 出来ればコンピューターに計算させたいと思い質問しました。

  • 【関数】エクセルでの時間の計算

    いつもお世話になっております。 エクセルでの時間の計算に関する質問です。 下記のような30行ぐらいの表があり、A,B,C,D列は手打ち、E,F,G列は関数が入力されています。 この場合D2は空白ですが、両方に15ずつ入力されている場合もあります。  A  B  C D    E     F        G 8:00 8:30 30 _ =(B2-A2)*24 =(C2+D2)/60 =IF(E2=F2,"〇","×") 結果、判定をしたいG列が〇になったり×になったりしますが、それがなぜなのか教えてください。

  • エクセル2007の計算について

    エクセル2007の計算についてですが、A列に100個データがあり、B列とC列にそれぞれ1個データがあるとします。そこで、D列のD1にA1*B1-C1の計算結果を表示させました。次に、D2以下も同様の計算をするために、D1のセルを選択して、矢印無しの十字キーを下に伸ばしてD2にA2*B1-C1、D3にA3*B1-C1・・・、D100にA100*B1-C1の結果を表示させようとすると、100個分の計算結果は表示できるのですが、D2はA2*B2-C2、D3はA3*B3-C3・・・というように、B列とC列も一つずつ下がって計算されてしまいます。この場合、B列とC列には1個しかデータがない(B1に一個、C1に一個)ため、D2以下の計算結果は0になります。B列とC列を下げずに、A列のデータだけ下げて連続計算するにはどうすればよろしいでしょうか。

  • エクセル(時間計算)教えてください

    エクセルの時間計算を教えてください 8:00以下の入力なら、8:00とでてほしくて、8:00以上の入力ならその時間がでるようにしたいのです。 (労働時間のセルB2~B5に実際の労働時間を入力すると、所定時間セルC2~C5にでるようにしたい) IFかと思うのですが、時間だとうまくいかなくて。。。 教えてください。宜しくお願いします。         A     B        C 1           労働時間  所定時間 2      Aさん  8:00     8:00 3      Bさん  6:00     8:00 4      Cさん     8:10     8:10 5      Dさん     12:30     12:30

  • 簡単そうで難しい計算

    簡単そうで難しい計算 A1に3 A2に4 A3に5 A4に7、B1に6 B2に7 B3に12 B4に13 B5に16、C1に1 C2に6 C3に7 C4に8 C5に9、D1に12 D2に13 D3に14 D4に20、E1に13 E2に15 E3に16の数値が入力されています。それぞれ列の少ない数値からA+B+C+D+Eの加算合計値を表示できないでしょうか?自分で調べてみたのですが順列で組み合わせの数値を出す計算式はあったのですが、その組み合わせの加算値を出す方法はわかりませんでした。 合計値と共に3+6+1+12+13 3+6+1+12+15 のように何を組み合わせたかも知りたいです。 グループ内の数値の組み合わせ点数を知りたいので、この様なものが必要になってしまい安易に考えていたのですが、私では手に負えません。 どうぞよろしくお願い申し上げます。

  • エクセル2007でのIF関数と時間の計算

    A1,B1,C1,D1に時間をh:mmで入力します。 E1セルに次の答えを返したいのですが、数式をどうすればいいでしょうか。 もし、A1とB1の合計が、0:00(ゼロ時間)を超えるときは、その合計時間を もし、C1とD1の合計が、0:00(ゼロ時間)を超えるときは、その合計時間を E1セルに表示する。 なお、A1からD1に何も入力しないときは、E1も空白にしたいです。 また、「A1 または B1」に時間データが入力された場合は、「C1またはD1」には時間データへの入力はありません。 同様に、「C1またはD1」に時間データが入力された場合は、「A1またはB1」には時間データへの入力はないという形式の表です。

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

専門家に質問してみよう