TL;DR —
src.Copy Destination:=dstは一文で範囲をそのままターゲットへコピーします。クリップボ ードには一切触れないので途中で壊されることもなく、消すべき点線の枠もなく、動作を遅くする.Selectもありません。運ぶのはセルの すべて——値、数式、書式です。値だけ が欲しいならdst.Value = src.Valueのほうがさらに直接的です。クリップボード (PasteSpecial)は、一つの層だけや操作が必要なときのために取っておき ましょう。
' 一文、クリップボードなし、Select なし:
Range("A1:C100").Copy Destination:=Sheet2.Range("A1")
' 値だけなら、さらに直接的(書式も数式もなし):
Sheet2.Range("A1:C100").Value = Range("A1:C100").Value
記録されたマクロを開くと、いつも同じ三行が出てきます。Range(...).Select、Selection.Copy、そして
ActiveSheet.Paste です。これはマクロ記録機能が 人間の操作 ——クリックしてコピーし、クリックして
貼り付ける——を Windows のクリップボードを経由して忠実に書き起こしたものです。あなたのコードにはその
どれも要りません。両方の範囲への参照をすでに持っているので、データを一方から他方へ直接動かせます。
Copy Destination がその方法であり、記録された Copy Paste のコードに対し
てできる最も効果の大きい整理です。
この記事で学べること
- 考え方の軸——コードは両方の範囲をすでに持っているので、クリップボードという仲介人は要らない
- 記録済みマクロを直す唯一のルール——
.SelectをやめてDestinationへ直接コピーする - 左上の規則——
Destinationに渡すのはターゲットの先頭セルだけでよい Copy Destination丸ごとが運ぶものとdst.Value = src.Valueが運ぶものの違い- シートやブックをまたいで、
Destinationを完全修飾してコピーする - それでも本当にクリップボードが必要な場面
考え方の軸:仲介人のいない直接移動
あなた がコピー&ペーストするとき、クリップボードは一時置き場です——ここでコピーし、手を動かし、 あそこで貼り付けます。マクロ記録機能はその手の動きをそのまま捉えるので、記録されたコードは絶えず選 択とアクティブ化を繰り返します。しかし VBA は手を持っていません。すでにソース範囲への直接の参照と、 ターゲットへの直接の参照を持っているので、一時置き場を挟まずにデータを渡せます。
Copy Destination は、その直接の受け渡しを一行にしたものです——source.Copy Destination:=target。
失敗しうるクリップボードの手順もなく、頼るべき選択状態もなく、カーソルが飛び回って画面がちらつくこ
ともありません。コピーとは「すでに持っている二つの参照の間でデータを動かすこと」だと捉え直せば、ク
リップボード版はその正体が見えてきます——コードが一度も持ったことのない、手作業の習慣の翻訳です。
最も大事なルール:Select とクリップボードを省く
記録されたパターンが、単に整えるのではなく置き換えるべき理由がここにあります。Range("A1:A10").Copy
のあと Range("C1").Select してから ActiveSheet.Paste するのは、遅く、脆く、フォーカスに依存しま
す。
' 記録済み——遅く、脆く、何が選択・アクティブかに依存する:
Range("A1:A10").Copy
Range("C1").Select
ActiveSheet.Paste
' 直接——一行、クリップボードなし、選択なし:
Range("A1:A10").Copy Destination:=Range("C1")
記録された版は .Select のたびに画面を再描画し、違うシートがアクティブだと壊れ、そのクリップボード
は迷い込んだ Ctrl+C や MsgBox、コピーと貼り付けの間で Excel がフォーカスを失うことでも消されます。
直接版にはそのどの失敗モードもありません。フォーカスを失う 先 も、クリップボード上で壊される も
の もないからです。記録機能が書いた .Select と .Activate はすべて削除し、Destination へ直接
コピーしましょう。 その方が速く、途中で邪魔されることもありません。
左上の規則:Destination は自分でサイズを合わせる
よくある心配は、ターゲットがソースとぴったり同じサイズでなければならないのでは、というものです。
Copy Destination に関してはそうではありません。ターゲットの 左上のセル を渡せば、Excel が残りを
ソースの形に合わせて埋めてくれます。
Range("A1:C100").Copy Destination:=Sheet2.Range("A1") ' A1 だけ渡せば A1:C100 まで埋まる
単一セルを渡すのが定石であり、いちばん安全な選択です。複数セルの Destination を渡す 場合 は、ソ
ースの整数倍でなければならず(Excel がタイル状に埋めようとします)、そうでないと実行時エラーになり
ます。意図してタイル状に敷き詰めたいのでなければ、先頭のセルだけを指定しましょう。これは、この後に
出てくる値だけの近道——二つの範囲のサイズが一致していなければならない——とは正反対です。
Copy Destination が運ぶもの、Value = Value が運ぶもの
この二つの直接的な方法は 違うもの を動かします。どちらを選ぶかがすべてです。
src.Copy Destination:=dstは 丸ごとのコピー です——値、数式、数値書式、罫線、塗りつぶし、す べてです。記録されたふつうの貼り付けをそのまま置き換えられます。dst.Value = src.Valueは 値だけ を動かします——数式はなく(結果が数値として貼り付きます)、 書式もありません。より速く、途中で邪魔されることもなく、二つの範囲は 同じサイズ でなければなり ません。
つまり判断はこうです。書式や数式も一緒に来てほしいなら Copy Destination を使う。数値だけが欲しくて、
むしろソースの数式は結果に固定されていてほしいなら .Value = .Value を使う(その固定については
VBA 値の貼り付け で扱っています)。どちらもクリップボードを使わない点
は同じで、違うのは何が渡るかだけです。
シートやブックをまたいでコピーする
Destination はただの範囲なので、どのシートにも、どの開いているブックにも置けます。完全修飾さえす
れば、コピーは指定した場所どこへでも届きます。
' シートをまたぐ——どちらもアクティブにする必要はない:
ThisWorkbook.Worksheets("Data").Range("A1:D50").Copy _
Destination:=ThisWorkbook.Worksheets("Report").Range("A1")
' 別の開いているブックへ:
Range("A1:D50").Copy Destination:=Workbooks("Summary.xlsx").Worksheets("Sheet1").Range("A1")
何も選択もアクティブ化もしないので、ソースとターゲットのシートはどちらもバックグラウンドのままで構 いません——コピーはユーザーが見ているものを乱しません。両端(ブック、ワークシート、範囲)をきちんと 完全修飾しておく習慣が、マクロ実行時にどのシートがアクティブであろうとコピーが確実に動く理由です。
それでもクリップボードが必要な場面
直接的な方法で、丸ごとのコピーや値だけの移動というよくあるケースはカバーできます。それでもクリップ
ボードが 必要 なのは フィルターをかけた 貼り付け——書式は付けるが数式は付けない値だけ、書式だけ、
列幅だけ、あるいは転置や加算のような操作です。それはまさに PasteSpecial
の出番で、そこでは .Copy と .PasteSpecial を隣接させておく必要があります。判断は、丸ごとのコピー
には Copy Destination を、値には .Value = .Value を既定にし、直接的な方法では表現できない一つの
層や操作が必要なときだけクリップボードに降りる、ということです。
ExcelMaster の活用
記録されたマクロの多くは、必要以上に遅く脆いものになっています。理由は一つで、データがまっすぐ動け
るはずなのに .Select の連なりを伴ってクリップボード経由でコピー&ペーストしているからです。それは
動いているように見えても、途中で Ctrl+C が割り込んだり、違うシートがアクティブだったりすると、間
違ったものを貼り付けたりエラーになったりします。
ExcelMaster は最初から直
接的な版を書きます——丸ごとのコピーには Copy Destination:=、値だけでよいときは
dst.Value = src.Value、どのシートもアクティブにしなくて済むよう両端を完全修飾し、.Select はどこ
にも書きません。単一の層や転置を明示的に求められたときだけ PasteSpecial に降ります。ブックとコード
はあなたの手元に残ります。
よくある質問
VBA で選択せずに範囲を別シートへコピーするには?
完全修飾した Destination を使います。
Worksheets("Data").Range("A1:C100").Copy Destination:=Worksheets("Report").Range("A1") のようにしま
す。どちらのシートもアクティブや選択状態である必要はなく、両方の範囲を指定するだけで十分です。記録
された Select / Copy / Paste より速く、ユーザーが今見ているものも乱しません。
コピー先の範囲はコピー元と同じサイズでなければなりませんか?
Copy Destination ではそうではありません。ターゲットの左上のセルだけを渡せば、Excel がソースに合わ
せてコピーのサイズを決めてくれます。複数セルの destination を渡すのは、それがソースの整数倍である場
合だけ機能します(Excel がタイル状に敷き詰めます)。単一セルを指定するのが安全な既定です。値だけの
形 dst.Value = src.Value はその例外で、こちらは二つの範囲が同じサイズでなければなりません。
Copy Destination と .Value = .Value の違いは?
Copy Destination は丸ごとのコピーで、値・数式・書式すべてが渡ります。dst.Value = src.Value は値
だけを動かします(数式は結果の数値として届き、書式は付いてきません)が、より速く、クリップボードに
も一切触れません。書式が重要なら Copy Destination を、数値だけが欲しいなら .Value = .Value を使
いましょう。
Copy Destination は Copy and Paste より速いですか?
はい、しかもより信頼できます。三文ではなく一文で済み、.Select のたびに起きる画面の再描画も避けら
れ、クリップボードを経由しないので、実行の途中で外部の何かがデータを消したり壊したりすることもあり
ません。値だけならさらに dst.Value = src.Value のほうが速くなります。
Copy Destination のあとにも Application.CutCopyMode = False は必要ですか?
いいえ。Copy Destination は、ふつうの .Copy のあとに貼り付けるときのようにクリップボードを構えた
ままにしないので、消すべき点線の枠もありません。Application.CutCopyMode = False が必要なのは、
PasteSpecial のようなクリップボードを使った貼り付けのあとだけです。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-09。
関連ガイド: VBA PasteSpecial · VBA 値の貼り付け · VBA Copy Paste · VBA Range · VBA Cells
