Paste は「クリップボードにあるものを“今ここに貼り付ける”動き」
まずイメージから。
Paste は「コピーされた内容(クリップボードの中身)を、指定した場所に貼り付ける動き」です。
手作業でやっている
「範囲をコピー → 貼り付け先をクリック → Ctrl+V」
これを VBA でやるときに登場します。
ただ、VBA では「Paste というメソッド単体」よりも、
Range.Copy(コピーする)Range.PasteSpecial(貼り付ける)- もしくは
Range.Copy Destination:=...(コピーと貼り付けを一気にやる)
という形で使うのが基本になります。
一番素直な流れ:「コピー → 貼り付け」のコード
クリップボードを使ったコピー&貼り付け
手作業に近い書き方から見てみます。
Sub SamplePasteBasic()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
' コピー(クリップボードに乗る)
ws.Range("A1:C3").Copy
' 貼り付け(E1 を左上として貼り付け)
ws.Range("E1").PasteSpecial
End Sub
VB流れとしては、
A1:C3 を Copy でクリップボードに乗せる
E1 を左上とする位置に PasteSpecial で貼り付ける
という動きです。
ここでのポイントは、
「Paste は“クリップボードに何かがある”ことが前提」
「貼り付け先は Range を指定して、そこに対して PasteSpecial を呼ぶ」
ということです。
でも本音を言うと:Paste より「Copy Destination:=」を基本にしてほしい
クリップボードを使わない書き方(おすすめ)
実務的で安定するのは、こちらの書き方です。
Sub SampleCopyDestination()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Copy Destination:=ws.Range("E1")
End Sub
VBこれは、
コピー元:ws.Range("A1:C3")
コピー先:Destination:=ws.Range("E1")
を一気に指定しているので、
「コピー → 貼り付け」を1行で完結させています。
この書き方のメリットは、
クリップボードを意識しなくていい
ユーザーの Ctrl+C / Ctrl+V と干渉しにくい
コードの意図が「どこからどこへ」で一目で分かる
という点です。
超初心者のうちは、
「Paste を直接使うより、まずは Copy Destination を標準にする」
と決めてしまった方が、結果的に安全でシンプルになります。
それでも Paste を使う場面を知っておきたい場合
Worksheet.Paste を使う書き方
古い書き方ですが、こういうコードも見かけます。
Sub SampleWorksheetPaste()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Copy
ws.Range("E1").Select
ws.Paste
End Sub
VBこれは、
A1:C3 をコピー
E1 を選択
そのシートの Paste メソッドで貼り付け
という流れです。
ただし、この書き方には弱点があります。
Select に依存している
アクティブセルやユーザー操作の影響を受けやすい
画面のチラつきや、意図しない場所への貼り付けリスクがある
なので、学習として「こういう書き方もある」と知っておく程度にして、
自分で書くときは極力避けるのがおすすめです。
PasteSpecial で「貼り付け方」を変える
値だけ貼り付ける例
Paste を語るなら、PasteSpecial は外せません。
「値だけ貼り付けたい」典型パターンです。
Sub SamplePasteValues()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("入力")
ws.Range("A1:C3").Copy
ws.Range("E1").PasteSpecial xlPasteValues
End Sub
VBここでは、
コピー元の値・数式・書式などをコピー
貼り付け先では「値だけ」を貼り付け
という動きになります。
「数式はコピーしたくない」「計算結果だけを別の場所に残したい」
というときに、PasteSpecial の出番です。
書式だけ貼り付ける例
ws.Range("A1:C3").Copy
ws.Range("E1").PasteSpecial xlPasteFormats
VBこれは、「見た目(色・罫線・フォントなど)だけ」を貼り付けます。
「この表と同じ見た目にしたい」というときに使えます。
Paste(貼り付け)を使うときに意識してほしい重要ポイント
できるだけ「アクティブ状態」に頼らない
避けたいパターンの典型です。
Range("A1:C3").Copy
Range("E1").Select
ActiveSheet.Paste
VBこれは、
どのシートかが曖昧
Select と ActiveSheet に依存している
ユーザーが途中で別シートをクリックすると、貼り付け先が変わる
という理由で、バグの温床になりがちです。
超初心者のうちから、
どのシートか → Worksheets(“名前”)
どの範囲か → Range(“A1:C3”)
どこへ → Destination:=Range(“…”)
という「全部を明示する」スタイルを体に染み込ませておくと、
Paste 周りのトラブルがかなり減ります。
「本当に Paste が必要か?」を一度立ち止まって考える
多くの場合、
「コピーしてすぐ貼り付ける」だけなら、Paste を意識する必要はありません。
Range("A1:C3").Copy Destination:=Range("E1")
VBこの1行で済むなら、それが一番シンプルで安全です。
Paste や PasteSpecial を使うのは、
値だけ貼り付けたい
書式だけ貼り付けたい
特殊な貼り付け(行列の入れ替えなど)をしたい
といった、「貼り付け方を変えたい」ときに限る、くらいの感覚でちょうどいいです。
まとめ:Paste は「クリップボードの中身をどう貼るか」を決める動き
Paste(と PasteSpecial)の本質は、
「Copy でクリップボードに乗った内容を、どこに・どのように貼り付けるかを指定する」
ことです。
押さえておきたいポイントをコンパクトにまとめると、
基本は Range.Copy Destination:=... で、Paste を意識しない書き方が安全
クリップボードを使う場合は、Range.PasteSpecial で貼り付け先と貼り付け方を指定する
値だけ・書式だけなど、貼り付け方を変えたいときに PasteSpecial が活躍する
Select や ActiveSheet に頼らず、「どのシートのどの範囲か」を毎回はっきり書く
