[[20190612184107]] 『最終行へのコピペ』(める) ページの最後に飛ぶ

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

 

『最終行へのコピペ』(める)

コピーして別シートに貼り付ける時に変数を使うと上書きされてしまします。

この原因教えてください。

Dim i As Long

i = Cells(Rows.Count, 1).End(xlUp).Row

Sheets("1").Range("a3:V5").Copy Sheets("all").Cells(i, 1).Offset(1, 0)

Sheets("2").Range("a3:V5").Copy Sheets("all").Cells(i, 1).Offset(1, 0)

変数を使わないと上手くいきます

Sheets("1").Range("a3:V5").Copy Sheets("all").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

Sheets("2").Range("a3:V5").Copy Sheets("all").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

< 使用 Excel:Excel2016、使用 OS:Windows10 >


i = Cells(Rows.Count, 1).End(xlUp).Row

 シートの指定がないので、アクティブシートの最終行が取得されています。
(OK) 2019/06/12(水) 18:48

1回めの貼付け後、最終行を再度求めないと、同じところに貼り付けることになります。
 i = Sheets("all").Cells(Rows.Count, 1).End(xlUp).Row 
 Sheets("1").Range("a3:V5").Copy Sheets("all").Cells(i, 1).Offset(1, 0) 
 i = Sheets("all").Cells(Rows.Count, 1).End(xlUp).Row 
 Sheets("2").Range("a3:V5").Copy Sheets("all").Cells(i, 1).Offset(1, 0)

(マナ) 2019/06/12(水) 18:51


なるほど。
早々の回答ありがとうございます。
(める) 2019/06/12(水) 18:53

終わった(解決した)話に余計なお世話かもしれませんけど、投稿しておきます。

(1)
BJさんが指摘されているように、【標準モジュール】で、対象となるシートを省略すると、アクティブシートを指定したものとして扱われます

 例
    i = Cells(Rows.Count, 1).End(xlUp).Row 
           ↓
    i = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row

(2)

 【Cells(Rows.Count, 1).End(xlUp)】【.Row】

↑は前半部分で「セル」が取得されていて、後半でその「セル」の行番号を得ています。
そして、

 Cells(i, 1)

↑でセルに組み立て?ています。

これをよく考えてみてください。
上手い表現が思いつきませんが、一度A列の最終行のセルが取得できているのに、わざわざ行番号に分解して、再度同じセルに組み立てなおしています。これって無駄じゃないですか?

なので、変数「i」に行番号をいったん格納せずとも

 Sheets("1").Range("a3:V5").Copy Sheets("all").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 
 Sheets("2").Range("a3:V5").Copy Sheets("all").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 

のように記述しても同じことになります。

(3)
コピー対象のセル範囲はいつも同じ番地だということならループ処理で記述することもできます。
また、対象のセル範囲や、シートなどを一度オブジェクト変数にセットしてやれば、以降はどこの所属なのかという記述は要らなくなってシンプルになると思います。

    Sub さんぷる()
        Dim dstRNG As Range
        Dim tmp As Variant

        With Sheets("all")
            Set dstRNG = .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
        End With

        For Each tmp In Array("1", "2")
            With Worksheets(tmp).Range("a3:V5")
                .Copy dstRNG
                Set dstRNG = dstRNG.Offset(.Rows.Count)
            End With
        Next tmp

    End Sub

(もこな2) 2019/06/13(木) 04:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.