• ベストアンサー

エクセル 複数行ある同一商品を1行にまとめるには?

同一内容が入力された複数行の合計を出す方法を教えてください。     エクセルの表でA列に商品名、B列に色の種類、C列~E列にサイズごとの個数がある、まったく同じ商品が、複数行にランダムに掲載されています。 A列、B列で同一の情報を持つ商品について、C列~E列のサイズごとの合計を出したいのです。 例)商品名、色、サイズ個数(C列:Sサイズ、D列:Mサイズ、E列:Lサイズの順です。) A1:Tシャツ B1:ホワイト C1:5 D1:4 E1:3   A2:Tシャツ B2:ブラック C2:3 D2:5 E2:5 A3: Tシャツ B2:ホワイト C3:3 D3:3 E3:2 A4: Tシャツ B2:ブラック C4:3 D4:2 E4:3 各商品が300行程あり、オートサムではやりきれません。 すべての各商品(A列、B列が一致するもの)を1行ごとにまとめたシートを作成するにはどうしたら良いでしょうか?

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

merlionXXです。 お書きになった質問の通り、関数で回答すれば、「質問の例が簡単すぎたようです」と言われ、再度VBAで回答すれば、「例は大変簡略化しておりまして、実際には~」とおっしゃる。 どうしてそんなに情報を小出しにするのかなあ? しかも新たに出された条件で「商品情報がA~Dまでが商品情報」?? A~Dまでが商品情報だからなんなんですか? A~Dまでがすべて一致することが必要なんですか?それとも別に何か違う条件があるのですか? 一応、A~Dまでが一致するもので集計するというコードです。 データがあるシート名はSheet1 サイズ別に個数をだすシート名はSheet2とします。 今後は、もう少し回答者のことも考えて、必要な情報は正しく、洩れなく、わかりやすく質問なさるようにお願いしますね。 Sub test02() Dim myDic As Object, ms As Object, ns As Object Dim c As Range, i As Integer, dta As String Set myDic = CreateObject("Scripting.Dictionary") Set ms = Sheets("Sheet1") Set ns = Sheets("Sheet2") For i = 4 To 8 For Each c In ms.Range(ms.Cells(1, "A"), ms.Cells(Rows.Count, "A").End(xlUp)) dta = c.Value & ":" & c.Offset(0, 1).Value & ":" & c.Offset(0, 2).Value & ":" & c.Offset(0, 3).Value If Not myDic.exists(dta) Then myDic.Add dta, c.Offset(0, i).Value Else myDic(dta) = myDic(dta) + c.Offset(0, i).Value End If Next c ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) ns.Cells(1, i + 1).Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) myDic.RemoveAll Next i ns.Columns("A:A").TextToColumns DataType:=xlDelimited, Destination:=Range("A1"), Other:=True, OtherChar:=":" Set myDic = Nothing Set ms = Nothing Set ns = Nothing End Sub

oki_yes
質問者

お礼

どうもありがとうございました。 こちらで解決できました。これから大変役に立ちそうです。 大変感謝しております。 また何度も大変申し訳ございませんでした。 オートサムくらいしか使えないのにも関わらず データを見れば自分で仕組みが分かるだろうなどと 思っていたものですから大変失礼いたしました。

その他の回答 (6)

  • sekkii
  • ベストアンサー率50% (13/26)
回答No.7

見当違いの返答でしたらごめんなさい。 たぶん 並べ替え→集計(excel2007だと小計) で ご希望に添えませんか? 並べ替えちゃいけなかったかな?

参考URL:
http://www.eurus.dti.ne.jp/~yoneyama/Excel/syukei.html
oki_yes
質問者

お礼

ありがとうございます。 集計をやってみたのですが、条件指定で躓きました。 今後この機能についても勉強させていただきます。 とても参考になりました。ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

No4で貼ったコードにコピーミスがあったので貼りなおします。 Sub test01() Dim myDic As Object, ms As Object, ns As Object Dim c As Range, i As Integer, dta As String Set myDic = CreateObject("Scripting.Dictionary") Set ms = Sheets("Sheet1") Set ns = Sheets("Sheet3") For i = 2 To 4 For Each c In ms.Range(ms.Cells(1, "A"), ms.Cells(Rows.Count, "A").End(xlUp)) dta = c.Value & ":" & c.Offset(0, 1).Value If Not myDic.exists(dta) Then myDic.Add dta, c.Offset(0, i).Value Else myDic(dta) = myDic(dta) + c.Offset(0, i).Value End If Next c ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) ns.Cells(1, i).Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) myDic.RemoveAll Next i ns.Columns("B:B").Insert Shift:=xlToRight ns.Columns("A:A").TextToColumns DataType:=xlDelimited, Destination:=Range("A1"), Other:=True, OtherChar:=":" Set myDic = Nothing Set ms = Nothing Set ns = Nothing End Sub

oki_yes
質問者

補足

どうもありがとうございます。 私があげた例では、これで完璧でした。 しかし、例は大変簡略化しておりまして、実際には列が I 列(9列)まであります。 そのうち、A~Dまでが商品情報、E~Iまでがサイズ別個数となります。 サイズはS~XLまであります。(例ではS~Lでした。) 返答を見ればアレンジできるだろうと思っていたのですが 私には高度すぎて、どこを直したらよいのかさっぱりわかりませんでした。 恐縮ですが、このような状況ですとどこを修正すれば良いでしょうか。 よろしくお願いいたします。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

No1で回答したmerlionXXです。 > A列とB列の組み合わせを拾い出すこと自体が大変困難で では、VBAでの方法です。 存在するすべての組み合わせおよび組み合わせごとのサイズ別の合計を求めます。 以下の手順でやってみてください。 データがあるシート名はSheet1 サイズ別に個数をだすシート名はSheet2とします。 ちがっている場合は下記コードで Set ms = Sheets("Sheet1") Set ns = Sheets("Sheet2") のところの ”” 内の名前を変更するか、エクセルの実際のシート名を変えるかどちらかをしてください。 1.AltキーとF11キーをいっしょに押して Visual Basic Editor を呼び出します。 2.Visual Basic Editor のメニューから挿入、標準モジュールで、出てきたコードウィンド(右側の白い広い部分)に下記のコード(SubからEnd Subまで)をコピーして貼り付けします。 3.また、Alt+F11キーでワークシートへもどります. 4.エクセルのメニューから、「ツール」、「マクロ」、「マクロ」で出てきたマクロ名(test01)を選択して実行します。 Sub test01() Dim myDic As Object, ms As Object, ns As Object Dim c As Range, i As Integer, dta As String Set myDic = CreateObject("Scripting.Dictionary") Set ms = Sheets("Sheet1") Set ns = Sheets("Sheet2") For i = 2 To 4 For Each c In ms.Range(ms.Cells(1, "A"), ms.Cells(Rows.Count, "A").End(xlUp)) dta = c.Value & ":" & c.Offset(0, 1).Value If Not myDic.exists(dta) Then myDic.Add dta, c.Offset(0, i).Value Else myDic(dta) = myDic(dta) + c.Offset(0, i).Value End If Next c ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) ns.Cells(1, i).Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) myDic.RemoveAll Next i ns.Columns("B:B").Insert Shift:=xlToRight ns.Columns("A:A").TextToColumns Destination:=Range("A1"), OtherChar:=":" Set myDic = Nothing Set ms = Nothing Set ns = Nothing End Sub

  • gyouda1114
  • ベストアンサー率37% (499/1320)
回答No.3

作業セルを使ってオートフィルタとSUBTOTAL関数で C列を挿入し、C2に =A3&"/"&B3 下方にオートフィル オートフィルタを設定し、C列で抽出 抽出したデータの合計を出す最下行に  =SUBTOTAL(9,D2:D5) で可視セルの合計が計算される。 ただし、「組み合わせが100通り」だと抽出は大変ですが! お試しを   オートフィルタ(データ抽出) http://www.eurus.dti.ne.jp/~yoneyama/Excel/filter.htm データベースやリストの集計はお任せ関数「SUBTOTAL」 これだけで11種類の集計が出来ちゃうよ^^ http://akubizzz.hp.infoseek.co.jp/sub91.html

oki_yes
質問者

お礼

どうもありがとうございました。解決いたしました。 今回は組み合わせが単純ではなかったため最終的に 商品情報が4列で124の組み合わせがありましたので この方法は最終的に使いませんでしたが今後の参考とさせていただきました。ありがとうございました。

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

こんばんは! 一例ですが・・・ A列の商品数とB列の色の数によって組み合わせの数がかなりの量になると考えられます。 しかしとりあえずオートフィルタなどで別Sheetにその組み合わせの数だけの表を作るしかないのではないでしょうか? Sheet1に元データがあり、オートフィルタで商品と色の組み合わせを表示させ 一つ一つSheet2にコピーします。 その後、↓の画像でいえば、Sheet2のC2セルに =SUMPRODUCT((Sheet1!$A$2:$A$10=Sheet2!$A2)*(Sheet1!$B$2:$B$10=Sheet2!$B2)*(Sheet1!C$2:C$10)) としてオートフィルでコピーしてみてください。 (※データは300行あるみたいなので数式の「10」のところをアレンジしてください。) 何とか数の合計は出来ると思います。 このSheet2の表を作るための質問のような感じもしますが・・・ この程度の回答しか出来ませんが、 的外れの回答なら読み流してください。m(__)m

oki_yes
質問者

お礼

どうもありがとうございました。解決いたしました。 今回は組み合わせが単純ではなかったため最終的に 商品情報が4列で124の組み合わせがありましたので この方法は最終的に使いませんでしたが今後の参考とさせていただきました。ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

300行までなら C列の合計は =SUMPRODUCT((A1:A300="Tシャツ")*(B1:B300="ホワイト")*C1:C300) D列の合計は =SUMPRODUCT((A1:A300="Tシャツ")*(B1:B300="ホワイト")*D1:D300) ででますよ。 ブラックはどこをなおせばいいかわかりますよね。

oki_yes
質問者

補足

ありがとうございます。 質問の例が簡単すぎたようです。 質問の補足になりますが、A列とB列に入っている項目が たくさんあり、自分でもA列の内容とB列の組み合わせが 何通りあるのかよくわからないくらいなのです。 300行に組み合わせが100通りあれば、 この式を100通り入力しなければならないので、これでは大変です。 また、こんなにきれいに並んでなく、色も聞き慣れない英語の名前が大変多く 商品名に対して色がそれぞれにあまりに違うため 拾い出すのも単純ではありません。 A列とB列の組み合わせを拾い出すこと自体が大変困難で この方法ですと見落としが生じかねません。 A列のTシャツというものを拾い出しなさいというようなものではなく A列とB列が同じ情報ならば、合計計算をしなさいと言ったようなものがあるとよいと思うのですが・・・。

関連するQ&A

  • Excel 複数行の同じような商品を1行目にまとめ

    同じような商品が入力された複数行を1行にまとめ合計を出す方法を教えてください。 エクセルの表でA列に商品名B列C列には金額、個数、似たような商品が、複数行にランダムに掲載されています。 A列には商品名(メーカー名や種類)の情報を持つ商品について 元データ A1:Panasonic      B1:1 C1:2 A2:パナソニック     B2:1 C2:2 A3: TOSHIBA       B3:2 C3:3 A4: 東芝 エアコン    B4:2 C4:3 A5: mitsubishi      B5:3 C5:4 A6: 三菱 エアコン B6:3 C6:4 A7: MITSUBISHI      B7:3 C7:4 完成データ A1:Panasonic,パナソニック        B1:2 C1:4 A2:TOSHIBA,東芝 エアコン         B2:4 C2:6 A3:mitsubishi,三菱 エアコン,MITSUBISHI B3:9 C2:12 条件としては、シート2のメーカー名の一覧を元に含まれていれば同じ内容として、 カンマ区切りで一行にまとめたいです。 わかる方教えて頂けないでしょうか。 Excelは2003です。

  • エクセルで列を複数行にしたいのですが

    注文表を商品ごとに集計したいのですが、商品名・数が列の入っています。これを縦にして集計しようと思っているのですが、列を行する方法を教えてください。 エクセルの表で列A・Bを共通にして列C・Dを次の行に、そして列E・Fを次の行にとしたいのですが、教えてください。 列A 列B   列C  列D 列E 列F 001 ○○会社 商品A 10  商品F 14 001 ○○会社 商品C 11  商品A 20 005 ××会社 商品D 32  商品C 25 これを 列A 列B   列C  列D 列E 列F 001 ○○会社 商品A 10  001 ○○会社 商品F 14  001 ○○会社 商品C 11  001 ○○会社 商品A 20  005 ××会社 商品D 32  005 ××会社 商品C 25 よろしくお願いいたします。

  • エクセルで表の一部、ゼロのみではない行を抜き出す

    お世話になります エクセルで次の様な表があるとします。        個数    項目(1)   項目(2)  項目(3) 商品A           10     10    20 商品B            5     10    15 商品C            4      5    6 個数の列は初期状態では空で必要に応じて入力するものとします。 この表の右には集計のための数式の入ったセルがあるとします。                                                              合計計算        個数    項目(1)   項目(2)  項目(3)      項目(1)合計             項目(2)合計               項目(3)合計 商品A           10     10    20      Aの個数×Aの項目(1)の数値     Aの個数個数×Aの項目(2)の数値   ・・・(略) 商品B            5     10    15      Bの個数×Bの項目(1)の数値     Bの個数個数×Bの項目(2)の数値    ・・・(略) 商品C            4      5    6      Cの個数×Cの項目(1)の数値     Cの個数個数×Cの項目(2)の数値   ・・・(略) ここで個数には0が入ることもあります。 そのときは計算された右側のセルにも当然0が入ります。 つまりこんな感じです。                                合計計算        個数    項目(1)   項目(2)  項目(3)    項目(1)合計   項目(2)合計   項目(3)合計 商品A     1     10     10    20       10         10         20 商品B     0      5     10    15         0          0         0       商品C     3      4      5    6         12        15        18 さてここでやりたいことがあります。 それは個数が0以外のものの結果のみを抽出するということです。 今回の場合は 項目(1)合計   項目(2)合計   項目(3)合計  10         10         20   12         15         18 というところだけを抜き出したいのです。 実際は行がもっと沢山あります。 オートフィルタを使って個数が0以外で抽出する、も考えましたが 最初のタイトル行が訳あって複数行に渡っているため使えません。 何か良い手だてはありますでしょうか?

  • エクセルで文字列から個数にする集計方法を教えてください。

    エクセルで文字列から個数にする集計方法を教えてください。 シート1に下記のような洋服のサイズ、カラーがあります。 行   A列  B列 1    7号 ブラック 2    9号 ブラック 3    9号 ブラック 4    7号 ホワイト 5    7号 ホワイト 6    7号 ホワイト 7    9号 ホワイト 8    9号 ホワイト 9    9号 ホワイト 10   9号 ホワイト シート2へこのように個数にしてそれぞれ集計したいのですが、 行 A列    B列     C列 1       ブラック   ホワイト 2  7号      1        3 3  9号      2        4 どの関数が使えば良いでしょうか? できれば簡単な関数で教えてください。 どうかよろしくお願いいたします。

  • エクセル関数の質問

    よろしくおねがいします。 以下のようなA列B列に数字が何行もあるのですが、 A列の数字(時間なのですが)を二つを別シートに記入すると A列の二つ分の期間を参照してB列の数字の合計や個数を計算したいのですが、 VLOOKでは期間分の値を計算できないので 何かいい方法はないでしょうか? A        B 1000      1 2000     -5 3000      8 4000      1 5000      3 6000      5 7000     -3 8000      2 9000      3 別シートにA列の数字を下記の例のよう二つに入力すると A列の期間を参照してB列の値を計算して B列に全合計 C列に+の合計 D列に-の合計 E列に+の個数 F列に-の個数 を表示させる。 <例1> A   B(全合計) C(+の合計) D(-の合計) E(+の個数) F(-の個数) 1000 5000  8        13        -5         4        1 <例2> A   B(全合計) C(+の合計) D(-の合計) E(+の個数) F(-の個数) 6000 9000  7        10        -3         3        1 のような感じで計算したいのですが わかりづらくてすいませんが、分かる方がいたらご教示お願います。

  • エクセル:未入力の行は合計を非表示にしたいのですが。

    未入力の行は合計を非表示にしたいのですが。教えていただけませんか? - A B C D E F(残高計)*Aは仕入でB~Eは売上個数です。 1 9 1 2 1 1 4(=A1-B1-C1-D1-E1)になっています。 2 8 1 2 1 1 7(=F1+A2-B2-C2-D2-E2)です。 3 - - - - - 7(G2をコピーすると未入力行には7が。。) 4 - - - - - 7(これを表示しない方法はありますか?) 5 - - - - - 7(すみません。教えてください。。。) 分かりにくいかもしれませんが、何卒、よろしくお願いもうしあげます♪♪。

  • エクセルでの簡単な集計について

     A B C D E F ・・・・W X 1 2 3 4 1の行に単価、2~4の行は個数です Xの列に単価*個数の合計を各行ごとに出したい。 なるべく簡単な式を教えてください。

  • エクセル 複数行にまたがっているデーターを一つの行

    以前に似たようなVBAの質問を元にさらにやりたいVBAがあるのですが、 (前の質問者のURL:http://okwave.jp/qa/q4955096.html)       A列  B列   C列   D列   E列 ~ R列 1行目  佐藤 北海道 りんご S 100 105 2行目  佐藤 北海道 ばなな M 100 105   3行目 伊藤  東京  いちご S 100 105 4行目  伊藤  東京  ばなな M 100 105 上記のようなデーターがあります。これを2行目と4行目を削除し下記のようにしたいのですが       A列  B列      C列      C列 1行目  佐藤 北海道  りんご,ばなな  S,M 2行目  伊藤  東京   いちご,ばなな  S,M A列とB列とE列~R列のデーターが同じでC列,D列,のデータが異なる場合、上記のように一行にまとめたいのです。関数やVBAで上記の処理を出来る方法がありますでしょうか。 

  • エクセルで、検索条件と合計範囲の異なる“カウント”

    職場でExcel2003を使っています。 こんなデータを集計する必要が出てきました。  A         B     C     D    E 1会社名     店舗名  商品A  商品B 商品C 2株式会社A  店舗a   0個    12個   13個 3株式会社A  店舗b   1個    12個   0個 4株式会社A  店舗c   0個    0個    0個 5株式会社B  店舗a   5個    12個   13個 6株式会社B  店舗b   0個    0個   13個 7株式会社B  店舗c   6個    12個   3個 8株式会社B  店舗d   0個    12個   14個 ↑この表のデータを、 A社    商品A取扱店舗数 商品B取扱店舗数 商品C取扱店舗数       商品A販売個数   商品B販売個数  商品C販売個数 B社   商品A取扱店舗数 商品B取扱店舗数 商品C取扱店舗数       商品A販売個数   商品B販売個数  商品C販売個数 C社… という表にしたいのですが、ココに入れる関数。 販売個数の方は簡単にいきました、sumif($A$1:$A$8,"会社名"、C$1:C$8)てやればよかったので。 が、取扱店舗数の方が、難問。 sumifだと、検索条件の範囲と、合計範囲って別に設定できるじゃないですか。 “A列で、A社て入っている行の、C列の数字を合計する” という設定が出来る。 ところが、販売店数となると…。 sumifと全く同じ要領で、 “A列で、A社と入っている行の、C列のデータ個数を数える” という作業を、したいんですが…countifでは「A列で、A社と入っている行の数を数える」のが精一杯。 A社    count(C$2:C$4) count(D$2:D$4) count(E$2:E$4)       商品A販売個数   商品B販売個数  商品C販売個数 B社    count(C$5:C$8) count(D$5:D$8) count(E$5:E$8)       商品A販売個数   商品B販売個数  商品C販売個数 C社… とする方法もありますが(上の表の店舗は増えたり減ったりしない予定なので)、最初が大変だし、sumifのように、関数一つで何とかならないだろうか、と…。 配列数式?DCOUNT関数?? すみません、どなたか、お知恵を下さい…。

  • Excelで、行の組み換えについて

    A列からG列までデータが入っているリストがあるのですが、 例えば、1行目から50行目までと、51行目から100行目までを交互に組み入れるには どのようにすればよいでしょうか。   A B C D E F G 1 2 3 ・ ・ ・ 51 52 53 ・ ・ ・ といったものを、   A B C D E F G 1 51 2 52 3 53 ・ ・ ・ のようにしたいのですが、一気に操作できる方法があれば 教えていただきたく、よろしくお願いいたします。

専門家に質問してみよう