- ベストアンサー
エクセルで二つの条件での合計値
こんにちわ。 関数でいろいろやってみているのですが、どうしてもうまくいきません。 シート1に一覧表があります。A列にコード番号(約500番)、B列に名前、C列に種類わけ(10種類・リストにしています)、D列に数字が入っています。これが約5000行あります。 これをシート2に、コード番号(A列)及び種類(C列)が一致するものの数字(D列)の合計を出した、自動更新される集計表を作りたいのです。 しかも、C列の種類わけしているものの中から、2つずつペアリングしての数字(D列)の合計を出したいのです。 ピボットテーブルやオートフィルターでひとつずつ出していってもいいのですが、次々と追加で行が増えていくので、その都度集計表を更新していくのもタイヘンだと思い、自動的に更新されるといいなと思っています。 説明不足なことがありましたら、返答します。 相当困っています。 どなたか助けてください。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
シート2には#5の回答のような表があるとして、セルC2に次の関数を入れてください。 =SUMIF(Sheet1!$F:$F,Sheet2!$A2&Sheet2!C$1,Sheet1!$D:$D) これをコピーしてC列からG列までのすべてのセルに貼り付けてください。 シート1のセルF2に次の関数を入れてください。 =A2&LEFT(C2,2) これをコピーしてデータの最下端まで貼り付けてください。もしデータ行が増えたら、追加貼り付けをしてください。 これで、シート2にご所望の表ができると思います。
その他の回答 (5)
- junjun2004
- ベストアンサー率28% (24/83)
まず、sheet1のC列が 「東京・新宿」・・・「東海・静岡」と入っているとしてやってみました。 集計表が下のようになればいいのですね? A B C D E ・・・ 1 コード 名前 東京 関東 東海 ・・・ 2 xx1 aaa 100 200 550 ・・・ 3 xx2 bbb 0 350 400 ・・・ B列にはvlookupで参照されているとのことなので、省略します。 それで、C列ですが、東京ではじまるデータを集計すればいいので、 sheet1から 「A列のコードが同じ」で 「C列の種類の最初の2文字がが集計表の1行目と同じ」場合の 「「D列の合計」をだせ!という配列数式を入れます。 {=SUM(IF(Sheet1!$A$2:$A$5000=$A2,IF(LEFTB(Sheet1!$C$2:$C$5000,4)=C$1,Sheet1!$D$2:$D$5000,0)))} (配列数式はShiftとCtrlを押しながらenterキーを押します。そうすると「{ }」で囲まれます。) A列を参照するものを$Aとして列を固定し、 C列を参照するものは$1として行を固定します。 それを集計表の集計したい部分にコピーすれば、OKです。 もしもsheet1の行が増えた場合は、 集計表の$5000を$6000とかに一気に置き換えることができます。 むしろ最初から多めにしておけばいいと思いますよ。 また、念のため計算チェックと入力ミスの発見のため? 確認欄をもうけることをおすすめします。 たて・よこそれぞれの合計と、配列数式で出した合計の数値が同じになるかどうか。 その場合、例として 東京の合計は {=SUM(IF(Sheet1!$A$2:$A$5000<>"",IF(LEFTB(Sheet1!$C$2:$C$5000,4)=C$1,Sheet1!$D$2:$D$5000,0)))} コード1の合計は {=SUM(IF(Sheet1!$A$2:$A$5000=$A2,Sheet1!$D$2:$D$5000,0))} ということになります。 もし、行や列をsumで出した合計が、上記数式の数値と違っている場合は、どこか空白のデータがあるということになります。 (全く空白のセルがないデータを使うと仮定しての間違い探しです)
お礼
ありがとうございます! おかげでできました!! 配列数式に関する知識がなかったのでわからなかったのですが、すごく便利ですね!! 本当にありがとうございました!!
- miwaki
- ベストアンサー率36% (14/38)
#1の回答関連 シート2のセルA1に"=シート1!A1&シート1!C1" シート2のセルB1に"=SUMIF(A:A,A1,シート1!D:D)" として、セルA1とセルB1をコピーしてシート1のデータ列の数だけ下に貼り付けしてください。するとシート2のB列に要望の合計値が出ます。 しかしこれだけだと次の2点の問題が残ります。 1.シート1の行の削除や追加があったとき、シート2の関数のコピー貼り付け直しをしなくてはならない。 2.シート1のA列のコード番号とC列の区分わけの組み合わせで同じものが、繰り返しシート2上に出てしまう。 この2点を解決するために、マクロが必要だと申しました。 この2点が許容できるなら、このように関数だけで処理できます。
補足
ありがとうございます! ・・・すごいですね!ここまでできるとはびっくりしました!! でも、どうやらマクロが必要なようです。 最終的には、コード番号順に並んでいる表に仕上げたいからです。 そして、 最初の質問内容にある >C列の種類わけしているものの中から、2つずつペアリングしての数字(D列)の合計を出したいのです。 これが私にはできませんでした。 たとえば、 「東京・新宿」「東京・八王子」「関東・さいたま」「関東・横浜」「関西・大阪」「関西・神戸」「九州・福岡」「九州・熊本」「東海・名古屋」「東海・静岡」 このように10種類の分別があります。 シート1の一覧表ではこの10種類を使用するのですが、集計表では「東京」「関東」「関西」「九州」「東海」この5種類で集計したいのです。 理想としては、集計表(シート2)では A列:コード番号 B列:名前(これはA列のコード番号にあわせてVLOOKUPを使用しています) C列に「東京」の合計値 D列に「関東」の合計値・・・ といった具合にできるといいな、と考えています。 なんとかなりますでしょうか? わがままなお願い、まことに申し訳ありませんが、よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
ご要望に近いところまでは下記行きつけます。 (例データ) Sheet3のA1:C7に コード1 コード2 コード3 a x 8 b y 2 c z 3 b y 4 a x 5 f t 6 Sheet4のA1:B2に コード1 コード2 a x を入れる。 D2セルに式=DSUM(Sheet3!$A$1:$C$70,Sheet3!C$1,A1:B2) C70はデータがない下の方の行を指定してもエラーが出ないようです。 結果は13と出ます。 これを組み合わせの数だけSheet4のA列B列に条件 をいれ、C列に関数式を入れれば合計がでます。 この方式の苦しいところは、見出し「コード1 コード2」を毎組み合わせ入れなくてはならないので1行おきになり困ることと、1行おきになるので式の複写が旨く行くかです。 Sheet4のA1:B4に コード1 コード2 a x コード1 コード2 b y としてD2をD4まで複写してみると 13 0 6 とD2とD4の結果は正しく出ます。 0はなんとか消せるでしょうが1行おきは間延びしてますね。 前から個人的に見出しは第1行を見て、条件はその各行を見るようにエクセル側が改めて欲しいと思ってますが、どうしようもない。
お礼
ありがとうございます。 1行おきってのは確かに痛いですね。 こちらでも、少し模索してみます。 ありがとうございます。
- junjun2004
- ベストアンサー率28% (24/83)
シート2に配列数式を入れれば簡単に出ると思いますが、 A列が500種類、C列が10種類ですか? 集計表も5000行ということでしょうか?
補足
ありがとうございます。 シート1が5000行あるのですが、 集計表は、コード別に整理したいと思っていますので、500行程度で考えています。 もう、どうしていいかわかりません。 よろしくお願いします。
- miwaki
- ベストアンサー率36% (14/38)
VBAマクロで実現できそうです。エクセル関数のみでなきゃ駄目なんですか。 シート1のデータが変わるごとに自動的にシート2が更新されるようにしたいなら、関数でなくてもシート1にchangeイベントで上記のマクロが起動するようにしておけば自動的に更新されます。
補足
ありがとうございます。 VBAマクロはいまいちよくわかってないだけなんです。 まったくダメというわけではないのですが、changeイベントもよくわからないんです。 もし、可能でしたらもう少し細かく教えていただけるとたいへんありがたいです。 よろしくお願いします。
お礼
ありがとうございます! #5よりも、最初にこちらのほうができました!! 私は、二つの条件を「&」でつなぐことで関数を簡単にすることができることを知らなかったのでとても参考になりました。 エクセルって奥が深いですね。 ご丁寧に教えていただきましてありがとうございました!!