検証環境: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-12
要点 — マクロ記録は Select → Copy → Paste と書きます。データを Windows のクリップボード に通す 3 ステップです。遅く、走っている他の何かに消され、画面がちらつきます。値だけが欲しいなら、全体はクリップボードに一切触れない 1 行に縮みます:rngB.Value = rngA.Value。
Sub CopyDemo()
' (1) 値だけ — クリップボードなし、一瞬、中断不可
Sheet2.Range("A1:C100").Value = Sheet1.Range("A1:C100").Value
' (2) 値 と 書式を一手で — Destination 付きの .Copy
Sheet1.Range("A1:C100").Copy Destination:=Sheet2.Range("A1")
' (3) 1 つの側面だけ(値 / 書式 / 数式)— クリップボードが要る
Sheet1.Range("A1:C100").Copy
Sheet2.Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False ' クリップボードの「点線枠」を消す
End Sub
考え方の軸:クリップボードは、コードには不要な仲介人
あなた がコピー&ペーストするとき、クリップボードは一時置き場です — ここでコピー、あそこをクリック、ペースト。マクロ記録はその人間の手順を忠実に記録するので、記録コードは .Select・Selection.Copy・ActiveSheet.Paste だらけになります。でもあなたのコードは、すでに両方の範囲への直接の参照を持っています。何もクリックする必要はなく、一時置き場も要りません — データを直接運べます。
このひとつの転換が、以下のすべてを説明します。コピー&ペーストは 間違い ではありません。手作業の流れをコードに翻訳したもので、たいていその手作業には、コードがただ飛ばせる一歩がありました。「値を動かすのか、値と書式か、特定の側面か?」と問えば、正しい道具が落ちてきます — そして 3 つの答えのうち 2 つは、クリップボードに近づきません。
唯一のルール:代入は値を動かす。クリップボードは 側面 のためだけ
これが、記録されたコピー&ペーストの 90% を置き換えるルールです。
値 を動かすなら、ある範囲の
.Valueを別の範囲に代入する —CopyもPasteもクリップボードも不要。Copy+PasteSpecialが要るのは、セルの 特定の側面 だけ(値 だけ、書式 だけ、数式 だけ)が欲しく、ほかは要らないときだけです。
.Value = .Value は直接で、一瞬で、そして決定的に 中断できません。共有のグローバル状態を一切使わないので、途中で何かに消されることがないのです。「値を貼り付ける」2 つのやり方を比べてみましょう。
' ⚠ 記録スタイル — クリップボード、3 ステップ、脆い
Range("A1:A100").Select
Selection.Copy
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' ✓ 直接 — 1 行、クリップボードなし、消すものも中断するものもない
Range("C1:C100").Value = Range("A1:A100").Value
直接形は速く、短く、実行中にマシンで何が起ころうと生き残ります。記録形は、他の 3 つのプログラムが使っているかもしれないグローバルな資源を経由して、同じ仕事をします。
罠:PasteSpecial は、何にでも消されるクリップボードに依存する
PasteSpecial が 必要 なとき — たとえばセルの書式は残して数式は落としたいとき — Copy はデータを システムのクリップボード に置くことを思い出してください。それはグローバルで揮発性の状態です。2 つが噛みつきます。
Range("A1:A100").Copy
MsgBox "これから貼り付け" ' ⚠ 一部のダイアログ / 再計算はクリップボードを消す...
Range("C1").PasteSpecial xlPasteValues ' ...そして今、失敗するか何も貼られない
対処は小技ではなく習慣です。
CopyとPasteSpecialの間に何も置かない —MsgBoxも計算も 2 度目の copy もなし。コピー、貼り付け、終わり。- 後で必ず
Application.CutCopyMode = Falseで消す。コピー元が「点線枠」で囲まれたまま、クリップボードが構えたままにならないように。 - 値だけが欲しいなら、そもそも
PasteSpecialに手を出さない —.Value = .Valueを使えば、クリップボード問題の一群がまるごと消えます。
値 と 書式を一緒にコピーするなら、rng.Copy Destination:=target がちょうどよい点です。1 つの文で、すべてを運び、Destination 形はクリップボードを構えたままにせず移動を行います。
どれをいつ使うか
| 動かしたいもの | 使うもの | クリップボード? |
|---|---|---|
| 値だけ | rngB.Value = rngA.Value |
いいえ |
| 値 と 書式・数式、すべて | rngA.Copy Destination:=rngB |
いいえ |
| 値だけ(すでに Copy の最中) | .PasteSpecial xlPasteValues |
はい |
| 書式だけ | .PasteSpecial xlPasteFormats |
はい |
| 数式だけ | .PasteSpecial xlPasteFormulas |
はい |
| 行 ↔ 列を入れ替え | .PasteSpecial Transpose:=True |
はい |
意見:記録したコピー&ペーストをそのまま出荷するな
私が守る一線:記録されたコピー&ペーストは下書きであって、完成形ではない。 記録は どの オブジェクトとメソッドが要るかを見つける素晴らしい手段ですが、それが書くコード — Select・Selection・ActiveSheet.Paste、CutCopyMode の後始末なし — は最も遅く脆いやり方です。何が選択されているかに依存し、画面をちらつかせ、他のどのアプリにも踏まれうるクリップボードを通してすべてを送ります。
.Select を取り除き、本当に何を動かすのか決めれば、答えはほぼ常に 1 行に収まります。値だけなら .Value = .Value。すべてなら .Copy Destination:=。PasteSpecial は本物の「1 つの側面だけ」の場合に取っておき、Copy と貼り付けの間にぴたりと挟み、後で CutCopyMode を消す。こう書いたマクロは何分の一かの時間で走り、迷い込んだダイアログに壊されません — それが、自動化することの目的そのものです。
よくある VBA コピー&ペーストのミス(と直し方)
| 症状 | 原因 | 直し方 |
|---|---|---|
| PasteSpecial が失敗 / 何も貼られない | ダイアログや再計算が途中でクリップボードを消した | Copy と PasteSpecial の間に何も置かない |
| 大きな範囲でマクロが遅い | セル単位や Select ベースのコピー&ペースト |
.Value = .Value で範囲ごと動かす |
| コピー元が点線枠のまま残る | Application.CutCopyMode = False を忘れた |
貼り付け直後に消す |
| 値が欲しいのに書式が付いてきた | 値だけでなく Copy/Paste を使った |
.Value = .Value か PasteSpecial xlPasteValues |
| 「Worksheet クラスの Paste メソッドが失敗」 | 形の違う範囲に貼った、または何もコピーしていない | 寸法を合わせ、Copy が走ったか確認 |
| コピー中に画面がちらつく | ループ内の .Select/.Activate |
範囲を直接参照、ScreenUpdating = False |
コピーが積み上がってきたら — 代わりに「移動」を伝える
あなたはクリップボードの故障モードを学ぶつもりはありませんでした。「このシートの支払済みの行を、毎朝、値だけサマリーに移したい」だっただけです。.Select を記録から外し、.Value と PasteSpecial を選び分け、CutCopyMode を消すのを思い出す頃には、コピーの配管がマクロそのものになっています。ExcelMaster Agent なら、移動を自然な日本語で説明できます — 「ステータスが支払済みの行を、見出しを残してサマリーシートに値として移して」 — するとデータを直接、クリップボードを使わずに動かす Python を、ブックを先にバックアップしたうえで書き出します。無料で試す →
関連ガイド
- VBA Range — 選択せずにセルを参照する
- VBA Array — 範囲を一括で読み書きする
- VBA VLookup — 見つからないと落ちる罠と、Dictionary が勝つとき
- VBA Outlook — マクロからメールを正しく送る
- VBA For ループ — 実務の 8 例
よくある質問
VBA でクリップボードを使わずにコピー&ペーストするには?
値なら直接代入します:Range("C1:C100").Value = Range("A1:A100").Value。値 と 書式を一手で運び、クリップボードを構えたままにしたくないなら Range("A1:A100").Copy Destination:=Range("C1")。どちらも、遅く中断されうる Copy → PasteSpecial の往復を避けます。
VBA で値だけを貼り付けるには?
最も素直なのは 貼り付け先範囲.Value = コピー元範囲.Value で、クリップボードを一切使わず値をコピーします。すでに Copy の最中なら Range("C1").PasteSpecial Paste:=xlPasteValues のあと Application.CutCopyMode = False。コピーと貼り付けの間に MsgBox や計算を置かないこと。先にクリップボードが消されることがあります。
Application.CutCopyMode = False は何をする?
貼り付け後に、クリップボードの「点線枠」と保留中のコピーを消します。古いクリップボード状態と、コピー元が見た目に囲まれたままになるのを防ぎます。Copy + PasteSpecial の直後に実行します。
VBA のコピー&ペーストがとても遅いのはなぜ?
たいてい、範囲を .Select し、データをブロックごとにクリップボード経由で送るためで、しばしばループの中です。.Value = .Value で範囲ごと一括で動かし、.Select/.Activate を外し、実行中は Application.ScreenUpdating = False にします。
Copy Destination と PasteSpecial の違いは?
rng.Copy Destination:=target は すべて(値・書式・数式)を 1 文でコピーし、クリップボードを構えたままにしません。PasteSpecial は 1 つの側面だけ — 値・書式・数式 — をコピーするためにあり、事前の Copy と CutCopyMode = False の後始末を要します。完全なコピーには Destination、一部だけなら PasteSpecial を使います。
