• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで複数条件を満たし残高を計算する関数)

Excelで複数条件を満たし残高を計算する関数

このQ&Aのポイント
  • Excelの表に記載されたデータから、一致する条件を満たすデータを抽出し、仕入から販売を引いた残高を計算する関数を作成したいです。
  • この関数を使えば、手作業で残高を計算する必要がなくなります。
  • 2000行のデータを効率的に処理できるため、大量のデータでも問題ありません。

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

B列とC列の値は対応しているように見えますが、もし違うなら以下のような数式になります. =IF(COUNTIF($B$2:B2,B2)=1,SUMPRODUCT(($B$2:$B$2000=B2)*($C$2:$C$20=C2)*($D$2:$D$2000="仕入")*$E$2:$E$2000)-SUMPRODUCT(($B$2:$B$2000=B2)*($C$2:$C$2000=C2)*($D$2:$D$2000="販売")*$E$2:$E$2000),"") B列とC列の値が対応しているなら以下のような数式で表示できます。 =IF(COUNTIF($B$2:B2,B2)=1,SUMPRODUCT(($B$2:$B$2000=B2)*($D$2:$D$2000="仕入")*$E$2:$E$2000)-SUMPRODUCT(($B$2:$B$2000=B2)*($D$2:$D$2000="販売")*$E$2:$E$2000),"")

momosuke111
質問者

お礼

素早い回答ありがとうございました。 実際の表にこちらの関数を入れ込んだところだいぶ近い結果を得ることができました。 ただ実際の表がもうちょっと複雑なので修正しているところなのですが うまく正しい結果が出ません(泣) 私の質問の仕方がいけなかったのかもしれないので 再度実際の表にもっと近い状態にして質問させていただきます。 このたびはありがとうございました。

その他の回答 (5)

回答No.6

#2です 計算負荷が気になるようでしたら、もう一工夫です =IF(D2="販売",0, IF(SUMPRODUCT(($B$2:$B2=B2)*($C$2:$C2=C2))<>1,0, SUMPRODUCT((B2:$B$2000=B2)*(C2:$C$2000=C2)*(D2:$D$2000={"仕入","販売"})*{1,-1}*E2:$E$2000))) 下へオートフィル、「販売」の数にもよりますが、負荷は半分以下になると思います。 2000行で試験し、当方では2秒足らずの計算が1秒足らずになりました。 OFFSET関数はSUMPRODUCT関数より凶悪です。 計算に関係のないセルに入力したり、削除するだけで10秒近く待たされます。 kagakusukiさん ぜひ、試験してみてください。 検索キーワードは 「揮発性関数」 INDIRECT関数もその部類入ります。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答番号:ANo.4です。  もし、B列とC列の値は対応していて、且つB列の値が同じ値となっている複数の行の中には、仕入が必ず一回しか現れないと決まっている場合には、次の方法が使用可能になります。  F2セルに次の数式を入力してから、F2セルをコピーして、F列の他のセルに貼り付けて下さい。 =IF(AND($D1="仕入",SUMIF($B:$B,$B1,$E:$E)<$E1*2),$E1*2-SUMIF($B:$B,$B1,$E:$E),"-")

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

>SUMPRODUCT関数などを使いますとパソコンの動きが重くなります。 と仰る方がいますので、SUMPRODUCT関数を使用した割には計算負荷が多少軽くなる数式を紹介させて頂きます。  データが入力されている最も下の行番号と、仕入れの商品Noが最初に現れる行番号に応じて、計算処理を行う範囲が自動調整されますので、表が2000行以上ある場合にも対応します。 ¥- の表記部分は0として F2セルに次の数式を入力してから、F2セルをコピーして、F列の他のセルに貼り付けて下さい。 =IF(COUNTIF($A2:$E2,"")>0,"",IF($D2="仕入",SUMPRODUCT((OFFSET($B$1,MATCH($B2,$B:$B,0)-1,,MATCH(9^9,$B:$B)-MATCH($B2,$B:$B,0)+1)=$B2)*(OFFSET($C$1,MATCH($B2,$B:$B,0)-1,,MATCH(9^9,$B:$B)-MATCH($B2,$B:$B,0)+1)=$C2)*OFFSET($E$1,MATCH($B2,$B:$B,0)-1,,MATCH(9^9,$B:$B)-MATCH($B2,$B:$B,0)+1)*(1-2*(OFFSET($D$1,MATCH($B2,$B:$B,0)-1,,MATCH(9^9,$B:$B)-MATCH($B2,$B:$B,0)+1)<>"仕入"))),"-"))

momosuke111
質問者

お礼

とても早い回答ありがとうございました。 実際の表に合わせて細かく関数を修正しながら入力してみたのですが うまく結果が出ませんでした。 私の質問の仕方が悪かったので再度実際の表に近い状態にして質問させていただこうと思います。回答いただいたのに申し訳ありません。。。 ありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

SUMPRODUCT関数などを使いますとパソコンの動きが重くなります。 作業列などを使って対応するのがよいでしょう。 例えばデータは2行目から下方にあるとしてH2セルには次の式を入力して下方にオートフィルドラッグします。 =B2&C2&D2 答えのF列にはF2セルに次の式を入力して下方にオートフィルドラッグします。 =IF(OR(B2="",D2="販売",COUNTIF(H$2:H2,H2)>1,SUMIF(H:H,B2&C2&"仕入",E:E)-SUMIF(H:H,B2&C2&"販売",E:E)=0),"",SUMIF(H:H,B2&C2&"仕入",E:E)-SUMIF(H:H,B2&C2&"販売",E:E))

momosuke111
質問者

お礼

とても早い回答ありがとうございました。 実際の表に合わせて細かく関数を修正しながら入力してみたのですが うまく結果が出ませんでした。 私の質問の仕方が悪かったので再度実際の表に近い状態にして質問させていただこうと思います。回答いただいたのに申し訳ありません。。。 ありがとうございました。

回答No.2

¥- の表記部分は0として F2セルに =IF(SUMPRODUCT(($B$2:$B2=B2)*($C$2:$C2=C2))<>1,0, SUMPRODUCT((B2:$B$2000=B2)*(C2:$C$2000=C2)*(D2:$D$2000={"仕入","販売"})*{1,-1}*E2:$E$2000))

momosuke111
質問者

お礼

とても早い回答ありがとうございました。 実際の表が仕入/販売以外にもあったりして 細かく関数を修正しながら入力してみたのですが うまく結果が出ませんでした。 私の質問の仕方が悪かったので再度実際の表に近い状態にして質問させていただこうと思います。 ありがとうございました。

関連するQ&A