• ベストアンサー

VBAについて質問です

添付されている画像のように表があり、部署別に品名が一致した場合、品名毎の数量を加算集計して『部署名』『品名』『型番』『集計結果の数量』をSheet2へ表示させたい場合、どのような記述を行えばよろしいでしょうか? ご回答宜しくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

ブログにも記述していますが、以下、使えそうなところを・・・・ 標準モジュールに以下を記述しておきます。 Public Sub GrpSums(rng1 As Range, rng2 As Range, rng3 As Range)   Dim dic As Object   Dim r As Range   Dim sS As String   Dim v As Variant   Dim iLoop As Long   Dim i As Long, j As Long   Const sDLM As String = "__"   iLoop = rng1.CurrentRegion.Rows.Count - 1   If (iLoop < 1) Then Exit Sub   If (rng3.Count <> 1) Then Exit Sub   Set dic = CreateObject("Scripting.Dictionary")   For i = 1 To iLoop     sS = ""     For Each r In rng1.Offset(i)       sS = sS & sDLM & r     Next     v = dic.Item(sS)     If (Not IsArray(v)) Then ReDim v(rng2.Count + 1)     j = 0     For Each r In rng2.Offset(i)       v(j) = v(j) + r       j = j + 1     Next     v(j) = v(j) + 1 ' 出現個数(後々使えるかも)     v(j + 1) = i  ' 見出しからの相対行(結果を表示する際のコピー元)     dic.Item(sS) = v   Next   With rng3     rng1.Copy .Offset(0, 0)     i = rng1.Count     For Each r In rng2       .Offset(, i) = r & "計"       i = i + 1     Next     i = 1     For Each v In dic.items       j = v(rng2.Count + 1)       rng1.Offset(j).Copy .Offset(i)       .Offset(i, rng1.Count).Resize(, rng2.Count) = v       i = i + 1     Next   End With   Set dic = Nothing End Sub 使い方) Call GrpSums(rng1 As Range, rng2 As Range, rng3 As Range) rng1:グループとしてみなす項目を指定 rng2:合計する項目を指定 rng3:結果を表示するところを指定 指定例) Call GrpSums(Range("B3:F3"), Range("H3:I3"), Range("B20"))  とか Call GrpSums(Range("B3,C3,E3,F3,H3"), Range("J3,L3"), Range("B20"))  とかとか 添付図であれば以下の様な雰囲気かも > 部署別に品名が一致 ということですが、「型番」もグループ条件に含めます Sheet2 をクリアしてから With Worksheets("Sheet1")   Call GrpSums(.Range("A1:C1"), .Range("D1"), Worksheets("Sheet2").Range("A1")) End With もし、「型番」をグループ条件から外す場合は、"A1:C1" を "A1:B1" とか "A1,B1" に・・・ その時には、結果の表示からも「型番」は消えます。 まず、rng1、rng2 で指定する項目の行は、同じでなくてはなりません。 rng1 で指定された CurrentRegion の範囲で Offset を用いてグループ、合計を処理していきます。 グループを管理する方法として、 ・全項目を1つの文字列にして、同じ文字列になったものをグループとして扱いましょう。 ・この同じ・・・ Dictionary のキーとしてまとめていきましょう。 ・合計値は、Dictionary のItem として、配列で加算していきましょう。  そして、Item の配列内に、グループとして何個扱ったか、  また、元々の値は何行目を参照したか覚えておいて、結果出力時にコピー元にしちゃいましょう。 なお、グループ化するセルの内容はそのままになります。 (数値であっても文字であってもかまいません) データが正しければ、そこそこ動くと思います。 不都合あれば、修正してください。

その他の回答 (1)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

こんな感じです。 データシートのシートタブ上で右クリック→コードの表示→サンプルコード貼り付け→シート上でAlt+F8キー押下、sample実行 Sub sample() Dim i As Long, db, wk Set db = CreateObject("Scripting.Dictionary") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row wk = Cells(i, 1) & "," & Cells(i, 2) & "," & Cells(i, 3) db(wk) = db(wk) + Cells(i, 4) Next wk = db.keys With Sheets("sheet2") .Cells.Clear .Cells(1, 1).Resize(, 4) = Cells(1, 1).Resize(, 4).Value For i = 0 To UBound(wk) .Cells(i + 2, 1).Resize(, 3) = Split(wk(i), ",") .Cells(i + 2, 4) = db(wk(i)) Next End With Set db = Nothing End Sub

関連するQ&A

  • VBAに関する質問です

    現在、以下の記述で項目の名称が一致した場合、数字の加算集計を行って名称と加算結果を別シートに表示させるマクロを使用しています。 このマクロに記述を加えて、『部署名別に項目名が一致した場合、数字の加算を行って部署名、項目名、加算集計結果を別シートに並べて表示させる』というマクロを作る場合、どのように記述すれば宜しいでしょうか? ご回答宜しくお願いします。 Sub sample() Dim i As Long, db, wk Set db = CreateObject("Scripting.Dictionary") For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row wk = Cells(i, "A") db(wk) = db(wk) + Cells(i, "B") Next With Sheets("sheet2") wk = db.keys For i = 0 To UBound(wk) .Cells(i + 1, "A") = wk(i) .Cells(i + 1, "B") = db(wk(i)) Next End With Set db = Nothing End Sub

  • 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 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)品番は集計結果シートには反映していません。 集計結果シートのような結果にするには、どのようなマクロを書けば いいのか悩んでいます。 サンプルコード等参考になるものがございましたら、お教えください。

  • VBAによる在庫管理について

    Sheet1のA1セルからE1セルまで「品名」、「単価」、「単位」、「在庫数量」、「備考欄」が記入されております。10000品目の在庫管理に使用しております。 Sheet2においてinputboxを使用し品名を入れるとSheet1のA1セルを起点とした表のA列「品名」から部分一致で検索し、検索結果のA列からE列までのデータをSheet3に表示するという構文を教えていただけると幸いです。 宜しくお願い致します。

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

    複数シートのデータを集計用に作成したシートにデータをコピーしたい。 シート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 ※集計表には、品名と営業所名のみが記載されているため「数量」と「日付」のみをコピーしたい よろしくお願いします。

  • エクセルで一定の条件を満たすデータの抽出できますか?

    毎度御世話になっております。 エクセルのシートに 品名  数量 納期  りんご 100  未定   バナナ 300  6/20  レモン 200  未定  りんご 200  未定 パイン 300  未定 パイン 500  6/29 りんご 500  6/30 等の表があります。 品名と数量と未定(納期)分のみの検索と 数量と未定(納期)の分のみの検索して それぞれの数量を集計したいのですが、 方法を教えてください。 1、同じ品名が繰り返されている場合とそうでない場合も有ります。 2、同じ品名でも納期に日付6/29などと表記されている場合もある。(この場合集計の対象外となる) 3、又、品名が、複数存在して納期未定の場合のみ集計の対象とする場合も有ります。 *1と2で同じシートで存在している。  1,2,3で同じシートで存在している。 1シートに100~200レコードが、存在しています。 どなたか教えてください。 よろしく御願い致します。m(_”_)m WIN XPです。

  • Excel マクロ データ集計

    Excel マクロ データ集計 Sheet1にある情報を集計して、集計結果をSheet2に貼り付けるマクロを考えています。 「Sheet1」のA列、B列、C列が合致した場合に同じ商品とみなします。 C列で「新鮮」とついている場合には、商品名で一致させて、Sheet2の 同じ商品名のところに記載します。 「Sheet2」に貼り付ける際、「Sheet1」のA列は不要です。 どのようなマクロを作成すればよろしいでしょうか。 画像を添付します。 「Sheet2」は完成形です。

  • 【再質問】SUMIF関数と同じ集計をVBAで行いたい

    恐縮なのですが、今一度質問させてください。 今はSUMIF関数で複数シートデータの集計をしていますが、 データ数が膨大なため処理に多大な時間が掛かっています。 VBAで同じ様な処理がしたく、ご教授の程よろしくお願いします。 Sheetは1~12まであり、同じレイアウトです。 行数は、Sheetごとに異なります。 集計結果Sheetに、品名ごとの月集計をしたい。 Sheet1    A    B    C    D 1 月日  品名   収入 支出 2 5/10  りんご  30000  20000 3 5/15  さかな  20000  30000  4 5/20  きのこ  50000  20000 5 5/25  さかな  30000  10000 6 5/30  おかし  15000  10000 7 5/30  おかし  20000  20000 5 5/10  りんご  40000  20000 Sheet2    A    B    C    D 1 月日  品名   収入 支出 2 6/13  きのこ  10000  30000 3 6/25  さかな  20000  20000 4 6/30  おかし  55000  30000 5 6/10  りんご  20000  10000 6 6/15  さかな  10000  10000 集計結果Sheet    A    B    C    D 1 品名   4月   5月   6月 2 きのこ  3 さかな  4 おかし  5 りんご  例)きのこ 4月の収入-支出を、B2セルに入力したい。 シートは4月・5月と、月別に分かれています。

  • VLOOKUP関数で取得した数値を加算したい

    はじめまして、初めて質問をさせていただきます。 以下のような処理を行いたいのですが教えてください。    シート1     |   シート2   A   B      |   A    B  1りんご        | 1バナナ  10 2バナナ  25     | 2スイカ  3 3みかん  5      | 3みかん  15 4イチゴ  30     | 4ナシ   5 シート1の数量B列に、品目A列を検索キーとして、シート2の品目A列と一致する品目の数量を「加算」する形で入力したいのです。 関数を入力して、式を下にコピーしていきますが、この際に ・一致するものがない場合は、以前入っていた数値をそのままにする。 ・数値が未記入のセルもValueなどのエラーを出さないで空白セルのままにする。 結果として、このような表になって欲しいのです。   A   B    1りんご    ←空白セルは空白のまま 2バナナ  35 ←一致する品目があったので加算 3みかん  20 ←一致する品目があったので加算 4イチゴ  30 ←シート2に一致する品目がないので変化無し としたいのですが、どのような記述の式にすればよろしいでしょうか? よろしくお願いします。

  • PC word(2007) 計算式

        数量e    数量f       数量g 品名A  2      5           4    品名B  1      4(4は計算しない)   2 品名C  3      空白        5 品名D  5      3           2 合計   11      8(12)    13  上記表の数量fの縦加算で品名Bの4を加算に入れない計算式を教えてください   

専門家に質問してみよう