🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Copy Destination — クリップボードに触れずに範囲を移動する

|

Excel VBA の Copy Destination — クリップボードに触れずに範囲を移動する

TL;DRsrc.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(...).SelectSelection.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+CMsgBox、コピーと貼り付けの間で 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