• ベストアンサー

エクセル関数で、リストのグループ別分割と集計

行いたいことは、添付データの通り、sheet1に元リストがあります。それをグループ別にsheet2~4に分割します。分割されたリストは注文番号が一致した場合、数量おうなを合計し、一行に集約します。但し、注文番号が一致しても、拡販対象は行を分けます。sheet1のリストを更新すれば、前述の処理を自動で行い、分割したリストも更新できる様、sheet2~4の各セルに設定する関数をご教授ください。マクロでできるのでしょうが、後でマクロの知識がない人も修正ができるよう、あえて関数で作成したいと思います。色々試みましたが私の力不足です。ご教授いただきますようお願いします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 関数で!がご希望だというコトなので・・・ 一例です。 ↓の画像で説明すると左側が「元リスト」Sheetで右側がSheet2にしています。 まず「元リスト」Sheetに作業用の列を設けます。 作業列G3セルに =C3&E3 という数式を入れオートフィルでずぃ~~~!っと下へ、これでもか!というくらいコピーしておきます。 次にSheet2以降の操作は全て同じですので、Sheet2を開き → Shiftキーを押しながら最後のSheet見出しをクリック! これでSheet2以降が作業グループ化されましたので全てのSheetに同じ数式が入ります。 Sheet2にも作業列を設けA3セルに =IF(AND(元リスト!D3=$B$1,COUNTIF(元リスト!$G$3:元リスト!G3,元リスト!G3)=1),ROW(),"") という数式を入れオートフィルでこれもずぃ~~~!っと下へコピー! B3セルに =IF(COUNT($A:$A)<ROW(A1),"",INDEX(元リスト!A:A,SMALL($A:$A,ROW(A1)))&"") として列方向にF3セルまでオートフィルでコピー! G列だけは数式が替わります。 G3セルに =IF(B3="","",SUMIF(元リスト!G:G,D3&F3,元リスト!F:F)) 最後にB3~G3セルを範囲指定 → G3セルのフィルハンドルで下へずぃ~~~!っとコピー! これで各SheetのB2セルに グループ名を入力すると画像のような感じになります。 ※ 作業列が目障りであれば非表示にしておきます。 質問にあるようにVBAの方が簡単だと思いますが、関数で!ということですので こんな感じではどうでしょうか?m(__)m

takosu40
質問者

お礼

tom04さん、ご回答有り難うございます。早速、私が添付していた質問用のファイル(データ)で検証をさせていただきました。その結果、元リストの7行目と10行目の内容は、グループが違う(7行目→3Gr、10行目→2Gr)だけで、客先名・注文番号は同じですが、この場合Grが違うので、7行目はSheet4へ、10行目はSheet3へリストアップされるべきですが、Sheet4のリスト(3Gr)で数量が合計され、Sheet3のリスト(2Gr)にはリストアップされない状況でした。いずれにしろ概ね希望する動きでしたので、入力されている関数の意味を理解し、改善策を考えてみたいと思います。本当に有り難うございました。

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

その他の回答 (2)

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

関数式が複雑になりそうなので作業列を作って対応します。 お示しの表がシート1のA列からF列目出で2行目の項目名が3行目から下方にデータが入力されているとします。 G3セルには次の式を入力して下方にドラッグコピーします。 =D3&C3&E3 H1セルからJ1セルにはD列で使われているのと同じグループ名を入力します。H1セルには1Gr,I1セルには2Gr,J1セルには3Grのように入力します。 H3セルには次の式を入力してJ3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(AND($D3=H$1,COUNTIF($G$3:$G3,$G3)=1),MAX(H$2:H2)+1,"") そこでお求めのグループごとの表ですがシート2からシート4に表示させることにして、初めにCtrlキーを押しながらこれら3つのシート名をシート見出しでシート2からクリックしていきます。それによって3つのシートは同じ作業グループが形成されます。 そこでシート2のA1セルにはグループ名を入力するためのセルとして1Grと入力します。 A2セルからF2セルにかけてはシート1と同じ項目名を入力します。 A3セルには次の式を入力したのちにF3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF($A$1="","",IF(ROW(A1)>MAX(INDEX(Sheet1!$H$1:$J$10000,3,MATCH($A$1,Sheet1!$H$1:$J$1,0)):INDEX(Sheet1!$H$1:$J$10000,10000,MATCH($A$1,Sheet1!$H$1:$J$1,0))),"",IF(COLUMN(A1)<6,INDEX(Sheet1!$A:$F,MATCH(ROW(A1),INDEX(Sheet1!$H:$J,1,MATCH($A$1,Sheet1!$H$1:$J$1,0)):INDEX(Sheet1!$H:$J,10000,MATCH($A$1,Sheet1!$H$1:$J$1,0)),0),COLUMN(A1)),IF(COLUMN(A1)=6,SUMIF(Sheet1!$G:$G,IF($E3=0,$D3&$C3,$D3&$C3&$E3),Sheet1!$F:$F),"")))) これで1Grのデータが表示されますね。 その後はシート1を選択することで作業グループを解除します。 シート3のA1セルに3Grと入力することで関連のデータが表示されますね。シート4でもA1セルに3Grと入力すればよいでしょう。 なお、シート2からシート4のE列ですがデータがない場合には0が表示されています。この0の表示を無くすためにはE列を選択したのちに右クリックして「セルの書式設定」から「表示形式」で「ユーザー定義」を選び ;; を入力すればよいでしょう。

takosu40
質問者

お礼

KURUMITOさん回答ありがとうございます。 早速検証させていただきます。ただ、折角回答をいただき申し訳ないのですが、最初にtom04さんが回答してくださった内容を検証し、本ちゃんのリストに適用できるようになりましたので、ベストアンサーはtom04さんにたいと思います。 KURUMITOさんの回答も検証させていただき、スキルアップに利用させていただきます。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です! お礼欄の >Sheet4のリスト(3Gr)で数量が合計され、Sheet3のリスト(2Gr)にはリストアップされない状況でした。 に関してですが・・・ 各SheetのB1セルにはそのSheetに抽出したい「グループ名」が入力されているでしょうか? 各Sheetとも、B1セルデータを参照してそのSheetに表示するようにしていますので 前回の数式は他の間違いはあっても、「元リスト」のD列(グループ)だけには ちゃんと振り分けられ、他のグループがそのSheetに表示されることはないと思います。 他の原因だったらごめんなさいね。m(_ _)m

takosu40
質問者

お礼

昨日、tom04さんが回答してくださった関数を、意味を理解するべく、教本で調べました。おかげさまで、本ちゃんのリストに使用することができます。又、今まで使ったことのない関数も理解することができました。 本当に助かりました。感謝です。

takosu40
質問者

補足

tom04さん その後私の添付した質問用ファイルで検証した結果です。 シート1(元リスト)の作業列に  =C3&E3 を =C3&E3&D3 としました。 こうすることで、元リストの注文番号と拡販対象は一致するが、Grが違う際に、元リストの下方にある案件は、シート2以降(Gr別リスト)の作業列関数   =IF(AND(元リスト!D3=$B$1,COUNTIF(元リスト!$G$3:元リスト!G3,元リスト!G3)=1),ROW(),"")  のCOUNTIFでの戻り値が2になり、結果ANDの戻り値が0になることにより行番号がブランクになる事を修正。 さらに、シート2以降(Gr別リスト)の数量を戻り値とするセルに入力されている関数   =IF(B3="","",SUMIF(元リスト!G:G,D3&F3,元リスト!F:F)) の中の D3&F3 を D3&F3&E3 に修正することでOKとなりました。 ただし、シート2以降の、B3からF3までオートフィルする関数の中の最後の部分後の &”” がよく理解できませんでした。 

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

関連するQ&A

  • Excel 条件付集計(Excel2002)

    おそらく出来ると思うのですが どうしても思いつきません。 顧客番号  日付   合計個数 001    2004/2/5  ○個 002    2004/3/8  ○個 003    2004/4/1  ○個 と言うデータがあるシート1(顧客リストのような物)と、 注文番号  顧客番号  日付   個数 A001    003    2004/1/1   1 A002    001    2004/1/3   1 A003    001    2004/2/8   2 A004    002    2004/3/10  2 A005    001    2004/3/18  3 と言うデータが入ったシート2(注文リストのような物)があるとします。 そこで顧客番号で検索して、 「シート1の日付よりあとの注文」 の個数を合計して、シート1の合計個数のところに表示する。 と言うシステムが欲しいです。(わかりにくくてすみません) つまり上の例で言うと シート1の001の合計個数には シート2の001のデータで2004年2月5日以降の個数だけを合計して、 「5個」と表示されて欲しいのです。 多分関数で行けると思うのですが、 無理でしたらマクロでも構いません。 お判りになられる方がいましたらぜひよろしくお願いします。

  • エクセル関数

    お世話になります データシートから 集計シートに集計させる関数あれば関数をお教えください *フォーマットが決められているためPVT等は使用できません データシート1 ID|管理番号|使用者番号|数量|日付 01|12E22100|12 |1 |2008/01/01 02|12345678|01 |5 |2008/01/01 03|12E22100|12 |1 |2008/01/01 04|12Y22100|12 |1 |2008/01/01 05|001234T7|015 |4 |2008/01/01 06|12E22100|12 |1 |2008/01/01 集計シート2.xls 管理番号|01|2|3|4|12|015| 12E22100| | | |3 |  | 001234T7| | | | |4 | 12345678|5 | | | | | 上記が結果です 管理番号に対して使用者番号ごとに合計数量を出したいのですが かのうですか? わかるかたよろしくお願いします

  • エクセル関数について

    いつもお世話になります。 ”管理”と”リスト”というシートがあります。 ”管理”シートは A1    B1    C1・・・・・ 番号   名前   住所・・・・ と、情報が管理してあります。 ”リスト”シートのB3に番号を入力するセルを作りB11に =IF($B$3="","",VLOOKUP($B$3,注文管理!$A$3:$AE$9880,31)) という関数を入れて、”管理”シートの該当セルに記入があるなら B11に返すようにしています。B11に答えが返った場合、D4に「★備考あり★」と返したいのですが、 =IF(B11>1,"★備考あり★",IF(B11<1,"")) の関数を使うと、もともとB11には関数が入っているのでずっと「★備考あり★」のままです。 これを、B11に答えが返ってきた時のみ「★備考あり★」とする関数はありますか?

  • エクセル関数につきまして

    皆様の知識を頂きたく、投稿させて頂きます。 EXCELのVLOOKUP関数なのですが、2個の条件から一致する項目を選ぶ事は出来ないのでしょうか? たとえばですが、 ≪参照シート≫ A   B   C   コード 数量  日付 → タイトル行 1   1    1/1 2   1    1/1 1   2    1/2 2   2    1/2 ≪入力シート≫ A   B   C  ~ コード 1/1  1/2  ~ 1 2 といった感じで、入力シートと参照シートのコードと日付が一致するデータを取り出したいのです。 VLOOKUPを重ねて使用したりとか、HLOOKUPを使用したり等考えたのですが、うまくいきませんでした。 現在使用しているのは、Microsoft Office EXCEL2003になります。 どなたかご教授下さい。 よろしくお願い致します。

  • エクセルで集計したいのですが・・・

    関数は少しわかりますが、マクロは分かりません。 今回は集計シートの集計数字を元シートに入力して、更に元シートにない項目を元シートの項目行に項目名を入れて集計数字を入れたいのです。 ただ、集計だけであれば「sumif」関数を使えば出来るのですが、元シートにない項目名を探し出して入力する方法がわかりません。教えてください。よろしくお願いします。 元シート  A  B       1 aaa 2 bbb 3 ccc 4 ddd 5 6 7 集計シート 項目 数量 1 bbb 1 2 aaa 2 3 ddd 1 4 eee 1 5 fff 1 6 ccc 2

  • エクセルの関数について教えてください。

    エクセルで1つのデータがあります。 1つめのシートには、   1.コード番号   2.名称   3.郵便番号   4.住所   5.電話番号 のそれぞれのデータが入力されています。 2つめのシートには、   1.コード番号   2.数量 が入力されています。 エクセルの関数を使い、2つめのシートのコード番号の横に、1つめのシートの『名称』や『郵便番号』、『住所』を表示させたいのですが、どういうふうに設定すればよいかわかりません。 『データベース』という関数を使うことはわかるのですが、その先、どう指定すればよいのかわからないのです。 エクセルにくわしい方、教えてください。 よろしくお願いいたします。

  • Excelで日付別の集計を取るやり方

    実際の内容とは違いますが例えとして、 添付の画像のように、A列に日付が並んでいます。注文が入り次第下に追記していくので日にちはランダムです。 B列に商品名がそれぞれ並びます。 ここからが質問で、 上記シートの隣に集計用シートを作りたいと思っています。 集計用シートでは、日付が1列にカレンダーのように並んでいて、そこに商品の数を拾って出したいと思っています。 縦軸にカレンダー(日付) 横軸にA,B,C,D それぞれ日毎の数量をカウントするようにしたいです。 どのような関数、操作になりますでしょうか? 初級者のため、易しく教えていただければ幸いです。 よろしくお願いします。

  • エクセルでシートをまたぐ関数について

    こんばんは、仕事で効率化を図るため関数が必要となったのですが、 シート間をまたぐ関数が分かりません。どなたか教えてください。 例えば、    A      B      C     1 機械番号  担当者番号   日付 _________________    2  AA-05     H-6    6/2 3  ES-12     R-9    5/31 4  LT-32     G-118   6/8 5  NB-45     H-6    6/5 6  AA-05     R-9     5/25 7  NB-45     G-118    5/5  <Sheet1>                    という表がSheet1にはあって    A      B      C     1 担当者番号  機械番号    日付 _________________    2  H-6      AA-05    6/2 3          NB-45    6/5 4  5  R-9      ES-12    5/31 6         AA-05    5/25 7 8  G-118     LT-32    6/8 9          NB-45    5/5   <Sheet2>                      という風な集約用の表 Sheet1に入力したデータをSheet2で指定の項目にしたがって集約させたいと考えています。 Sheet1に機械番号・担当者番号・日付を入力しておきます。 Sheet2で担当者番号を入力すると、機械番号と日付が出るようにしたいのですが、どなたか教えてださい。

  • EXCELのリストのデーターを別の書類にリンク

    どこに質問していいのかわからなくてこのカテゴリにしました。 EXCELのリストのデータ(A列に番号、B列に部品名、C列に型式、D列に発注日、E列に発注先、F列にメーカー、G列は備考)を、別の書類(注文書)にリンクさせたいです。現状、Sheet1に上記データの部品リスト。sheet2に注文書(データ部は空欄)。注文書を作る時、Sheet1のE列に部品ごとに発注先を手入力→同じ発注先でソートをかける→発注日を入力→その部品データ(番号、部品名など)をコピーしてsheet2の注文書のデータ空欄部に貼り付け。注文書の列の並び(A列に番号…)はSheet1と同じ。注文書の宛名欄のセルには、E列の発注先と同じなので、=(E列の)セル番号 にしている。量が少なければこの方法で十分なのですが、1000点くらい注文したい時が大変です。元の部品リスト(Excel)がユニットごとに分かれてるので、Excelリストが60枚ある。 大企業ならこんな発注システムではないと思います。事務作業は極力簡単にしたいのです。アドバイスを是非是非お願い致します。

  • エクセルどの関数を使えばいいの??

    エクセルでA、BC、D,Eの各商品の注文リストを作成しています。シートAには商品Aを購入したお店と店名コードが記入されています。シートBには300店舗すべての店名コードの一覧があり、シートAで購入したお店のコードからシートBの一覧リストに ○ をつけて 購入リストを作成したいです。どのような 関数を使えばよいか教えてください。関数でできるのかどうかも 疑問です。ネストを使えばできるでしょうか

専門家に質問してみよう