前提・実現したいこと
当方、マクロの勉強を始めて1週間です。
急遽、下記のような集計をすることになりました。
期限内に作業を完成させるべくマクロを使用したいと思って色々と調べていますが、なかなかうまく動かすことができません。
そこで皆様のお知恵をお借りできたらと思い、質問させていただきます。
どうぞよろしくお願いいたします。(※編集機能で初心者マークを追加しました。)
「実現したいこと」
エクセルのマクロを使用して、10ある部署の売り上げを商品別に一枚のシートに集計したいと思っています。(実際にはもっとたくさんの部署があります)
そこでWorksheetFunction.SumIfを使用して、複数シートからデータ抽出、それを集計シートに転記しようと考えました。
「シートの構成と内容」
・wstemplate(集計用シート、A列に商品コード一覧、B列から列ごとに10の部署が入っている(BC列が関東、DE列が東北など)
・wsdata(部署別の売り上げで10枚に分かれている)
wstemplateのA列の商品コードと、全てのwsdataの商品コード(k2:k400)をWorksheetFunction.SumIfで冊数(wsdataのw2:w400)と売上金額(wsdataのx2:x400)で条件抽出し、合計をwstemplateのB列(冊数合計)とC列(売上金額合計):B列とC列でひとつの部署の集計としている)、E列とF列、以下全部署の列に転記したい。
発生している問題・エラーメッセージ
以下に記載したコードで、ひとつのwsdataからなら抽出、転記できたのですが、すべてのwsdataシートから一括で条件抽出することができていません。条件はすべてのシートで同じです。
そこで質問なのですが、すべてのシートの条件抽出を一度にやって、それを指定の各列に転記するというのは一つのマクロで可能でしょうか?
以下の該当のソースコードではひとつひとつ転記場所を記述しないといけないので、もっとシンプルなコードが書ければと思いました。
「試したこと」でも書きましたが、「ひとつのwsdataから抽出する」というコードをすべてのシートに適用すること、もしくは上記コードをループして抽出、転記する際に転記場所をずらしていけないか(stepを使う)と考えましたが、このような考え方で希望するマクロができますでしょうか?
プログラムを書くのも初めてなので、考え方や前提条件から間違っているかもしれません。
解決するためのコードをご提示いただかなくても、考え方のアドバイスだけでもいただけますと大変助かります。
どうぞよろしくお願いいたします。
8/30 実現したい集計表のサンプル画像をアップしました。レイアウトは別のものが作り、そのレイアウトは変更できないので、実際にはサンプル画像より商品コードの開始行が違ったりする可能性があります。部署名はC列に入力されており、シート内にセル結合は一切ありません。
A20などの商品区分ごとの合計行は、マクロで商品の集計を行った後、手入力で追加していってもいいと思っています。
VBA
Option
1 2Sub 集計表作成() 3 4'変数を定義する 5Dim i As Long '商品コードの最後の行を求める変数 6Dim n As Long '最後の行番号を調べる 7Dim m As Long '商品コード 8Dim wstemplate As Worksheet, wsdata As Worksheet 9 10Set wstemplate = Worksheets("wstemplate") 11Set wsdata = Worksheets("wsdata") 12 13n = wstemplate.Range("A65536").End(xlUp).Row ' 最後の行を求める 14 15 For i = 4 To n 16 m = wstemplate.Range("A" & i) 17 18 '冊数と金額集計 19 wstemplate.Range("B" & i) = _ 20 WorksheetFunction.SumIf(wsdata.Range("k2:k400"), _ 21 m, wsdata.Range("w2:w400")) 22 23 wstemplate.Range("C" & i) = _ 24 WorksheetFunction.SumIf(wsdata.Range("k2:k400"), _ 25 m, wsdata.Range("x2:x400")) 26 27 Next 28 29End Sub
試したこと
for each wsdate in worksheetsを使って上記のコードを繰り返し処理を考えました。→すべてのシートから抽出できない。
次に、以下のコードのように変数を使って上記のコードを繰り返すことを考えました。
転記の部分でwsData.Cells(i, j).ValueをWorksheetFunction.SumIf(wsdata.Range("k2:k400"), m(別途商品コード一覧を定義したもの), wsdata.Range("w2:w400"))に書き換える方法を検討。(その他の部分は適宜wstemplateに合わせる。)→繰り返しがうまくいかない。
Dim
1rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得 2 3Dim i As Long, j As Long, k As Long 4k = 21 5For i = 2 To rowsData 6 For j = 1 To 3 7 wsTemplate.Cells(k, j).Value = wsData.Cells(i, j).Value 8 Next j 9 k = k + 1 10Next i 11 12End Sub
windows10、excel2013を使用

回答3件
あなたの回答
tips
プレビュー