- ベストアンサー
エクセルの計算式について
- エクセルの計算式について教えて下さい。表の値を計算するための式や条件式について詳しく説明します。
- また、計算結果を利用してh列の値を求める方法についても解説します。
- さらに、x1列の条件式の改善方法についてもお伝えします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
不要なSやBを表示させない様にする方法を考えるのに苦労しましたが、どうにか御希望の動作をさせる様にする事が出来たかと思います。 まず、A列~F列(「date」欄、「a」欄、「b」欄、「c」欄、「d」欄、「e」欄)に関しましては、回答No.4の所で回答させて頂いた内容から変更は御座いません。 そして、G2(x1の値を表示させる列の2行目)セルには次の数式を入力して下さい。 =IF(AND(ISNUMBER($F2),$F2>=100),IF(IF(COUNTIF(G$1:G1,"S"),COUNTIF(INDEX($H:$H,MATCH("S",$G:$G,0)):$H1,"B")<COUNTIF(G$1:G1,"S"),FALSE),"","S"),"") 次に、H2(x2の値を表示させる列の2行目)セルには次の数式を入力して下さい。 =IF(AND(ISNUMBER($F2),$F2<=-10),IF(IF(COUNTIF(H$1:H1,"B"),COUNTIF(INDEX($G:$G,MATCH("B",$H:$H,0)):$G1,"S")<COUNTIF(H$1:H1,"B"),FALSE),"","B"),"") 次に、I2(fの値を表示させる列の2行目)セルには次の数式を入力して下さい。 =IF(OR($G2="S",$H2="B"),IF(COUNTIF($G3:INDEX($H:$H,ROWS(I:I)),INDEX({"S","B"},MATCH($G2&$H2,{"B","S"},0))),INDEX($F:$F,MATCH("S",$G2:INDEX($G:$G,ROWS(I:I)),0)+ROW()-1)-INDEX($F:$F,MATCH("B",$H2:INDEX($H:$H,ROWS(I:I)),0)+ROW()-1),""),"") 次に、D2~I2の範囲を纏めてコピーして、同じ列範囲の3行目以下に貼り付けて下さい。 以上ですが、これまでのやり取りの経過を考えますと、途中で条件が変わってしまう事が御座いましたし、質問者様の御説明に不足が見られた事や、私が質問者様の御説明内容を勘違いしてしまっていた事なども御座いましたので、もしかしますと、質問者様が御希望されている事と、私が質問者様の希望内容であると思っている事との間には、未だに齟齬が残っている恐れもあるかも知れません。 ですから、念の為に、様々なパターンで表内に仮のデータを入力されてみて、動作が御希望通りのものとなっているのか否かを御確認願います。
その他の回答 (7)
- kagakusuki
- ベストアンサー率51% (2610/5101)
済みませんが、質問者様が仰る事には、未だ矛盾する点が残っておりますので、仰る条件のままでは実現させる術が御座いません。 >x2の欄がBとなり、それよりも下の行範囲での中で、初めてSが現れでいる場合に上記のような計算をします。Bが現れて、それが現れている行より下でもしSが現れなければ、何も計算は発生しません。 >→確かに、x1の条件式から1/5と1/6に連続してSが表示されます。しかし、1/5のSが重要で、1/6のSは重要ではありません。その後にBが表示された場合に、SとBとの差を計算しにいかなければならないので、見難い1/6((2)場面目以降のS表示)を表示しない方法があればと思い質問しました。 との事ですが、「x1の条件式から1/5と1/6に連続してSが表示されます。」という条件と「見難い1/6((2)場面目以降のS表示)を表示しない」という条件を同時に満たす事など不可能です。 1/6の行において、Sを表示しながら表示しないとは、一体どういう事なのでしょうか? 2番目以降のSを、表示させた方が良いのか、それとも表示させない方が良いのか、どちらなのかはっきりとして下さい。 それに、「見難い1/6((2)場面目以降のS表示)を表示しない」という条件と、「Bが現れて、それが現れている行より下でもしSが現れなければ、何も計算は発生しません。」という条件、及び「1/5のSが重要で、1/6のSは重要ではありません。その後にBが表示された場合に、SとBとの差を計算しにいかなければならない」という条件を同時に満たす事などもまた不可能です。 SとBのどちらも、表の中にはたった1回しか現れないという条件があるのですから、「1/5のSの後にBが表示された場合」には、「Bの後にはSが現れる事は無い」という事になりますから、「Bの下にSが無い場合には計算を何も行わない」のという事であれば、「SとBとの差を計算しにいかなければならない」という事にはならない筈です。 もしかしますと「SとBの双方が表中に現れている場合」においてのみ「『Sが現れている行の所のdの値』から『Bが現れている行の所のdの値』を差し引く」という計算を必ず行うという事ではないでしょうか? 只、その結果を表示させる行をどの行にするのかという事が不明確なままです。 Sよりも下にBが現れている場合には、Bの行の所にはfの値を表示しない事は何となく解りましたが、ここまでの質問者様の御説明内容からしますと、Sの方がBよりも下に現れる場合には、Sの行とBの行の双方にfの値を表示させなければならないと読み取る事も出来ます。 何れにしましても、SとBのどちらも、表の中にはたった1回しか現れないという条件があるのですから、fの値はたった1つしかない事になりますので、たった1箇所の位置が決まっているセルにfの値を1つだけ表示させるだけで済む事で、表示させる行をSやBが現れている行に合わせる必要など無い筈です。
お礼
kagakusuki様 ご指摘ありがとうございます。言葉足らずですみません。以下に再度ご説明致します。 x1のSとx2のBは、x1やx2を表示させる元になる変数から何度も表示されます。Sが連続して表示されても下の行にBが表示された場合には、最初のSとBとの差を計算します。ですから、2番目以降のSは意味をなさない(Bとの差を求める為の計算対象にならない)ことになります。 それで、Sが表示されてまた直ぐに下の行にSが表示されて対象にならないのでSを表示しない方法があるならば、見辛いということもあるので質問させて頂きました。しかし、表示を消すという事よりも上記の計算がなされる事が目的なので、2番目以降のSの表示がされても計算がなされるならばそれでも構いません。 また、記載した表は全体の表の一部です。変数次第でSやBは何度も表示されます。1度切りという訳ではありません。分かり難くてすみませんでした。 下線以下にご指摘の件をまとめて回答いたします。 --------------------------------------------------------------------------------------------------- ・もしかしますと「SとBの双方が表中に現れている場合」においてのみ「『Sが現れている行の所のdの値』から『Bが現れている行の所のdの値』を差し引く」という計算を必ず行うという事ではないでしょうか? →若干修正してご説明しますと、SとBは何度も現れます。前述したとおりです。ご指摘された計算はその通りです。 ・ 只、その結果を表示させる行をどの行にするのかという事が不明確なままです。 Sよりも下にBが現れている場合には、Bの行の所にはfの値を表示しない事は何となく解りましたが、ここまでの質問者様の御説明内容からしますと、Sの方がBよりも下に現れる場合には、Sの行とBの行の双方にfの値を表示させなければならないと読み取る事も出来ます。 →結果を表示させる行や列の指定を失念してました。すみません。結果を現す行や列は空いてる箇所にしますので大きな問題はございません。 推測された形で双方に結果を表示しなくてはならない訳ではありません。 ・何れにしましても、SとBのどちらも、表の中にはたった1回しか現れないという条件があるのですから、fの値はたった1つしかない事になりますので、たった1箇所の位置が決まっているセルにfの値を1つだけ表示させるだけで済む事で、表示させる行をSやBが現れている行に合わせる必要など無い筈です。 →前述しましたとおり、表の中に1回しか現れないという訳ではありません。最初のSが表示されて次にBが出るとその組み合わせで計算し、このBと次に現れるSでまた計算をして、表には何度も表示されてくるので計算を繰り返していきます。 以上となりますが、説明になってますでしょうか? よろしくご教示お願いします。
- kagakusuki
- ベストアンサー率51% (2610/5101)
不明な点や矛盾する点が多々御座います。 >(1)x1列には、例えばe列の値が100以上ならばSを表示しますので、表のように連続してSが表示されます。それを、最初にSが表示されたら、次のSが表示されないようにする方法があればご教示下さい。(ex,1/5と1/6は連続してe列の値が100以上なのでSが表示されます。 との事ですが、御質問文中では >x1列は、e列が10以上ならばSを表示する条件式で値を出しています。 となっております。 Sを表示する条件として正しいのは「e列の値が10以上」と「e列の値が100以上」のどちらなのでしょうか? 又、 >最初にSが表示されたら、次のSが表示されないようにする方法があればご教示下さい。 となっている以上、1/5にSが表示されれば、それ以降の行にはSが表示されてはいけない筈で、当然、1/6にSが表示されてはならない筈です。 それにも関わらず、 >1/5と1/6は連続してe列の値が100以上なのでSが表示されます。 と書かれておられるのは何故なのでしょうか? >(2)(1)と同様に、x2にはBが表示されます。例えば、e列の値が-10以下ならばBと表示されるとしているので、(1)と同様に連続して表示されます。これも、(1)と同様に最初に表示されたら連続して表示されない方法をご教示下さい。 との事ですが、御質問文中では >x2列は、0以下ならばBを表示する条件式で値を出しています。 となっております。 Bを表示する条件として正しいのは「e列の値が0以下」と「e列の値が-10以下」のどちらなのでしょうか? >(3)f列は、例えば、1/5にSが表示されて、1/11にBが表示された場合には、1/5のd列の値から1/11のd列の値を引き、逆に1/11にはx2にBが表示されて1/12にはx1にSが表示されていますので、1/12のd列の値から1/11のd列の値を引いてf列に表示させる方法をご教示下さい。 との事ですが、(1)の条件において、 >最初にSが表示されたら、次のSが表示されないようにする方法があればご教示下さい。 となっていて、1/5にSが表示されている以上、1/12にSが表示されてはならない筈ですから、 >逆に1/11にはx2にBが表示されて1/12にはx1にSが表示されていますので、1/12のd列の値から1/11のd列の値を引いてf列に表示させる という事にはならない筈です。 それと、x2の欄がBとなっている場合における、fの欄に値を表示させる条件に関する御説明も不足しております。 fの欄に値を表示させる条件として正しいのは、以下の3つの条件の内のどれなのでしょうか? ●x2の欄がBとなっている場合には、「x2の欄がBとなっている行」の1つ下の行の所のx1の欄がSとなっている場合にのみ、1つ下の行のd欄の値から、「x2の欄がBとなっている行」のd欄の値を差し引いた値を、fの欄に表示させる様にし、それ以外の場合、即ち、Sが現れている行と「x2の欄がBとなっている行」の間が1行以上隔たっている場合や、「x2の欄がBとなっている行」よりも下の行範囲の中にはSが現れている行が無い場合には、fの欄には何も表示しない。 ●x2の欄がBとなっている場合には、「x2の欄がBとなっている行」よりも下の行範囲の中で、初めてSが現れている行のd欄の値から、「x2の欄がBとなっている行」のd欄の値を差し引いた値を、fの欄に表示させる様にし、もし、「x2の欄がBとなっている行」よりも下の行範囲の中にはSが現れている行が無い場合には、fの欄には何も表示しない。 ●x2の欄がBとなっている場合で、尚且つ、「x2の欄がBとなっている行」よりも下の行範囲の中にSが現れている行がある場合には、Sが何行目に現れているのかという事には関係なく、「x2の欄がBとなっている行」の1つ下の行のd欄の値から、「x2の欄がBとなっている行」のd欄の値を差し引いた値を、fの欄に表示させる様にし、もし、x2の欄がBとなっている場合で、尚且つ、「x2の欄がBとなっている行」よりも下の行範囲の中にはSが現れている行が無い場合には、fの欄には何も表示しない。 上記の不明な点や矛盾点に関して、御説明願います。
補足
kagakusuki様 ご指摘ありがとうございます。分かり難くて申し訳ありませんでした。 以下に補足させて頂きます。 (1)>x1列は、e列が10以上ならばSを表示する条件式で値を出しています。 となっております。 Sを表示する条件として正しいのは「e列の値が10以上」と「e列の値が100以上」のどちらなのでしょうか? →すみません。これはe列の値が100以上です。 (2)>(2)(1)と同様に、x2にはBが表示されます。例えば、e列の値が-10以下ならばBと表示されるとしているので、(1)と同様に連続して表示されます。これも、(1)と同様に最初に表示されたら連続して表示されない方法をご教示下さい。 との事ですが、御質問文中では >x2列は、0以下ならばBを表示する条件式で値を出しています。 となっております。 Bを表示する条件として正しいのは「e列の値が0以下」と「e列の値が-10以下」のどちらなのでしょうか? →これもすみません。e列の値が-10以下です。 (3)>最初にSが表示されたら、次のSが表示されないようにする方法があればご教示下さい。 となっている以上、1/5にSが表示されれば、それ以降の行にはSが表示されてはいけない筈で、当然、1/6にSが表示されてはならない筈です。 それにも関わらず、 >1/5と1/6は連続してe列の値が100以上なのでSが表示されます。 と書かれておられるのは何故なのでしょうか? →確かに、x1の条件式から1/5と1/6に連続してSが表示されます。しかし、1/5のSが重要で、1/6のSは重要ではありません。その後にBが表示された場合に、SとBとの差を計算しにいかなければならないので、見難い1/6((2)場面目以降のS表示)を表示しない方法があればと思い質問しました。 (4)>逆に1/11にはx2にBが表示されて1/12にはx1にSが表示されていますので、1/12のd列の値から1/11のd列の値を引いてf列に表示させる という事にはならない筈です。 それと、x2の欄がBとなっている場合における、fの欄に値を表示させる条件に関する御説明も不足しております。 fの欄に値を表示させる条件として正しいのは、以下の3つの条件の内のどれなのでしょうか? →●x2の欄がBとなっている場合には、「x2の欄がBとなっている行」よりも下の行範囲の中で、初めてSが現れている行のd欄の値から、「x2の欄がBとなっている行」のd欄の値を差し引いた値を、fの欄に表示させる様にし、もし、「x2の欄がBとなっている行」よりも下の行範囲の中にはSが現れている行が無い場合には、fの欄には何も表示しない。 2番目の●です。 x2の欄がBとなり、それよりも下の行範囲での中で、初めてSが現れでいる場合に上記のような計算をします。Bが現れて、それが現れている行より下でもしSが現れなければ、何も計算は発生しません。 すみません。上記で説明補足になりますでしょうか? よろしくご教示お願いします。
- kagakusuki
- ベストアンサー率51% (2610/5101)
- kagakusuki
- ベストアンサー率51% (2610/5101)
>e列は前日のeと当日のeの差を表示しています。 との事ですが、その御説明の通りだとしますと、 「当日のeの値」=「当日のeの値」-「前日のeの値」 という事になりますが、それでは左辺と右辺に共に「当日のeの値」がありますから、 「前日のeの値」=「当日のeの値」-「当日のeの値」=0 という事になってしまいます。 ですから、御質問文中で示された例の通りにはなりません。 もしかしますと、「e列は前日のeと当日のeの差を表示しています。」というのは間違いで、「e列は1つ上の行のaの値と、同じ行のaの値eの差を表示しています。」という事ではないでしょうか? いずれにしましても、2000/1/11の場合には、前日のデータは存在していないのですから、2000/1/11の行の所にeのデータが表示されているのはおかしいと思います。 同様に、2000/1/21の場合には、翌日のデータは存在していないのですから、x1がSとなっているのにもかかわらず、2000/1/11の行の所にhのデータが表示されているのはおかしいと思います。 それから、 >x1とx2でSが表示された場合には、下記の表のa列1/12の18620から1/21の18760を引き、b列の1/21の1618から1654を引き、それぞれの解を足します。 との事ですが、1/12のhデータを求める際に、何故1/21のデータが関係して来るのかという事が何も説明されておりません。 例えば、もし今後データが追加されて行った際に、例えば1/25の所でSが現れた場合においても、「1/25のa列の値から1/21のa列の値を引き、1/21のb列の値から1/25のb列の値を引き、それぞれの解を足す」ようにしなければならないのでしょうか? もしかしますと、Sが現れた時のhの値を求める際には、1/21の値を用いると限ってはおらず、単に1番下の行の値を用いるという事なのでしょうか? いずれにしましても、 >下記の表のa列1/12の18620から1/21の18760を引き、b列の1/21の1618から1654を引き、それぞれの解を足します。 という計算を行った結果は、-176になる筈で、御質問欄に書かれている例に有る様な70000などという値にはなりません。 又、1/18と1/19の所でも、eの値は10を上回っているのにもかかわらず、x1がSとなっていないのは何故なのでしょうか? この様に、質問者様の御説明内容と、例示された表に示されている値との間には、幾つもの矛盾がある様ですから、正しい計算方法と、正しい結果が記述された例を御教え願います。 因みに、御説明にある方法になるべく従う様にして、計算式を組んだ結果の例を下の添付画像において上げさせて頂きました。(尚、eの欄に関しては「e列は1つ上の行のaの値と、同じ行のaの値の差」を表示させる様にしております) もし、質問者様が御利用になられているサイトにおいて、添付画像が表示されていない場合には、下記のURLのページを御覧下さい。 【参考URL】 質問No.8498805 エクセルの計算式について 【OKWave】 http://okwave.jp/qa/q8498805.html 尚、この添付画像の様な表を作成する方法は以下の通りです。 まず、D2(cの値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF(COUNT($B2,$C2)=2,$B2/$C2,"") 次に、E2(dの値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF(COUNT($B2,$C2)=2,$B2-$C2*10,"") 次に、F2(eの値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF(COUNT($E1,$E2)=2,$E2-$E1,"") 次に、G2(x1の値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF(AND(ISNUMBER($F2),$F2>=10,COUNTIF(G$1:G1,"S")=0),"S","") 次に、H2(x2の値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF(AND(ISNUMBER($F2),$F2<=0),"B","") 次に、I2(hの値を表示させる列の2行目)セルに次の数式を入力して下さい。 =IF($H2="B",IF(COUNT($B2:$C3)=4,$B3-$B2+$C2-$C3,""),IF($G2="S",$B2-INDEX($B:$B,MATCH(9E+307,$A:$A))+INDEX($C:$C,MATCH(9E+307,$A:$A))-$C2,"")) 次に、D2~I2の範囲を纏めてコピーして、同じ列範囲の3行目以下に貼り付けて下さい。 次に、1行目の所にdate~hの項目名を入力して下さい。 後は、A列(日付を入力する列)~C列(bの値を入力する列)に各データを入力しますと、D列~I列に結果が表示されます。
お礼
kagakusuki様、又他の皆様、分かり難い説明で申し訳ありませんでした。ご指摘ありがとうございます。 kagakusuki様、分かり難い中でいろいろとご教示頂きありがとうございます。もう一度、説明させて頂きますので、よろしくご教示の程お願いします。 表は以下の通りです。シュミレーションの為に、x1とx2だけを変数にします。x1とx2は変数なので、それぞれ任意に変えていきます。x1の値は、x1列にSを表示させる条件です。x2の値は、x2列にBを表示させる条件です。 以下の表では、x1=100,x2=-10としていますので、x1列にはSが表示され、x2列にはBが表示されています。 a列とb列は日々出てきますので、それを記録するだけです。 c列は、a/b=cで計算されます。d列は、a-(bx10)=eです。e列は、当日のdから前日のdを引いて求めます(ex,2010-1800=210、2000/1/5)。 ご教示頂きたいのは、 (1)x1列には、例えばe列の値が100以上ならばSを表示しますので、表のように連続してSが表示されます。それを、最初にSが表示されたら、次のSが表示されないようにする方法があればご教示下さい。(ex,1/5と1/6は連続してe列の値が100以上なのでSが表示されます。 (2)(1)と同様に、x2にはBが表示されます。例えば、e列の値が-10以下ならばBと表示されるとしているので、(1)と同様に連続して表示されます。これも、(1)と同様に最初に表示されたら連続して表示されない方法をご教示下さい。 (3)f列は、例えば、1/5にSが表示されて、1/11にBが表示された場合には、1/5のd列の値から1/11のd列の値を引き、逆に1/11にはx2にBが表示されて1/12にはx1にSが表示されていますので、1/12のd列の値から1/11のd列の値を引いてf列に表示させる方法をご教示下さい。 皆様、よろしくご教示の程お願いします。 date a b c d e x1 x2 f 2000/1/4 18990 1719.0 11.05 1800 2000/1/5 18380 1637.0 11.23 2010 210 S 2000/1/6 17900 1575.0 11.37 2150 140 S 2000/1/7 18170 1597.0 11.38 2200 50 2000/1/11 18830 1682.0 11.20 2010 -190 B 2000/1/12 18620 1654.0 11.26 2080 70 S 2000/1/13 18920 1673.0 11.31 2190 110 S
- bunjii
- ベストアンサー率43% (3589/8249)
提示されているデータの切れ目が分かりませんので検証が困難です。 dateとaとbは説明文から空白で区切ってみましたがc、d、e、x1、x2、hについては区切り位置が分かりません。 補足しないとアドバイスが出来ないと思います。 date a b c dex1x2 h 2000/1/11 18830 1682 .011.202010-190B 2000/1/12 18620 1654. 011.26208070S70,000
- bin-chan
- ベストアンサー率33% (1403/4213)
> e列は前日のeと当日のeの差を表示しています。 当日のEはおかしくない? ×1は列G、x2は列H? かじょう書きにしたら定義が伝りやすいですよ。
- kamikami30
- ベストアンサー率24% (812/3335)
基本中の基本 というより、さてこれからExcel学びましょうか。 という人の疑問に思います。 Excel 入門 と、検索した結果のサイトをまずは見てみましょう。 目的はわかりませんが、今後もExcelを使うつもりなら、最低限調べて学ぶ方法を知らないと、永遠に使えるようにならないと思いますので、参考にしてみてください。
お礼
貴重なご意見ありがとうございます。 わざわざお時間割いてご指摘して頂き。
お礼
kagakusuki様 お時間掛けて作成して頂き、誠にありがとうございました。心から感謝してます。 計算式を試す為にコピー&ペーストで貼り付けてみたところ、私のシートでエラーメッセージが出て来て今検証できていない状況です。私は、MSオフィスではなく、openoffice Calcを使用しています。 勿論、エクセルと計算式の作成方法が若干違うところがあるので、そこは修正していつも通りしてみたのですが、「パラメータリストにエラー」、「関数のパラメータが無効です。たとえば、数値の代わりにテキストを使用したとか、セル参照の代わりにドメイン参照を使用したなどです」とのメッセージがG,H,I列の行に現れ、I列ではFALSEのメッセージも出ています。 現在修正しようとしていますが、ちょっと原因を掴みかねています。もう少しお時間下さい。検証しています。 ありがとうございます。
補足
kagakusuki様 これまでご教示頂きありがとうございました。教えて頂きました計算式をコピーして検証しようとしましたが、何故かエラーメッセージが出きて検証出来ませんでした。添付された画像からは計算式は間違いないと思います。 エラーメッセージの修復を済ませないと検証も出来ないのすが、この掲載も長引かす訳にもいかないので、一旦質問はこれで終了させて頂きたいと思います。 私の質問の不味さにもご丁寧に回答して頂きありがとうございました。とても助かりました。 また、他の回答者の皆様、ご指摘ご教示ありがとうございました。また、機会ありましたら、よろしくお願いします。