VBAのCopyメソッドの使い方|Destination・PasteSpecial・シートコピーの使い分け

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を解除するには?

CopyCut を実行すると、セルの周りに点滅する点線(マーチングアンツ)が残ります。PasteSpecial を使った後は特に、このコピーモードを解除する処理を入れておきましょう。

' コピーモードを解除する
Application.CutCopyMode = False

Destination 引数を使った場合は自動で解除されます。PasteSpecial を使った場合は手動で解除が必要です。

切り取り(Cut)するには?

CopyCut に変えるだけで切り取りになります。

' A1をB1に切り取り&貼り付け
Range("A1").Cut Destination:=Range("B1")

' 別シートに切り取り&貼り付け
Sheets("Sheet1").Range("A1:A10").Cut _
    Destination:=Sheets("Sheet2").Range("A1")

注意:CutPasteSpecial との組み合わせができません(値のみ切り取りなどはできない)。値のみ移動させたい場合は、値を変数に入れてから移動させる方法を使います。

まとめ

  • 基本のコピーRange("A1").Copy Destination:=Range("B1") で1行で書ける。
  • 値のみ貼り付けCopy 後に PasteSpecial Paste:=xlPasteValues を使う。
  • 別シート・別ブック:コピー元・貼り付け先にシート名・ブック名を明示する。
  • シートのコピーSheets("名前").Copy After:=Sheets("位置") で挿入位置を指定。
  • CutCopyModeの解除PasteSpecial 後は Application.CutCopyMode = False で解除する。
  • 切り取りCopyCut に変えるだけ。ただし 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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

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

コメントする

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

上部へスクロール