- ベストアンサー
複数シートをループさせてマクロを簡素化したい
- 質問者は、Excel2007でマクロを作成している初心者です。複数シートにある特定の範囲を一枚のシートに右列方向に貼り付けたいという課題があります。自動記録で作成したコードをもっと簡素化したいと考えています。質問者はシートに対するループを作成する方法を知りたいと思っています。
- 質問者は、Win7とExcel2007を使用しています。複数のシートにある特定の範囲を一つのシートに右列方向に貼り付けたいという要望を持っています。質問者は初心者であり、すでに自動記録によってコードを作成しましたが、それをより簡素化して軽量化したいと考えています。
- 質問者は、Excel2007を使用してマクロを作成している初心者です。複数のシートにある特定の範囲を一枚のシートに右列方向に貼り付けたいというニーズがあります。自動記録でコードを作成しましたが、さらに簡素化して効率化したいという要望があります。質問者はシートに対するループを作成する方法についての指導を求めています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1・2です! 続けておじゃまします。 よく確認せずに投稿してごめんなさい。 「値」の貼り付けですね! セルの結合は無視されてしまいますが・・・ Sub test() Dim k As Long Dim ws As Worksheet Set ws = Worksheets("総括") Application.DisplayAlerts = False On Error Resume Next For k = 1 To Worksheets.Count If Worksheets(k).Name <> "総括" Then Range(Worksheets(k).Cells(29, "B"), Worksheets(k).Cells(60, "BM")).Copy ws.Cells(2, Columns.Count).End(xlToLeft).Offset(, 1).Select Selection.PasteSpecial Paste:=xlPasteValues End If Next k Range(ws.Cells(2, 1), ws.Cells(60, 1)).Delete (xlToLeft) ws.Cells(2, 1).Select End Sub ※ 今回は「総括」Sheetがどこにあっても対応できるようにしてみました。 こんなんで参考になりますかね?m(_ _)m
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! 補足の >上のせる範囲には横方向のセルの結合がしてあります。 とありますがコピー元のSheetが結合されているのか?それとも「総括」Sheetが結合されているのか? 判らないのですが、 場合によっては結合を解除してやる必要があるかもしれません。 とりあえずコードを↓に変更してみてください。 Sub test() Dim k As Long Dim ws As Worksheet Set ws = Worksheets("総括") Application.DisplayAlerts = False On Error Resume Next For k = 2 To Worksheets.Count Range(Worksheets(k).Cells(29, "B"), Worksheets(k).Cells(60, "BM")).Copy Destination:= _ ws.Cells(2, Columns.Count).End(xlToLeft).Offset(, 1) Next k ws.Range(Cells(2, 1), Cells(60, 1)).Delete (xlToLeft) End Sub エラーを無視するようにしてみましたが、これでもダメなら 別方法(セルの結合解除等)を考える必要があるかもしれません。 その場合は具体的な表のレイアウトが判らないと 的確なアドバイスができないと思います。 この程度でごめんなさいね。m(_ _)m
補足
教えていただいたコードを実行したとろこ、すべての貼り付けになっていまして、セルに入っている関数がそのままなので、値の貼り付けでないので、このセルの値のデータを利用して再加工することができません。 各シートのコピー元が横結合しています。コピー先は一切結合していません。どうぞよろしくおねがいします。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 「総括」SheetはSheet見出し上で一番左側にあるとします。 標準モジュールにコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim k As Long Dim ws As Worksheet Set ws = Worksheets("総括") For k = 2 To Worksheets.Count Range(Worksheets(k).Cells(29, "B"), Worksheets(k).Cells(60, "BM")).Copy Destination:= _ ws.Cells(2, Columns.Count).End(xlToLeft).Offset(, 1) Next k ws.Range(Cells(2, 1), Cells(60, 1)).Delete (xlToLeft) End Sub ※ 各SheetのBM2セルには何らかのデータが入っているとします。 (そうでないと、最終列の取得が滅茶苦茶になってしまいます) こんな感じでよろしいのでしょうか?m(_ _)m
補足
素早いご回答ありがとうございます。私の自動記録のマクロで作動したのですが、ご指摘のコードを実行したところ、「コピー領域と貼り付け領域の形が・・・で貼り付けできません。」のエラーがでます。前もってお知らせすべきでした。上のせる範囲には横方向のセルの結合がしてあります。まさかのショックです。 どうしたらよろしいでしょうか。
お礼
私の思っている通りのことが実現できました。本当に感謝感激です。そのコードを見たとき半分ほどしか理解できず、まるでマジックショーを見ているようです。大変おせわになりました。今後共よろしくお願いします。