VBAでセルをコピーするには Copy メソッドを使います。貼り付け先を Destination 引数で指定すると、SelectやPasteなしで1行で書けます。値のみ・書式のみなど形式を選んで貼り付けたい場合は PasteSpecial を使います。
この記事では、次の内容を順番に解説します。
- Copyメソッドの基本(3行→1行への書き方)
- Destinationを使ったスマートなコピー
- 値のみ・書式のみ貼り付け(PasteSpecial)
- 別シート・別ブックへのコピー
- シートのコピー(Before・After)
- CutCopyModeのクリア
Copyメソッドの基本を理解するには?
手動でのコピー操作(コピー→選択→貼り付け)をそのままコードにすると次の3行になります。
' 手動操作を忠実に再現した書き方(3行)
Cells(2, 1).Copy ' A2をコピー
Cells(3, 1).Select ' A3を選択
ActiveSheet.Paste ' 貼り付け
ただしこの書き方は、シートを選択する必要があり、他のシートを操作中に予期しない動作をすることがあります。次のセクションで紹介する Destination を使った書き方の方がシンプルで安全です。
Destinationでスマートにコピーするには?
Copy メソッドの Destination 引数に貼り付け先を指定すると、SelectもPasteも不要で1行で書けます。
' Destinationを使った書き方(1行)
Range("A2").Copy Destination:=Range("A3")
' 省略形でも書ける
Range("A2").Copy Range("A3")
範囲をまとめてコピーする場合も同様です。
' A1:C5の範囲をE1にコピー(貼り付け先は左上セルを指定)
Range("A1:C5").Copy Destination:=Range("E1")
' Cellsで指定する場合
Range(Cells(1, 1), Cells(5, 3)).Copy Destination:=Cells(1, 5)
Destinationのポイント:貼り付け先は左上のセル1つだけ指定すれば、コピー元と同じサイズで貼り付けられます。範囲全体を指定する必要はありません。
値のみ・書式のみ貼り付けるには?
数式を値に変換して貼り付けたい、書式だけコピーしたいといった場合は PasteSpecial を使います。Destination 引数とは組み合わせて使えないため、コピー後に貼り付け先を選択してから実行します。
' 値のみ貼り付け(数式を値に変換)
Range("A1:A10").Copy
Range("C1").PasteSpecial Paste:=xlPasteValues
' 書式のみ貼り付け
Range("A1:A10").Copy
Range("C1").PasteSpecial Paste:=xlPasteFormats
' 値と数値書式を貼り付け
Range("A1:A10").Copy
Range("C1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
' 貼り付け後はコピーモードを解除する
Application.CutCopyMode = False
よく使うPasteSpecialの種類:
| 定数 | 貼り付ける内容 |
|---|---|
xlPasteAll | すべて(デフォルト) |
xlPasteValues | 値のみ(数式を値に変換) |
xlPasteFormats | 書式のみ |
xlPasteFormulas | 数式のみ |
xlPasteValuesAndNumberFormats | 値と数値書式 |
xlPasteColumnWidths | 列幅のみ |
別シートにコピーするには?
シートをまたいでコピーするには、コピー元・貼り付け先の両方にシートを明示します。
' Sheet1のA1:C10をSheet2のA1にコピー
Sheets("Sheet1").Range("A1:C10").Copy _
Destination:=Sheets("Sheet2").Range("A1")
' 値のみ別シートにコピー
Sheets("Sheet1").Range("A1:A10").Copy
Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
変数を使うとさらに読みやすくなります。
Dim wsFrom As Worksheet
Dim wsTo As Worksheet
Set wsFrom = ThisWorkbook.Sheets("データ")
Set wsTo = ThisWorkbook.Sheets("集計")
wsFrom.Range("A1:D100").Copy Destination:=wsTo.Range("A1")
別ブックにコピーするには?
開いている別のブックへのコピーも同じ書き方で対応できます。
' 開いている「売上.xlsx」のSheet1にコピー
ThisWorkbook.Sheets("データ").Range("A1:C10").Copy _
Destination:=Workbooks("売上.xlsx").Sheets("Sheet1").Range("A1")
シートをコピーするには?
シート全体をコピーするには、シートオブジェクトに対して Copy を使い、Before または After で挿入位置を指定します。
' Sheet2をSheet2の後ろにコピー
Sheets("Sheet2").Copy After:=Sheets("Sheet2")
' Sheet2をSheet1の前にコピー
Sheets("Sheet2").Copy Before:=Sheets("Sheet1")
' 末尾にコピー
Sheets("テンプレート").Copy After:=Sheets(Sheets.Count)
' コピー後にシート名を変更する
Sheets("テンプレート").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "6月" ' コピー直後はコピーしたシートがアクティブになる
CutCopyModeを解除するには?
Copy や Cut を実行すると、セルの周りに点滅する点線(マーチングアンツ)が残ります。PasteSpecial を使った後は特に、このコピーモードを解除する処理を入れておきましょう。
' コピーモードを解除する
Application.CutCopyMode = False
Destination 引数を使った場合は自動で解除されます。PasteSpecial を使った場合は手動で解除が必要です。
切り取り(Cut)するには?
Copy を Cut に変えるだけで切り取りになります。
' A1をB1に切り取り&貼り付け
Range("A1").Cut Destination:=Range("B1")
' 別シートに切り取り&貼り付け
Sheets("Sheet1").Range("A1:A10").Cut _
Destination:=Sheets("Sheet2").Range("A1")
注意:Cut は PasteSpecial との組み合わせができません(値のみ切り取りなどはできない)。値のみ移動させたい場合は、値を変数に入れてから移動させる方法を使います。
まとめ
- 基本のコピー:
Range("A1").Copy Destination:=Range("B1")で1行で書ける。 - 値のみ貼り付け:
Copy後にPasteSpecial Paste:=xlPasteValuesを使う。 - 別シート・別ブック:コピー元・貼り付け先にシート名・ブック名を明示する。
- シートのコピー:
Sheets("名前").Copy After:=Sheets("位置")で挿入位置を指定。 - CutCopyModeの解除:
PasteSpecial後はApplication.CutCopyMode = Falseで解除する。 - 切り取り:
CopyをCutに変えるだけ。ただしPasteSpecialとの組み合わせは不可。
よくある質問
CopyとDestinationを使う方法とPasteSpecialを使う方法はどう使い分ければいいですか?
書式も含めてそのままコピーしたい場合は Destination 引数を使う方がシンプルです。値のみ・書式のみなど貼り付ける内容を選びたい場合は PasteSpecial を使います。
コピー後に点線(マーチングアンツ)が残ってしまいます
PasteSpecial を使った後に Application.CutCopyMode = False を実行すると解除されます。Destination 引数を使った場合は自動で解除されます。
数式が入ったセルを値として別シートにコピーするコードを教えてください
次のように書きます。
Sheets("Sheet1").Range("A1:A10").Copy
Sheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
シートをコピーしたあとに名前を変えるにはどうすればいいですか?
シートをコピーした直後は、コピーされたシートがアクティブシートになります。そのため ActiveSheet.Name = "新しい名前" で名前を変更できます。
コピー元とコピー先が同じサイズでないとエラーになりますか?
Destination 引数を使う場合、貼り付け先は左上のセル1つを指定すれば、コピー元と同じサイズで自動的に貼り付けられます。ただし貼り付け先の範囲に既存データがある場合は上書きされます。PasteSpecial を使う場合も同様に左上のセルだけ指定すれば問題ありません。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



