Excel VBAでのデータ集計方法とは?

このQ&Aのポイント
  • Excel VBAを使用して1つのファイルにある2つのシートのデータを集計する方法について教えてください。
  • 具体的には、元データシートと集計結果シートがあり、マクロを実行して元データの情報を集計し、集計結果シートに反映する方法が知りたいです。
  • さらに、集計結果シートでは、品名ごとに並べ替えて、同じ品名が複数ある場合はバージョンの新しいものが上になるようにしたいです。
回答を見る
  • ベストアンサー

Excel VBA 集計方法

1つのファイルに2つのシートがあります。 集計結果を反映するシートと元データのシートで別れています。 <元データシート> 品番 品名    バージョン  数量 11 ABC Soft      2000 4 22 XYS Beta 2003 3 23 HU22 hyoukaban 2000 4 45 298 Software 1998 7 22 XYS Beta 2003 11 25 XYS Beta 2008 3 <集計結果シート> 品名 バージョン 数量 XYS Beta 2008 3 XYS Beta 2003 14 298 Software 1998 7 ABC Soft 2000 4 HU22 hyoukaban 2000 4 ※表がずれていると思います。 バージョンは4桁の数字です。 マクロを実行して、自動的に元データの情報を集計して 集計結果シートに反映したいと思います。 (1)品番は一意の番号です (2)同じ品名ごとに並べて、同じ品名が見つかった場合はバージョンの新しいものが上になるようにしたいです。 (3)品番は集計結果シートには反映していません。 集計結果シートのような結果にするには、どのようなマクロを書けば いいのか悩んでいます。 サンプルコード等参考になるものがございましたら、お教えください。

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

  • ベストアンサー
  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.7

#1です。 最終版です。 Sub test3()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim Ws3 As Worksheet   Dim mySt As Worksheet   Dim myLastRow As Long   Dim i As Long   Dim myStName As String   Dim flg As Boolean      Application.ScreenUpdating = False      Set Ws1 = Worksheets("元データ")   Set Ws2 = Worksheets("集計結果")      myStName = "作業シート"   For Each mySt In Worksheets     If mySt.Name = myStName Then flg = True   Next mySt   If flg = False Then     ActiveWorkbook.Worksheets.Add.Name = myStName   Else     Worksheets(myStName).Cells.Clear   End If   Set Ws3 = Worksheets(myStName)   With Ws3     Ws1.Range("A1").CurrentRegion.Copy Destination:=.Range("A1")     .Range("A1").CurrentRegion.Sort _         Key1:=.Range("B2"), Order1:=xlAscending, _         Key2:=.Range("C2"), Order2:=xlDescending        myLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row        For i = myLastRow To 2 Step -1       If .Cells(i, "A").Value = .Cells(i - 1, "A").Value Then          .Cells(i - 1, "D").Value = .Cells(i - 1, "D").Value _                       + .Cells(i, "D").Value         .Rows(i).Delete       End If     Next i        .Columns(1).Delete     .Range("A1").CurrentRegion.Copy Destination:=Ws2.Range("A2")     Application.DisplayAlerts = False     .Delete     Application.DisplayAlerts = True   End With      Application.ScreenUpdating = True   Set Ws1 = Nothing   Set Ws2 = Nothing   Set Ws3 = Nothing End Sub Excel VBAの入門者がどのように勉強を進めていけばよいのか? ということですが、 私自身、初心者で勉強中の身ですからアドバイスできる立場ではありませんが、 私が参考にした書籍やページを紹介します。 <書籍> 1)「世界でいちばん簡単なExcelVBAのe本 最新版      ―ExcelVBAの基本と考え方がわかる本 」    道用 大介 (著)   出版社: 秀和システム     「カウンタ変数」や「代入」といった言葉をはじめて聞く方には、  この本から入ることを勧めます。   他の言語でプログラムを書いたことのある方には向きません。 2)「かんたんプログラミング Excel2002 VBA     基礎編、応用編、関数コントロール編」   大村 あつし (著)   出版社: 技術評論社    他の本では解説されないような事が細かく解説されています。    私は、2002年版を読みましたが、現在2007年版が出てます。 3)「Excel VBA実践技&上級技大全―アッと驚く達人の技」     C&R研究所 (著)  出版社:ナツメ社    本当に実践的な内容が満載です。    上級というと敷居が高く感じますが、そんなことはありません。    簡潔で理解しやすいコードばかりです。    最初に手にする本ではありませんが、1)や2)で基本が理解    できるようになれば、もっておいても損は無いと思います。    残念ながら、2007年版は出てません。 ネットで参考になるページとしては、例えば以下など 1)http://www.moug.net/ 2)http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/index.html 3)http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html

hyogara777
質問者

お礼

最終版の投稿ありがとうございました。ご提供いただきました内容をもとに自分でアレンジしたいと思います。また、今後勉強をするうえでの参考情報をご紹介頂き助かります。

その他の回答 (6)

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.6

#1です。 もう一つ訂正です。 元データには見出し行が無いので、     .Range("A1").CurrentRegion.Sort _         Key1:=.Range("B2"), Order1:=xlAscending, _         Key2:=.Range("C2"), Order2:=xlDescending, _         Header:=xlYes は誤りです。 以下に修正してください。     .Range("A1").CurrentRegion.Sort _         Key1:=.Range("B2"), Order1:=xlAscending, _         Key2:=.Range("C2"), Order2:=xlDescending 随分と変更だらけになってしまいました。 見出し行の自動入力の必要性についての返答を待って、 最終版を再投稿したいと思います。

hyogara777
質問者

補足

修正分と質問の回答を頂きましてありがとうございました。 分りやすい回答に感謝いたします。 <集計結果シート>の見出し行の自動入力は不要でございます。 1行目に手動で入力します。 2行目から集計結果が自動で反映される内容でお願いします。 最終版の投稿をお待ちしております。 最終版の投稿時に、 Excel VBAの入門者がどのように勉強を進めていけばよいのかアドバイスを頂ければ助かります。 本でもWebサイトでも何でもよいです。 よろしくお願いいたします。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.5

#1です。 (1) 作業が完了したら削除するのは「作業シート」という名前のシートです。 <集計結果シート>の1行目は既に入力済みということでしたので、 1行目はいじらずに、2行目以降に集計結果を貼り付けています。 もし、1行目の見出し行も自動で入力したいのであれば、可能ですよ。 (2) For i = myLastRow To 3 Step -1の意味ですが、 まず、myLastRowという変数は、 myLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row で計算しているのですが、これは、A列の最終行です。 手作業で言うと、 エクセルのA列の最終セル上で「Ctrl」+「↑」 を行って移動するセルの行番号を取得しています。 次に、本題の For i = myLastRow To 3 Step -1の意味ですが、 上記の最終行番号から3まで一つずつ数を減じながら繰り返す という意味です。 ここまで書いて今気づいたのですが、 元データのシートには見出し行が無いので、 For i = myLastRow To 3 Step -1 は間違いで、正しくは For i = myLastRow To 2 Step -1 となります。 もし、<集計結果シート>の見出し行も自動で入力したければ 連絡ください。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.4

#1です。 作り直しました。 作業用のシートを用いて「並べ替え」、「集計」の作業を行い、 <集計結果シート>の2行目以降に反映させます。 作った作業用シートは、削除して終了します。 Sub test2()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim Ws3 As Worksheet   Dim mySt As Worksheet   Dim myLastRow As Long   Dim i As Long   Dim myStName As String   Dim flg As Boolean      Application.ScreenUpdating = False      Set Ws1 = Worksheets("元データ")   Set Ws2 = Worksheets("集計結果")      myStName = "作業シート"   For Each mySt In Worksheets     If mySt.Name = myStName Then flg = True   Next mySt   If flg = False Then     ActiveWorkbook.Worksheets.Add.Name = myStName   Else     Worksheets(myStName).Cells.Clear   End If   Set Ws3 = Worksheets(myStName)   With Ws3     Ws1.Range("A1").CurrentRegion.Copy Destination:=.Range("A1")     .Range("A1").CurrentRegion.Sort _         Key1:=.Range("B2"), Order1:=xlAscending, _         Key2:=.Range("C2"), Order2:=xlDescending, _         Header:=xlYes        myLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row        For i = myLastRow To 3 Step -1       If .Cells(i, "A").Value = .Cells(i - 1, "A").Value Then          .Cells(i - 1, "D").Value = .Cells(i - 1, "D").Value _                       + .Cells(i, "D").Value         .Rows(i).Delete       End If     Next i        .Columns(1).Delete     .Range("A1").CurrentRegion.Copy Destination:=Ws2.Range("A2")     Application.DisplayAlerts = False     .Delete     Application.DisplayAlerts = True   End With      Application.ScreenUpdating = True   Set Ws1 = Nothing   Set Ws2 = Nothing   Set Ws3 = Nothing End Sub

hyogara777
質問者

補足

毎回すばやい回答ありがとうございます。 2点確認させてください。 (1)<集計結果シート>の2行目以降に反映させます。 2行目に下記項目が反映されるため、作業が完了したら 削除する意味でよろしいでしょうか。 品名 バージョン 数量 この作業は避けることは不可能なのでしょうか。 (2)下記の構文が本やWebを見ても、理解できません。 どのような処理をされているのでしょうか。 For i = myLastRow To 3 Step -1 以上 何度も質問させて頂き申し訳ございません。お教えください。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.3

#1です。 補足に対する回答です。 <元データシート>の1行目のA列 B列 C列 D列に それぞれ、以下の見出しを付けておいてください。 品番 品名 バージョン 数量 <集計結果シート>に見出しはあっても無くても構いません。 <集計結果シート>は一度すべてクリアしてから、 <元データシート>の見出しをコピーして利用するようにしています。 前回のコードのままで動作します。 もし、<元データシート>に見出し行を付けることができない のであれば、別案を考えます。

hyogara777
質問者

補足

早速のご回答ありがとうございます。 可能であれば、下記の流れを希望します。 <元データシート>に見出し行はつけません。 <集計結果シート>は一度すべてクリアしません。 集計結果シートで下記3項目はすでに記載しています。 A列 B列 C列 品名 バージョン 数量 例えばこの3項目が1行目に記載されているとすると 集計結果を2行目から反映するようにしたいと思います。 何度も申し訳ございません。 別案がございましたら、お教えください。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

[Step1] 元データを列:列選択し,データメニューの(2007ではデータタブの)ピボットテーブルレポートを開始する 品名およびバージョンを行に配置,数量をデータに配置して作成する 「データの個数/数量」をWクリックして集計の方法を合計に変更する 品名▼およびバージョン▼をそれぞれプルダウンし,(空白)を表示除外する 品名▼をWクリックして集計を無しにする バージョン▼をWクリックしてから詳細で自動並べ替えオプションをバージョンの降順に設定する。 [Step2] >マクロを実行して の代わりにピボットテーブルツールバーの「更新!」ボタンをクリックして最新のデータに更新する。 [Step3] 作成済みピボットテーブルレポートを「更新!」するマクロを自動記録マクロでマクロにして使っても,勿論構いません しかし最初からピボットテーブルレポートをいちいち作り直すマクロを用意する必要は,通常はありません。 [Step4] 状況によって「リスト形式」の出力が必要な場合,マクロを利用してピボットテーブルレポートの結果を第三のシートに転記し,行フィールド由来の空白セルを「一つ上の内容で埋め」させても良いでしょう。

hyogara777
質問者

お礼

ピボットテーブルでの手順を詳細にお教え頂きましてありがとうございます。ピボットテーブルも活用できるようにしたいと思います。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.1

こんばんは。 一例です。 なお、数量の合計は、同じ品番の数量を合計しています。 Sub test1()   Dim Ws1 As Worksheet   Dim Ws2 As Worksheet   Dim myLastRow As Long   Dim i As Long      Set Ws1 = Worksheets("元データ")   Set Ws2 = Worksheets("集計結果")   With Ws2     .Cells.Clear        Ws1.Range("A1").CurrentRegion.Copy Destination:=.Range("A1")     .Range("A1").CurrentRegion.Sort _         Key1:=.Range("B2"), Order1:=xlAscending, _         Key2:=.Range("C2"), Order2:=xlDescending, _         Header:=xlYes        myLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row        For i = myLastRow To 3 Step -1       If .Cells(i, "A").Value = .Cells(i - 1, "A").Value Then          .Cells(i - 1, "D").Value = .Cells(i - 1, "D").Value _                       + .Cells(i, "D").Value         .Rows(i).Delete       End If     Next i        .Columns(1).Delete   End With   Set Ws1 = Nothing   Set Ws2 = Nothing End Sub

hyogara777
質問者

補足

適切なサンプルありがとうございます。 大変助かりました。 1点追加で教えてください。 集計結果シートで下記3項目はすでに記載しています。 A列 B列 C列 品名 バージョン 数量 例えばこの3項目が1行目に記載されているとすると 集計結果を2行目から反映するようにしたいと思います。 何度も申し訳ございません。お教えください。

関連するQ&A

  • Excel VBA 集計方法

    1つのファイルに2つのシートがあります。 集計結果を反映するシートと元データのシートで別れています。 <元データシート> 品番 品名    バージョン  数量 11 ABC Soft      2000 4 22 XYS Beta 2003 3 23 HU22 hyoukaban 2000 4 45 298 Software 1998 7 22 XYS Beta 2003 11 25 XYS Beta 2008 3 27 XYS Beta 2008 6 <集計結果シート> 品名 バージョン 数量 XYS Beta 2008 3 XYS Beta 2003 14 298 Software 1998 7 ABC Soft 2000 4 HU22 hyoukaban 2000 4 ※表がずれていると思います。 バージョンは4桁の数字です。 マクロを実行して、自動的に元データの情報を集計して 集計結果シートに反映したいと思います。 (1)同じ品名ごとに並べて、同じ品名が見つかった場合はバージョンの新しいものが上になるようにしたいです。 (2)品番は集計結果シートには反映していません。 (3)同じ品名、バージョンで異なる品番がございます。 同じ品名、バージョンであれば品番が異なっても1つに集計することは可能でしょうか。 →(3)だけが理解できていません。(1)と(2)は解決済みです。

  • EXCELでの複数項目集計

    EXCELで複数項目での集計方法を教えてください。 品番/品名/数量 01/AB/20 01/AB/30 02/CD/40 02/CD/20 このようなデータで、数量を集計したいのですが、 品番で集計すると集計結果に「品番 集計」と表示されて 品名で集計すると「品名 集計」となります。 集計結果のみを表示させるので「品番/品名 集計」と いうように表示させたいのですができるのでしょうか? ちなみに品番と品名は必ずペアです。 宜しくお願いします。

  • Excel VBA 集計方法

    在庫状況にもとづいて、売上表の行を削除するマクロを組みたいと思います。(2つのシートに分かれています) <共通条件> お客様Noは一意です。 お客様No2以降は他のアカウントで別の品名が入っています。 <作業内容> お客様No2以降も同様に売上表シートの行を削除します。 お客様ごとに同じ品名で在庫状況シートの本数まで、売上表シートの在庫状況列の「No」の行を削除します。在庫状況シートの本数を超えると売上表シートの在庫状況列の「Yes」の行を削除します。 上記の作業はマクロで可能でしょうか。 下記に表を記載します。 <在庫状況>シート お客様No お客様名       品名 本数 在庫状況 1 はなまる商事 XYS Beta  5  Yes 2 3 4 5 <売上表>シート お客様No お客様名       品名 本数 在庫状況 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No 1 はなまる商事 XYS Beta 1 Yes <マクロ実行後の結果> お客様No お客様名 品名 本数 在庫状況 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 Yes 1 はなまる商事 XYS Beta 1 No ※表がずれていますが、品名はアルファベットです。

  • 集計方法を教えてください。

    複数シートのデータを集計用に作成したシートにデータをコピーしたい。 シート1(支店A)  2008/03/31 ノート 100  2008/04/20 乾電池 200 シート2(支店B)  2007/10/31 乾電池 200  2008/01/06 鉛筆  100 シート3(集計表) (品名) (営業所)(数量) (日付)  乾電池  支店A  200  2008/04/20       支店B  200  2007/10/31  鉛筆   支店B  100  2008/01/06  ノート  支店A  100  2008/03/31 ※集計表には、品名と営業所名のみが記載されているため「数量」と「日付」のみをコピーしたい よろしくお願いします。

  • ExcelのVBAで集計をしたいです。

    EXCELで、VBAを使用して元データのシートから、集計シートを作成したいです。 Sheet1 A B C D E F 1 品名 サイズ1 サイズ2 サイズ3 元のサイズ 売り上げた量 2 A 1 100 150 200 1000 50 3 B 2 100 200 100 1500 10 4 A 2 200 300 500 2000 100 5 A 1 150 150 100 1000 80 6 A 2 150 150 600 3000 100 Sheet2(集計用に新規作成されたシート:作成時は空シート) A B C D 1 品名 サイズ1 元のサイズ 売り上げた量の合計 2 A 1 1000 130 3 B 2 1500 10 4 A 2 2000 100 5 A 2 3000 100 元のサイズのものがどれだけ使用されて売れたのかを集計しようとしています。 ちなみにサイズ1は変更されません。 条件が複数個になるので、Sheet2の合計は、SUMPRODUCTを使用することになると思うのですが、 C列までの、品名、サイズ1、元サイズが重複しないように抽出するためには、 どのようにしたらよいのでしょうか?

  • EXCELでのデータ集計について

    EXCEL2007、XPを使用しています。 下記の様なデータが並んでいる時に、 項目ごとの集計を行いたいです。 A / B / C / D 倉庫 / メーカー / 品番 / 数量 東京 / テスト / test1 / 5 東京 / テスト / test2 / 3 東京 / テスト / test2 / 4 東京 / テスト / test3 / 1 東京 / テスト / test2 / 2 東京 / テスト / test4 / 4          ↓ 集計後、品番が同じものが並ばないように。 A / B / C メーカー / 品番 / 数量 テスト / test1 / 5 テスト / test2 / 9 テスト / test3 / 1 テスト / test4 / 4 SUMIFで数量を集計したのですが、 同じ品番と数量の行が並んでしまうのが都合悪いです。 良い手はありますでしょうか。 シートが別になっても構いませんが、 マクロの使用は極力避けたいです。 ご教授お願い致します。

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

    関数は少しわかりますが、マクロは分かりません。 今回は集計シートの集計数字を元シートに入力して、更に元シートにない項目を元シートの項目行に項目名を入れて集計数字を入れたいのです。 ただ、集計だけであれば「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

  • エクセルの集計

    エクセルでの集計(集計と呼べるか解りませんが)についてです。 A列に品番 A-1・A-2・A3・・・が入力されています。B列に品番の残数量 300・500・500・・・が入力されています。品番と残数量で1つの表になっています。 上記の表を基に、他のセルに使用数量を入力して行くと、使用した数量内の品番と数量が自動で集計され、使用数量の下や隣に表示される様にしたいのですがどの様な方法があるでしょうか? (例)C1に使用数量:500と入力すると指定したセル(C2~で品番と数量は別のセルに分けます)にA-1:300 / A-2:200 D1に500と入力すると指定したセル(D2~)にA-2:300 / A-3:200 と、表の上(下からの場合もあります)から使った分を引いて行かれ、集計され、表示したいのです。 宜しくお願いします。 補足 使用した数量と使用した内訳は同じシート内で別の表としています。入力した使用数量の中に、どの品番が何キロ使用されていて、その品番が無くなったら次の品番を何キロ使用したかを自動で集計したいのです。

  • エクセルで集計

    エクセルで集計 シート1:A列に日付2000行程度、B列に品名A,B,C,D…500種類程度、C列にその内容。日毎に行は増えていきま、同じ品名が何度も登場してきます。 シート2:ここに新しくシート1の集計をして、同じ品名の多い順に並べ替えてリストを作成したいと思います。 シート1に新しく行が増えると同時にシート2の集計に反映させたいのですが、いい方法はありますか?

  • エクセルでで○段ずつ集計する方法を教えてください。

    エクセルで伝票印刷をするため、3段づつ集計する方法がありましたら教えてください。 たとえば、下記のsheet1のDBをsheet2へ集計する感じです。宜しくお願いします。 sheet1(DB)    A      B    C    D     購入者   品名 数量  単価 1  ああ   かか  3  100円 2  ああ    きき  6  150円  3  ああ    くく  8  100円 4  ああ    けけ  3  250円 5  いい    きき  4  150円 6  いい    けけ  6  250円 7  うう    くく  8  100円 8  ええ    きき  6  150円 sheet2(sheet1を3段づつ集計)    A   B  C   D     購入者  品名 数量  単価 1  ああ    かか  3  100円 2        きき  6  150円  3        くく  8  100円 4  小計     17  2300円  5  ああ    けけ  3  250円 6 7 8  小計        3  250円 9  いい    きき  4  150円 10 いい    けけ  6  250円 ・  ・     ・  ・   ・ ・  ・     ・  ・   ・ ・  ・     ・  ・   ・

専門家に質問してみよう