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

Excel VBA の Copy Paste — クリップボードを飛ばして速く・壊れないマクロに

|

Excel VBA の Copy Paste — クリップボードを飛ばして速く・壊れないマクロに

検証環境: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-12

要点 — マクロ記録は SelectCopyPaste と書きます。データを 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

考え方の軸:クリップボードは、コードには不要な仲介人

あなた がコピー&ペーストするとき、クリップボードは一時置き場です — ここでコピー、あそこをクリック、ペースト。マクロ記録はその人間の手順を忠実に記録するので、記録コードは .SelectSelection.CopyActiveSheet.Paste だらけになります。でもあなたのコードは、すでに両方の範囲への直接の参照を持っています。何もクリックする必要はなく、一時置き場も要りません — データを直接運べます。

このひとつの転換が、以下のすべてを説明します。コピー&ペーストは 間違い ではありません。手作業の流れをコードに翻訳したもので、たいていその手作業には、コードがただ飛ばせる一歩がありました。「値を動かすのか、値と書式か、特定の側面か?」と問えば、正しい道具が落ちてきます — そして 3 つの答えのうち 2 つは、クリップボードに近づきません。

唯一のルール:代入は値を動かす。クリップボードは 側面 のためだけ

これが、記録されたコピー&ペーストの 90% を置き換えるルールです。

を動かすなら、ある範囲の .Value を別の範囲に代入する — CopyPaste もクリップボードも不要。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   ' ...そして今、失敗するか何も貼られない

対処は小技ではなく習慣です。

  • CopyPasteSpecial の間に何も置かない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 はい

意見:記録したコピー&ペーストをそのまま出荷するな

私が守る一線:記録されたコピー&ペーストは下書きであって、完成形ではない。 記録は どの オブジェクトとメソッドが要るかを見つける素晴らしい手段ですが、それが書くコード — SelectSelectionActiveSheet.PasteCutCopyMode の後始末なし — は最も遅く脆いやり方です。何が選択されているかに依存し、画面をちらつかせ、他のどのアプリにも踏まれうるクリップボードを通してすべてを送ります。

.Select を取り除き、本当に何を動かすのか決めれば、答えはほぼ常に 1 行に収まります。値だけなら .Value = .Value。すべてなら .Copy Destination:=PasteSpecial は本物の「1 つの側面だけ」の場合に取っておき、Copy と貼り付けの間にぴたりと挟み、後で CutCopyMode を消す。こう書いたマクロは何分の一かの時間で走り、迷い込んだダイアログに壊されません — それが、自動化することの目的そのものです。

よくある VBA コピー&ペーストのミス(と直し方)

症状 原因 直し方
PasteSpecial が失敗 / 何も貼られない ダイアログや再計算が途中でクリップボードを消した CopyPasteSpecial の間に何も置かない
大きな範囲でマクロが遅い セル単位や Select ベースのコピー&ペースト .Value = .Value で範囲ごと動かす
コピー元が点線枠のまま残る Application.CutCopyMode = False を忘れた 貼り付け直後に消す
値が欲しいのに書式が付いてきた 値だけでなく Copy/Paste を使った .Value = .ValuePasteSpecial xlPasteValues
「Worksheet クラスの Paste メソッドが失敗」 形の違う範囲に貼った、または何もコピーしていない 寸法を合わせ、Copy が走ったか確認
コピー中に画面がちらつく ループ内の .Select/.Activate 範囲を直接参照、ScreenUpdating = False

コピーが積み上がってきたら — 代わりに「移動」を伝える

あなたはクリップボードの故障モードを学ぶつもりはありませんでした。「このシートの支払済みの行を、毎朝、値だけサマリーに移したい」だっただけです。.Select を記録から外し、.ValuePasteSpecial を選び分け、CutCopyMode を消すのを思い出す頃には、コピーの配管がマクロそのものになっています。ExcelMaster Agent なら、移動を自然な日本語で説明できます — 「ステータスが支払済みの行を、見出しを残してサマリーシートに値として移して」 — するとデータを直接、クリップボードを使わずに動かす Python を、ブックを先にバックアップしたうえで書き出します。無料で試す →

関連ガイド

よくある質問

VBA でクリップボードを使わずにコピー&ペーストするには? 値なら直接代入します:Range("C1:C100").Value = Range("A1:A100").Value。値 書式を一手で運び、クリップボードを構えたままにしたくないなら Range("A1:A100").Copy Destination:=Range("C1")。どちらも、遅く中断されうる CopyPasteSpecial の往復を避けます。

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 文でコピーし、クリップボードを構えたままにしません。PasteSpecial1 つの側面だけ — 値・書式・数式 — をコピーするためにあり、事前の CopyCutCopyMode = False の後始末を要します。完全なコピーには Destination、一部だけなら PasteSpecial を使います。