- ベストアンサー
VBA初心者のためのシートのコピー方法
- VBA初心者の方による、複数のシートを1つのシートにコピーする方法についての質問です。
- 質問者は『まとめ』という名前のシート以外にもコピーしたいシートがあり、まとめシートとコピーしたいシートのデータを範囲ごとコピーし、まとめシートに貼り付けたいと考えています。
- 最終行を取得する方法は分かっているものの、最終行から'B5'までの範囲を指定してコピーする方法が分からず困っています。お知恵をお貸しいただけると幸いです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Ano.2の続きです 最終行のセルをselect出来れば、「ActiveCell.Row」でそのセルの行番号が得られます。これをCStr関数で文字列にし、「”B5:Mn”」の文字列を作れば、Range関数の引数にできます。 n = ActiveCell.Row Range("B5:M"+CStr(n)).copy これで、B5からMの最終行までの範囲をコピーできます。
その他の回答 (4)
- tom04
- ベストアンサー率49% (2537/5117)
No.1です。 補足に >まとめシートのB4~M4まで項目行が入っていますので、貼り付け先としてはB5~M5以下の行となります。 とありましたので、「まとめ」SheetのB5セル以降に貼り付けるようにしてみました。 Sub コピー2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("まとめ") endRow = wS.Cells(Rows.Count, "B").End(xlUp).Row If endRow > 4 Then Range(wS.Cells(5, "B"), wS.Cells(endRow, "M")).ClearContents End If For k = 1 To Worksheets.Count If Worksheets(k).Name <> "まとめ" Then endRow = Worksheets(k).Cells(Rows.Count, "B").End(xlUp).Row If endRow > 4 Then Range(Worksheets(k).Cells(5, "B"), Worksheets(k).Cells(endRow, "M")).Copy _ wS.Cells(Rows.Count, "B").End(xlUp).Offset(1) End If End If Next k End Sub こんなんではどうでしょうか?m(_ _)m
お礼
既に〆てしまっていたのに、ご回答頂きありがたい限りです。 試しに頂いたマクロを試しに走らせてみたところ、ぴったりコピペできていました。 あとは特定のシートだけコピーしないようにできれば完璧です!! がんばって完成させます。 本当にありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
まとめシートの4行目に項目名が羅列済みである所から開始する sub macro1() dim a as variant, ax as variant dim w as worksheet dim LastRow as long ’コピーしたいシート,したくないシートの具体的な説明がありませんので a = array("Sheet1", "Sheet3", "Sheet5") ’コピーしたいシート名一覧 worksheets("まとめ").select range("B5:B" & range("B65536").end(xlup).row).entirerow.delete for each ax in a lastrow = worksheets(ax).range("B65536").end(xlup).row worksheets(ax).range("B5:M" & lastrow).copy destination:=range("B65536").end(xlup).offset(1) next end sub
お礼
ありがとうございます。 思っていたマクロに一番近かったので、参考に求めているマクロが完成させられるよう頑張ります。
補足
ご回答ありがとうございます。 シート名をコピーしたいものに変更・追加して書いて頂いたマクロを走らせてみたのですが まとめシートではなく、別のシート(コピーしたいシート)が消えてそこに全てコピペされていました。
- ken-nosuke
- ベストアンサー率36% (56/154)
質問内容を下記と解釈し回答します。 1)コピーしたい最終行はわかっている 2)コピーする範囲の指定 Rang("B5:Mn”)の nの指定の仕方がわからない 回答 n=最終行とすると Rang(”B5:M"+CStr(n)) n=1000 とすると上記式は、Rang(”B5:M1000")と同じになります。 CStrは、数字を文字列に変換する関数です。
お礼
続きまで教えて頂いてありがとうございます!
補足
ご回答ありがとうございます。 最終行の在り処は Range("B65536").End(xlUp).Offset(0, 11).Select で選択することはできます。 Selectしたものを定義?格納?しなければいけないと思うのですが、その方法が分からない状態です。 Range("B5", 選択したセル).Copy にするのはどうすれば良いでしょうか。 CStr=数字を文字列に変換というのがよくわかりません・・・。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 「まとめ」Sheetのどこに貼りつけるか?の指定がないので A列に貼り付けとしてみました。 Alt+F11キー → めにゅー → 挿入 → 標準モジュール に下のコードをコピー&ペーストして マクロを実行してみてください。 Sub まとめSheetにコピー() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("まとめ") wS.Cells.ClearContents For k = 1 To Worksheets.Count If Worksheets(k).Name <> "まとめ" Then endRow = Worksheets(k).Cells(Rows.Count, "B").End(xlUp).Row Range(Worksheets(k).Cells(5, "B"), Worksheets(k).Cells(endRow, "M")).Copy _ wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If Next k End Sub ※ 「まとめ」Sheetに項目行があるのが一般的だと思いますが、 それも一旦クリアにして貼り付けていますので、2行目以降にデータが貼り付きます。m(_ _)m
お礼
ご回答ありがとうございました。 少しずつ解析しながら完成させていきたいと思います!
補足
情報が不足しており申し訳ありません。 まとめシートのB4~M4まで項目行が入っていますので、貼り付け先としてはB5~M5以下の行となります。
お礼
Sub B5から最終セルの選択とコピー() Dim n As Variant Range("B65536").End(xlUp).Offset(0, 11).Select n = ActiveCell.Row Range("B5:M" + CStr(n)).Copy End Sub コピーをするところまではできましたので、ここからまた自力で頑張ってみます! 他のご回答頂きました皆さまも、ありがとうございました。
補足
ありがとうございます!理解できました。