- ベストアンサー
エクセルマクロ
エクセルで下記のような当日の販売集計表ファイルがあった時に、まったく別の全集計ファイルの当日日付の列に自動的に合計が記入されるようにマクロをつくりたいのです。 A B C D 1品名 合計 日付 ←タイトル 2たこ 7 0521 3いか 1 0521 4なす 5 0521 ・このような当日の集計の数字を全集計の方に記入する↓ A B C D E 1品名 在庫 販売数 0520 0521 ・・・ ←タイトル・日付 2たこ 10 9 2 7 3いか 5 4 3 1 4なす 10 7 2 5 5大根 5 2 2 0 ・ ・ 説明: ・当日のものをその日付の列に合わせて入れます。 ・品名は実際にはたくさんあります。 ・当日分のファイルはいくつかある場合があるので、もともと記入されていたらそこに足していく方法にしたいです。 ご存知の方何卒ご教授下さい。宜しくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もう少し、スマートにもできますが、一応こんな感じはどうですか? いくつものファイルから自動的に集計するのかな?と解釈しました。 何かのお役に立ててください。 (段落下げは面倒でやってません。一部長いところもあり見づらくてゴメンナサイ) やっているのは品名を探し、日付を探して、そのクロスするところに数量をプラスしています。 同じ物を何度も足さないように、フラグもつけました。 上手くいかない場合は日付を文字列にしていただくと上手くいくかも・・・。 Sub 合計() '【前提】 '複数ファイルが有っても列の構成は変わらない '1行目に品名・合計・日付・登録となっている 'ファイルの存在場所は特定のフォルダ(ここではC:\とします) '集計ファイルでボタンを押すと集計します(マクロもここに書きます) '集計する品名は集計ファイルにすべてかかれています(かかれて無くても方法はありますが) Dim tmp As Range, wb As Workbook, y As Integer, x As Integer, fn ChDir ("c:\") fn = Dir("c:\*.xls") 'ファイル名でさらにしぼれるならしぼってください(c:\*集計.xlsなど) Do Until fn = "" Set wb = Workbooks.Open(fn) y = 2 Do If wb.Sheets(1).Cells(y, 4) = "" Then Set tmp = ThisWorkbook.Sheets(1).Columns(1).Find(wb.Sheets(1).Cells(y, 1), , xlWhole) If Not tmp Is Nothing Then y = tmp.Row Set tmp = ThisWorkbook.Sheets(1).Rows(1).Find(wb.Sheets(1).Cells(y, 3), , xlWhole) If Not tmp Is Nothing Then x = tmp.Column ThisWorkbook.Sheets(1).Cells(y, x) = ThisWorkbook.Sheets(1).Cells(y, x) + wb.Sheets(1).Cells(y, 2) wb.Sheets(1).Cells(y, 4) = Now() End If End If End If y = y + 1 Loop Until wb.Sheets(1).Cells(y, 1) = "" wb.Close True fn = Dir() Loop End Sub
その他の回答 (2)
- -yellowtail-
- ベストアンサー率65% (43/66)
#2です。 そのエラーは指定している範囲が存在しないときに発生します 例えば存在しないシート名を指定しているときなどです。 確認してみてください。 余談ですが、もしExcelのバージョンが2003以降でしたら、 Find(wb.Sheets(1).Cells(y, 1), , xlWhole)この部分は Find(wb.Sheets(1).Cells(y, 1), , , xlWhole)になります。 Findの引数に変更があったためです。
お礼
ありがとうございます。こちらにしてみたらエラーがでなくなりました。ただどうしてもうまくいかない(数字が集計ファイルの方に反映されない)のですが...
- yambejp
- ベストアンサー率51% (3827/7415)
どうしてもマクロがいいのでしょうか? ピボットテーブルではいけないのですか?
お礼
大変ありがとうございます。ただ早速試してみたところどうしても<インデックスが有効範囲ではありません>と途中で止まってしまいます。デバッグでみたら下のところが黄色くなっています。何卒宜しくお願いいたします。 Set tmp = ThisWorkbook.Sheets(1).Columns(1).Find(wb.Sheets(1).Cells(y, 1), , xlWhole) If Not tmp Is Nothing Then