[[20130729113856]] 『 マクロ記録 最終行の次の行にコピーしたい』 (いもあん)  ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『 マクロ記録 最終行の次の行にコピーしたい』 (いもあん)

 マクロ記録の自動記録で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.