How to copy range form one sheet to another

excelシートのある範囲(Range)を同じWorkbookの別シートに張り付ける方法を紹介する。
Range.Copyメソッドを使うのだが、範囲のlastRowを判断するロジックとコピー先の最後列を計算するロジックを入れる。
想定している使い方としては、マスタシートの必要な部分のみピックアップして別シートにコピーすることだ。
例えば、OLEDBドライバを使いExcelをDBとして使う場合、255番目以降のデータは認識されない問題がある。
そもそも、Accessが255Column制限があるための制限らしい。
こういった場面で、全Columnではなく一部分のColumnを参照する場合は、
選択列をマスタシートからコピーして新しいテーブルを構成するのが有効な回避策(Work-around)となりうる。
さって、序論が長くなってしまったが、簡単なコードなので、コードを見てみよう。

Code snippet

sourceはマスタシート、targetはコピー先のシート指定する。
startColはRangeの最初Column、endColは最後Columnを指定する。

Sub AddTable(source As Worksheet, target As Worksheet, startCol As Long, endCol As Long)
    Dim lastCol, lastRow As Long
 
    With source
        ' Find the last row of data
        lastRow = source.Cells(Rows.Count, startCol).End(xlUp).Row
        ' Find the last column of data
        lastCol = target.Cells(1, Columns.Count).End(xlToLeft).Column
        If (lastCol = 1) Then lastCol = 0
        .Range(.Cells(1, startCol), .Cells(lastRow, endCol)).Copy _
            Destination:=target.Cells(1, lastCol + 1)
    End With
End Sub

ここでは、lastRowを判断するColumnをstartColに対してだけ行っているが、空白が入っている可能性もあるので、endColまでLoopして判断した方が正確であろう。
lastColはtargetシートに何もない状態だと1が帰ってくるので、0に初期化するロジックが入っている。
では、このメソッドを呼び出すコードを以下に示す。

Sub RangeCopy()
    Dim ws1 As Worksheet
    Dim lastRow As Long
    Set ws1 = Sheets("Sheet1")
 
    lastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row
    Call AddTable(ws1, Sheets("Sheet2"), 1, 5)
    Call AddTable(ws1, Sheets("Sheet2"), 11, 15)
 
End Sub

QR Code
QR Code study:vba:copy (generated for current page)