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