質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1044閲覧

Excell VBAで項目単位での集計方法について

shinyakita

総合スコア39

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/05/09 00:28

編集2020/05/09 11:37

表題の件

SQLのgloupbyの様に指定された項目で集計し、アウトプット用のシートにコピーをExcel VBAで実現する場合の
考え方について教えて下さい。

私が考えたやり方は下記の通りになります。

①集計用の変数を用意する。
②データが入っているシートを、集計したい項目をキーにしてソートする。
③forの中にIFを入れ項目の変わり目で分岐させる。
for i=1 to 最終行
集計用変数=集計用変数+集計項目
if 「項目行」<>「項目行+1」 then →集計する項目セルをA列とした場合「if range("A" & i) <> range("A" & i + 1) then」
アウトプット用シートへコピー
集計用変数=0
End If
next
④印刷

この様に考えましたが、集計項目が複数になってくると下記の様に項目数だけfor文を回せなければならず、何か他に方法はないのかと考えております。
お知恵をお貸し下さい。

for i=1 to 最終行
集計用変数=集計用変数+集計項目
if 「項目行」<>「項目行+1」 then
アウトプット用シートへコピー
集計用変数=0
End If
next
for i=1 to 最終行
集計用変数=集計用変数+集計項目
if 「項目2行」<>「項目2行+1」 then
アウトプット用シートへコピー
集計用変数=0
End If
next
----追記-----
元データサンプル画像です。
![イメージ説明]

対象のキーとしたいのは「出庫日」及び「商品コード」になり集計項目は「出庫ケース数」「出庫バラ数」になります。

出庫日毎の商品明細を一表にまとめ印刷する仕組みを考えております。

出庫日(ヘッダー)が変わると印刷し、明細項目をクリアする。

印刷フォームイメージ
イメージ説明

また、別の表では「出庫日」「コード」をヘッダー情報として改ページして「商品コード」と「出庫ケース数」「出庫バラ数」を明細として一表にまとめ印刷

各別モジュールで考えております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2020/05/09 08:04

集計項目が複数の実際の例を画像にして貼り付けていいただけませんでしょうか。 Sheet1が集計元、Sheet2が集計結果としてください。 集計の方法も「集計した項目○○をキーにして、項目XXを集計する。」のように具体的に書いてください。
shinyakita

2020/05/09 09:43

tatsu99様 早速の返信ありがとうございます。
tatsu99

2020/05/09 11:10

補足ありがとうございました。 nextで示された画像と元データの画像が同じです。 nextの画像は「元データを「出庫日」及び「商品コード」をキーとして「出庫ケース数」及び「出庫バラ数」を集計した結果」のはずですので、その画像を提示していただけますでしょうか。
shinyakita

2020/05/09 11:33

nextの画像は貼り付けた覚えがないで、操作を間違えたようです。
guest

回答2

0

ベストアンサー

印刷までは考慮せず、日付+商品コード単位で出力する方法です。
印刷についてはあなたの方で、工夫してください。
「集計結果」シートに、添付図のような形で出力されます。
集計結果

尚、実行時、元データは日付でソートされている前提ですので、必要であれば
日付でソートする処理をあなたの方で付加してください。
以下のようになります。不明点があれば補足してください。
集計結果の1行目は予め設定されている前提です。

VBA

1Public Sub 日付商品コード集計() 2 Dim sh1 As Worksheet 3 Dim sh2 As Worksheet 4 Dim dictCase As Object '出庫ケース数用 5 Dim dictBara As Object '出庫バラ数用 6 Dim key As Variant 7 Dim maxrow1 As Long 8 Dim row1 As Long 9 Dim row2 As Long 10 Dim keys As Variant 11 Set dictCase = CreateObject("Scripting.Dictionary") ' 連想配列の定義 12 Set dictBara = CreateObject("Scripting.Dictionary") ' 連想配列の定義 13 Set sh1 = Worksheets("元データ") 14 Set sh2 = Worksheets("集計結果") 15 maxrow1 = sh1.Cells(Rows.Count, "A").End(xlUp).row '元データ 最終行を求める 16 For row1 = 2 To maxrow1 17 '日付+商品コードをキーとする 18 key = sh1.Cells(row1, "N").Value & "|" & sh1.Cells(row1, "H").Value 19 '最初のキーの場合、値を0で初期化する 20 If dictCase.exists(key) = False Then 21 dictCase(key) = 0 22 dictBara(key) = 0 23 End If 24 dictCase(key) = dictCase(key) + sh1.Cells(row1, "K").Value '出庫ケース数を加算 25 dictBara(key) = dictBara(key) + sh1.Cells(row1, "L").Value '出庫バラ数を加算 26 Next 27 '集計結果へ出力する 28 '2行目以降をクリアする 29 sh2.Rows("2:" & Rows.Count).ClearContents 'Sheet2の2行目以降をクリア 30 row2 = 2 31 For Each key In dictCase 32 keys = Split(key, "|") 'キーを日付と商品コードにばらす 33 sh2.Cells(row2, "A").Value = keys(0) '日付 34 sh2.Cells(row2, "B").Value = keys(1) '商品コード 35 sh2.Cells(row2, "C").Value = dictCase(key) '出庫ケース数 36 sh2.Cells(row2, "D").Value = dictBara(key) '出庫バラ数 37 row2 = row2 + 1 38 Next 39 MsgBox ("完了") 40End Sub 41 42

投稿2020/05/09 12:00

tatsu99

総合スコア5470

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyakita

2020/05/09 12:22

コードまで作っていただきありがとうございます。 配列を使うのですね。 すごく勉強になります。 配列の使い方をもう一度勉強してみます。
guest

0

出力形式にこだわらなければ、簡易的な方法としてピボットテーブルを使用する方法があると思います。

投稿2020/05/09 11:30

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問