VBAのCopy Destinationの使い方|1行でコピーする方法と動的コピーのパターン

VBAのCopyメソッドに Destination 引数を指定すると、SelectやPasteなしでコピーから貼り付けまでを1行で完結できます。引数とは「メソッドに追加情報を渡すもの」で、Destination は「コピー先のセル」を指定します。

この記事では、次の内容を順番に解説します。

  • Destinationとは何か(引数の考え方)
  • 3つの書き方の比較(3行・1行・省略形)
  • RangeとCellsでのDestinationの使い方
  • 別シート・最終行への動的コピー
  • ループと組み合わせた実務パターン

Destinationとは何かを理解するには?

VBAの多くのメソッドは「引数(ひきすう)」という追加情報を受け取ることができます。Copy メソッドの場合、Destination 引数でコピー先を指定できます。

' Destinationを使った基本の書き方
Cells(2, 1).Copy Destination:=Cells(3, 1)

この1行で「A2をコピーしてA3に貼り付ける」が完結します。

書き方コード行数おすすめ度
通常の動作をそのままコード化Cells(2,1).Copy
Cells(3,1).Select
ActiveSheet.Paste
3行
Destinationを明示して1行で書くCells(2,1).Copy Destination:=Cells(3,1)1行◎ おすすめ
引数名を省略した書き方Cells(2,1).Copy Cells(3,1)1行○ 慣れたら

省略形について:Destination:= の部分は省略できますが、初めて見る人には「何をしているのか」がわかりにくくなります。チームで使うファイルや後から見直すコードでは Destination:= を明示して書くのがおすすめです。

RangeとCellsでDestinationを使うには?

コピー元・コピー先は Range でも Cells でも指定できます。

' Rangeで指定する場合
Range("A2").Copy Destination:=Range("C2")

' Cellsで指定する場合(行・列を数字で管理しやすい)
Cells(2, 1).Copy Destination:=Cells(2, 3)

' 範囲をコピーする場合(貼り付け先は左上のセル1つでOK)
Range("A1:C5").Copy Destination:=Range("E1")

' CellsとRangeを組み合わせることもできる
Range(Cells(2, 1), Cells(10, 3)).Copy Destination:=Cells(2, 5)

Rangeで書くかCellsで書くかの使い分け:セルの位置を固定で書く場合は Range("A1") が読みやすく、ループ変数を使って行番号・列番号を動的に変えたい場合は Cells(行, 列) が便利です。

別シートにコピーするには?

Destinationにシートを指定することで、別シートへのコピーも1行で書けます。

' Sheet1のA2をSheet2のA2にコピー
Sheets("Sheet1").Cells(2, 1).Copy _
    Destination:=Sheets("Sheet2").Cells(2, 1)

' 変数を使うとさらに読みやすくなる
Dim wsFrom As Worksheet
Dim wsTo   As Worksheet
Set wsFrom = ThisWorkbook.Sheets("データ")
Set wsTo   = ThisWorkbook.Sheets("集計")

wsFrom.Range("A1:D10").Copy Destination:=wsTo.Range("A1")

最終行に動的にコピーするには?

コピー先の行番号をその都度変えたい場合は、最終行を取得してからDestinationに渡します。

' 集計シートの最終行の次の行にデータをコピーする
Sub CopyToLastRow()
    Dim wsFrom  As Worksheet
    Dim wsTo    As Worksheet
    Dim nextRow As Long

    Set wsFrom = ThisWorkbook.Sheets("データ")
    Set wsTo   = ThisWorkbook.Sheets("集計")

    ' 集計シートの次に書き込む行を取得
    nextRow = wsTo.Cells(wsTo.Rows.Count, 1).End(xlUp).Row + 1

    ' データシートの2行目を集計シートの最終行の次にコピー
    wsFrom.Range("A2:D2").Copy Destination:=wsTo.Cells(nextRow, 1)
End Sub

ループと組み合わせて使うには?

条件を満たす行だけを別シートにコピーするような処理も、Destinationとループを組み合わせると書けます。

' A列が「完了」の行だけを別シートにコピーする
Sub CopyCompletedRows()
    Dim wsFrom  As Worksheet
    Dim wsTo    As Worksheet
    Dim lastRow As Long
    Dim copyRow As Long
    Dim i       As Long

    Set wsFrom = ThisWorkbook.Sheets("データ")
    Set wsTo   = ThisWorkbook.Sheets("完了一覧")

    lastRow = wsFrom.Cells(wsFrom.Rows.Count, 1).End(xlUp).Row
    copyRow = 2  ' コピー先の開始行

    For i = 2 To lastRow
        If wsFrom.Cells(i, 1).Value = "完了" Then
            wsFrom.Range(wsFrom.Cells(i, 1), wsFrom.Cells(i, 4)).Copy _
                Destination:=wsTo.Cells(copyRow, 1)
            copyRow = copyRow + 1  ' コピー先の行を1つ進める
        End If
    Next i

    MsgBox "コピー完了:" & copyRow - 2 & "件"
End Sub

このコードのポイントは「copyRow 変数でコピー先の行番号を管理している」点です。条件を満たす行をコピーするたびに copyRow を1増やすことで、連続した行に貼り付けられます。

まとめ

  • Destinationとは:Copyメソッドの引数で「コピー先のセル」を指定する。
  • おすすめの書き方Cells(2,1).Copy Destination:=Cells(3,1) のように引数名を明示する。
  • 範囲コピー:貼り付け先は左上のセル1つを指定すればOK。
  • 別シートへのコピー:Destinationにシートを含めて指定するだけ。
  • 動的なコピー先:最終行を取得してから Cells(nextRow, 1) で指定する。
  • ループとの組み合わせ:コピー先の行番号を変数で管理しながらループすると、条件抽出コピーが作れる。

よくある質問

Destination:=を省略すると何が変わりますか?

動作は同じです。Cells(2,1).Copy Cells(3,1)Cells(2,1).Copy Destination:=Cells(3,1) はまったく同じ動きをします。ただし、引数名を省略すると初めて見る人にはコードの意味がわかりにくくなるため、チームで共有するコードでは明示した方が親切です。

DestinationとPasteSpecialを同時に使えますか?

使えません。Destination 引数は「そのままコピー(書式・値・数式すべて)」する場合のみ使えます。「値のみ貼り付け」など形式を指定したい場合は Copy を引数なしで実行してから PasteSpecial を使います。

コピー先の範囲を自動でコピー元と同じサイズにできますか?

Destination に左上のセル1つを指定すれば、コピー元と同じサイズで自動的に貼り付けられます。例えば Range("A1:C5").Copy Destination:=Range("E1") は E1:G5 の範囲に貼り付けられます。

Destinationに変数で計算した行番号を使えますか?

使えます。Destination:=Cells(nextRow, 1) のように変数を直接渡せます。ループや最終行取得と組み合わせることで、動的なコピー先を指定できます。

コピー後に点線(マーチングアンツ)が残ります。消せますか?

Destination 引数を使ってコピーした場合は、コピーモードが自動的に解除されるため点線は残りません。PasteSpecial を使った場合は Application.CutCopyMode = False で手動で解除してください。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール