[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『 マクロ記録 最終行の次の行にコピーしたい』 (いもあん)
マクロ記録の自動記録でVBA初心者です sheet1とsheet2のデータをsheet3の1つのシー トにまとめたい場合、
まずシート1のデータをそのままシート3へコピー、
次にシート2のデータをシート3へコピーして貼り付けしたいのですが、
毎回、シート1のデータの最終行が毎回違うので、
最終行の次の行へ貼り付けるためには、どのようにすればいいですか?
現在、シート1のデータをシート3に貼付、最終行を取得しても
そのままセルの位置を表示してしまいます。
シート3でのマクロの最終行を以下で設定しました
A列はデータがあったりなかったりなので、N列まで選択しています。
Range("A2:N2").Select
Range(Selection, Selection.End(xlDown)).Select
Range("A75").select ← 'ここの貼付位置を最終行にする
エクセル2010、Windows7ですが、それ以前のバージョン(2003,7ぐらい)でも対応でき るようにお願いします。
こんなのでどうでしょうか。
Sub test()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim z As Long
Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")
Set sh3 = Sheets("Sheet3")
sh3.Cells.ClearContents
sh1.Range("A1").CurrentRegion.Copy
sh3.Range("A1").PasteSpecial Paste:=xlPasteAll
z = sh3.Range("N" & sh3.Rows.Count).End(xlUp).Row 'N列で最終行を判定
sh2.Range("A1").CurrentRegion.Copy
sh3.Range("A" & z).Offset(1).PasteSpecial Paste:=xlPasteAll 'A列のz行の一つ下の行に貼り付け
Application.CutCopyMode = False
End Sub
(usamiyu)
マクロの記録で簡単に行おうと思うなら
先にシート2のデータを貼り付けておいて その上にシート1のデータを【挿入】する。
と、挿入の最初のセルはいつも同じだと思うので 苦労なく出来るんじゃないかと思います。
シート1のデータを貼り付けてから、シート2のデータを貼り付けたいなら 「相対参照で記録」ってのを活用すると良いです。
N1セルを選択して、Ctrl + ↓ で 入力がある最後の行に移動した後 相対参照で記録 に切り替えて 一つ下のA列のセルを選択します。
(HANA)
私の回答、少し補足しますね。
最終行はここで判定しています。
z = sh3.Range("N" & sh3.Rows.Count).End(xlUp).Row
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^
/ /
シート3のN列の一番下の行 一番下から上に向けてデータのある行
これは Ctrl + ↑ という動きと同じです。 で、この行の一つしたの行をoffsetで指定しています。
sh3.Range("A" & z).Offset(1)
なぜ、End(xlDown)でなく、End(xlUp)を使用しているかというと、N列途中に歯抜行があった場合、
期待する結果にならないかなと考えたためです。
次のを試すと実感できるでしょうか?
Sub TestDown()
Dim z As Long
Columns("A").Clear
'指定セルの下に連続して値があり、その後、空白をはさんで値があるとき
Range("A1").Value = "ABC"
Range("A2").Value = "XYZ"
Range("A4").Value = "あいう"
z = Range("A1").End(xlDown).Row
MsgBox z
End Sub
Sub TestUp()
Dim z As Long
Columns("A").Clear
'指定セルの下に連続して値があり、その後、空白をはさんで値があるとき
Range("A1").Value = "ABC"
Range("A2").Value = "XYZ"
Range("A4").Value = "あいう"
z = Range("A" & Rows.Count).End(xlUp).Row
MsgBox z
End Sub
(usamiyu)
usamiyuさんの最初のアドバイス通りに自分で書き直してマクロを実行しましたが、
R1シートの1行目はタイトル行なので、2行目からをR3シートへ貼付したいのですが、
R1シートの1行目のタイトル行もR3シートに貼付られてしまいます。
どうマクロを変更すればいいのでしょうか?
Sheets("R1").Select
ActiveSheet.Range("$A$1:$N$332").AutoFilter Field:=1, Criteria1:="=" ←範囲は後で訂正します
Dim R1 As Worksheet
Dim R3 As Worksheet
Dim RYU As Long
Set R1 = Sheets("R1")
Set R3 = Sheets("R3")
RYU = R3.Range("N" & R3.Rows.Count).End(xlUp).Row
R1.Range("A2").CurrentRegion.Copy
R3.Range("A" & RYU).Offset(1).PasteSpecial Paste:=xlPasteAll
Application.CutCopyMode = False
(いもあん)
こんなのでは? 少しごちゃついたので、Withでくくってます。
Sub test2()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Dim z As Long
Dim y As Long
Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")
Set sh3 = Sheets("Sheet3")
sh3.Cells.ClearContents
sh1.Range("A1").CurrentRegion.Copy
sh3.Range("A1").PasteSpecial Paste:=xlPasteAll
With sh2 '★ここから
y = .Range("N" & .Rows.Count).End(xlUp).Row 'sh2のN列最終行を判定
.Range("A2", .Range("A" & y)).Resize(, 14).Copy 'sh2のA2からA列y行目までを14列拡張しコピー
End With '★ここまで変更
With sh3
z = .Range("N" & .Rows.Count).End(xlUp).Row 'N列で最終行を判定
.Range("A" & z).Offset(1).PasteSpecial Paste:=xlPasteAll 'A列のz行の一つ下の行に貼り付け
End With
Application.CutCopyMode = False
End Sub (usamiyu)
それと、なぜ R1.Range("A2").CurrentRegion.Copy では
>R1シートの1行目のタイトル行もR3シートに貼付られてしまいます。
となるかですが、CurrentRegionプロパティのヘルプを確認すると 「オブジェクトを返すプロパティです。アクティブ セル領域 (Range オブジェクト) を返します。 アクティブ セル領域とは、空白行と空白列で囲まれたセル範囲です。」とあります。
つまり、A2の上にA1(タイトル行)があるので、空白で囲まれておらず、A2のCurrentRegionにはA1も 含むということですね。
なので、test2ではCurrentRegionを使わず、Sheet2のA2からA列y行目までを14列(N列まで)拡張した 範囲を指定してSheet3に貼り付けています。
(usamiyu)
後のマクロで自分なりに書き換えてみたところ、2行目から貼付されるようになりました。
ほかのマクロでも試してみたいと思います。
初心者ですのでもっと勉強していきます。
ありがとうございました。
(いもあん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.