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).CopyCells(3,1).SelectActiveSheet.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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



