- 締切済み
マクロの組み方
東京12.xlsとういデータに、12月の在庫1日~31日までがシート別にあります。このような形です→SheetZAIKO01~SheetZAIKO31 これを(東京12月まとめ.xls)として別エクセルにまとめたいのですが。 12月のZAIKO01~ZAIKO31は、1行目がヘッダーで、 A1店舗名 B1商品名 C1前月残 D1今月算 とあるので、 ZAIKO01は"A1:D?"までとりたいのですが、 残りのZAIKO02からはヘッダーが必要ないので、A2から範囲指定をします。 "東京12月まとめ.xls"にまとめる際、 12月のどの日付かがわかるように、A行を日付の欄として設定をし、 たとえばZAIKO01であれば、A行に1、ZAIKO02であれば2と 入れていくような設定にしたいです。 在庫状況は日々変動していますので、日によって、行数が異なっています。 今まで、恥ずかしながら手作業でまとめていたのですが、 毎月かならず発生する作業で東京以外のエリアもあり、時間的なロスがあまりにも大きいので、 大変お手数なのですが、よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- merlionXX
- ベストアンサー率48% (1930/4007)
すみません,回答No2です。 変な部分がありましたので修正しました。 Sub test02() Dim ns As Worksheet, st As Worksheet Dim a As Long, b As Long, c As Long Dim d As Variant Set ns = Sheets.Add(Before:=Sheets(1)) '先頭にシートを挿入 ns.Name = "まとめ" '名前を「まとめ」に For Each st In Worksheets '各シートにつき If st.Name Like "*ZAIKO*" Then 'ZAIKOが名前にあれば With st .Range(.Range("A2:D2"), .Range("A2:D2").End(xlDown)).Copy 'そのシートのA2:D2以降の連続データをコピー End With With ns a = .Cells(Rows.Count, "B").End(xlUp).Offset(1).Row 'まとめシートのデータ挿入先行検索 .Cells(a, "B").PasteSpecial 'B2セルから貼り付け b = .Cells(Rows.Count, "B").End(xlUp).Row '貼り付け後の最終行取得 .Range(.Cells(a, "A"), .Cells(b, "A")).Value = Right(st.Name, 2) '貼り付け範囲のA列に各日付挿入 If .Cells(1, "B") = "" Then '1行目があいてれば .Range("A1") = "日付" '見出しに「日付」と記入 .Range("B1:F1").Value = st.Range("A1:E1").Value 'その他見出し記入 End If End With End If Next d = Application.GetSaveAsFilename(InitialFilename:=Left(ThisWorkbook.Name, 4) & "月まとめ.xls", _ fileFilter:="XLSファイル (*.xls), *.xls") '保存先確認&ファイル名を現在のファイル名の左から4文字+月まとめ とする。 If d = False Then 'キャンセルなら MsgBox "ファイル作成をキャンセルしました。" Exit Sub Else Sheets("まとめ").Copy ActiveWorkbook.SaveAs Filename:=d 'まとめシートを保存 End If End Sub
- fujillin
- ベストアンサー率61% (1594/2576)
ほとんどの部分が「マクロの記録」を利用して作成できます。 一度に全部の作業を記録すると、わけがわからなくなる可能性がありますので、部分に分けて記録したほうが理解しやすいと思います。 あとは、作成の際の参考に… ・各シート名が「ZAIKO01~SheetZAIKO31」ということなので、それぞれの シートは "ZAIKO" & ループ変数 で求めることができます。 実際は月によって日数が違うはずなので、ループの上限はDate関数を 利用して求めるのが簡単かと思われます。 >在庫状況は日々変動していますので、日によって、行数が異なっています ・No.1様の回答にもありますが、一番下の行を求めるのによく使われる 方法として、キーとなる列を決めておいて、その列の最終行を求めるとい うものがあります。 例えば、B列をキーとするなら…(stを対象シートとすると) st.Range("B" & Rows.Count).End(xlUp).Row で求めることができます。 ・最初に全部を作ろうと思わずに、「1シート分の処理をする」くらいを目標に して始めれば、あまり混乱せずにすむのではないかと思います。 がんばってください。
- n-jun
- ベストアンサー率33% (959/2873)
>ZAIKO01は"A1:D?"までとりたいのですが、 >残りのZAIKO02からはヘッダーが必要ないので、A2から範囲指定をします。 先に項目行を書き込んでしまえば、SheetZAIKO01~SheetZAIKO31は全て2行目以降で統一できますよ。 ただ”東京以外のエリア”に対して同様の事をするのなら、例えば12月のブックは 全て同じフォルダに入れてしまい、そのフォルダ単位で実行する方が楽なのかなって思います。 ⇒東京12.xlsと言うブックに対して、東京12月まとめ.xlsと言うブックを新規作成した後、 必要な処理を実行していくとか。 一案までですが。
- merlionXX
- ベストアンサー率48% (1930/4007)
とりあえず参考程度に一例を Sub test01() Dim ns As Worksheet, st As Worksheet Dim a As Long, b As Long, c As Long Dim d As Variant Set ns = Sheets.Add(Before:=Sheets(1)) '先頭にシートを挿入 ns.Name = "まとめ" '名前を「まとめ」に For Each st In Worksheets '各シートにつき If st.Name Like "*ZAIKO*" Then 'ZAIKOが名前にあれば With st 'そのシートの2行目以降の連続データをコピー .Range(.Range(.Range("A2"), .Range("A2").End(xlDown)), .Range(.Range("A2"), .Range("A2").End(xlDown)).End(xlToRight)).Copy End With With ns a = .Cells(Rows.Count, "B").End(xlUp).Offset(1).Row 'まとめシートのデータ挿入先行検索 .Cells(a, "B").PasteSpecial、B列から貼り付け b = .Cells(Rows.Count, "B").End(xlUp).Row .Range(.Cells(a, "A"), .Cells(b, "A")).Value = Right(st.Name, 2) 'A列に日付挿入 If .Cells(1, "B") = "" Then '1行目があいてれば .Range("A1") = "日付" '見出しに「日付」 .Range("B1:F1").Value = st.Range("A1:E1").Value 'その他見出し End If End With End If Next d = Application.GetSaveAsFilename(InitialFilename:=Left(ThisWorkbook.Name, 4) & "まとめ.xls", _ fileFilter:="XLSファイル (*.xls), *.xls") '保存先確認&ファイル名を現在のファイル名の左から4文字+まとめ とする。 If d = False Then 'キャンセルなら MsgBox "ファイル作成をキャンセルしました。" Exit Sub Else Sheets("まとめ").Copy ActiveWorkbook.SaveAs Filename:=d 'まとめシートを保存 End If End Sub
- nattocurry
- ベストアンサー率31% (587/1853)
あえて、そのままの答えを書かないで、ヒントだけを書きます。 それぞれのシートのデータには空行が無いものとします。 A1セルを選択した状態で、Ctrl + *を押してみてください。 テンキーのないノートPCとかだったら、Ctrl + Shift + : (Shift + : = * なので)を押してみてください。 表全体が選択されますよね? それを「マクロの記録」で記録してみましょう。 A列の最も下のセルA65536を選択した状態で、Ctrl + ↑ を押してみてください。 A列にあるデータの一番下のセルに移動しますよね? それも「マクロの記録」で記録してみましょう。 ヘッダが必要ない場合は、貼り付けた後で削除すれば良いです。 貼り付ける前にIntersect関数でヘッダを削ることもできますが、貼り付けた後で削除する方が初心者には解りやすいと思います。 > 12月のどの日付かがわかるように、A行を日付の欄として設定をし、 > たとえばZAIKO01であれば、A行に1、ZAIKO02であれば2と A行とは、A列のことですか? A列には店舗名が入るんですよね?
補足
マクロCtrl + *のものとCtrl + ↑ の分を記録しました! >ヘッダが必要ない場合は、貼り付けた後で削除すれば良いです。 なるほど。そうなんですね! >A行とは、A列のことですか? はい。そうです。 >A列には店舗名が入るんですよね? A列には触らない状態では店舗名なのですが、 完成させるデータはA列に日付を入れたいです。