Copy は「セルや範囲を“そのまま別の場所へ複製する”ためのメソッド」
まずイメージから。
Copy は「選んだセル(Range)を、別の場所へコピーする命令」です。
手作業でやっている「コピー → 貼り付け」を、そのままコードでやる感じです。
Range は「どこをコピーするか」
Copy は「そこをコピーする」
貼り付け先は「Destination で指定する」
この3つをセットでイメージできると、一気に分かりやすくなります。
一番基本:Range.Copy Destination で「どこからどこへ」をはっきり書く
A1:C3 を E1 にコピーする
Sub SampleCopyBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Copy Destination:=ws.Range("E1")
End Sub
VBこの1行でやっていることは、
「入力シートの A1:C3 をコピーして、同じシートの E1 を左上とする位置に貼り付ける」
という動きです。
ここでの重要ポイントは、
コピー元 → ws.Range("A1:C3")
コピー先 → Destination:=ws.Range("E1")
Copy と Destination を“セットで書く”ことで、クリップボードを意識せずに完結する
という構造です。
Copy の2つの書き方:「Destination あり」と「貼り付け先で Paste」
Destination を使う書き方(おすすめ)
さっきのように、Copy の引数に Destination を書くパターンです。
ws.Range("A1:C3").Copy Destination:=ws.Range("E1")
VBこれは「コピーと貼り付けを一気にやる」イメージで、
クリップボードを意識しなくていいので、コードがスッキリします。
基本的には、この書き方を“標準”にしてしまってOKです。
クリップボードを使う書き方(できれば避けたい)
もう一つの書き方は、手作業に近い形です。
ws.Range("A1:C3").Copy ' コピー(クリップボードに乗る)
ws.Range("E1").PasteSpecial ' 貼り付け
VBこの書き方は、
クリップボードを使う
画面の状態やユーザー操作の影響を受けやすい
Application.CutCopyMode の制御など、少し気を使う
といった理由で、超初心者にはあまりおすすめしません。
まずは「Copy Destination:=」の形をしっかり使いこなす方が、安定したコードになります。
シートをまたいでコピーする
同じブック内の別シートへコピー
Sub SampleCopyBetweenSheets()
Dim wb As Workbook
Dim wsSrc As Worksheet
Dim wsDst As Worksheet
Set wb = ThisWorkbook
Set wsSrc = wb.Worksheets("入力")
Set wsDst = wb.Worksheets("集計")
wsSrc.Range("A1:C10").Copy Destination:=wsDst.Range("B2")
End Sub
VBここでの流れは、
どのブックか → ThisWorkbook
コピー元シート → “入力”
コピー先シート → “集計”
コピー元範囲 → A1:C10
コピー先左上 → B2
というふうに、「どこからどこへ」をはっきり分解して書いています。
重要なのは、
必ず「どのシートの Range か」を明示する
コピー元とコピー先を変数で握ると、読みやすさと安全性が一気に上がる
という点です。
Copy でコピーされるもの・されないもの
基本は「値・数式・書式など、ほぼ全部コピーされる」
Range.Copy は、手作業のコピーと同じイメージで、
値
数式
書式(色・罫線・フォント・表示形式)
コメント
などをまとめてコピーします。
「見た目も含めて、そっくりそのまま複製したい」
というときには、そのまま Copy を使えばOKです。
「値だけ」「書式だけ」コピーしたいときは PasteSpecial
少し先の話ですが、
「値だけ貼り付けたい」「書式だけコピーしたい」といった場合は、PasteSpecial を使います。
ws.Range("A1:C3").Copy
ws.Range("E1").PasteSpecial xlPasteValues ' 値だけ
ws.Range("E1").PasteSpecial xlPasteFormats ' 書式だけ
VBただし、これはクリップボードを使う書き方なので、
まずは「全部コピーでいい場面」を Copy Destination で書けるようになるのが先です。
Copy を使うときに意識してほしい重要ポイント
「どこからどこへ」を日本語で言ってからコードにする
コードを書く前に、必ず日本語で自分に言ってみてください。
「入力シートの A1:C10 を、集計シートの B2 から貼り付けたい」
これをそのままコードにすると、
どのブック → ThisWorkbook
どのシートから → Worksheets(“入力”)
どの範囲を → Range(“A1:C10”)
どのシートの → Worksheets(“集計”)
どこへ → Range(“B2”)
となり、最終的にこうなります。
ThisWorkbook.Worksheets("入力").Range("A1:C10") _
.Copy Destination:=ThisWorkbook.Worksheets("集計").Range("B2")
VB長く感じるかもしれませんが、
「どこからどこへ」が一目で分かる、かなり“いい書き方”です。
アクティブシートや選択状態に頼らない
避けたい書き方の例です。
Range("A1:C10").Copy
Range("B2").Select
ActiveSheet.Paste
VBこれは、
アクティブシートに依存している
Select や ActiveSheet に頼っていて、ユーザー操作に振り回されやすい
という理由で、バグの温床になりがちです。
超初心者のうちから、
「Select せずに、Range を直接指定する」
「ActiveSheet ではなく、必ず Worksheets(“名前”) を書く」
という癖をつけておくと、後で本当に自分を助けてくれます。
まとめ:Copy は「Range をそのまま別の場所へ運ぶための素直なメソッド」
Copy の本質は、
「ある Range を、値・数式・書式ごと、別の Range に複製する」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
Range.Copy Destination:=Range(...) の形で「どこからどこへ」を一気に書くのが基本
コピー元・コピー先は、必ず「どのシートか」まで含めて明示する
手作業のコピーと同じく、値・数式・書式など“ほぼ全部”がコピーされる
Select や ActiveSheet に頼らず、Range 同士を直接つなぐ書き方を身につける

