TL;DR —
PasteSpecialは フィルターを通した 貼り付けです。.Copyで範囲をクリップボードに 載せてから、どの層だけを通すか——値・書式・数式・列幅——を選び、必要なら操作(加算・乗算・転置)も 指定します。落とし穴は、これが 生きている クリップボードを読むという点です。.Copyの直後に置か なければならず、途中でクリップボードを消すもの——MsgBox、別のコピー、Excel がフォーカスを失うこと さえも——があるとPasteSpecial method of Range class failedになります。すべて をそのままコピー するならPasteSpecialは不要です——それは Copy Destination の 仕事です。
' PasteSpecial はクリップボードを読むので、Copy の直後に置く
Range("A1:A20").Copy ' クリップボードに読み込む
Range("C1").PasteSpecial Paste:=xlPasteValues ' 値だけが渡る
Application.CutCopyMode = False ' 点線の枠を消す
' 何が渡るか と どう着地するか を一度に指定する:
Range("E1:E20").Copy
Range("G1").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlPasteSpecialOperationAdd, Transpose:=False
PasteSpecial は、値だけ・書式だけを貼り付けたり、列を行に転置したりできる「形式を選択して貼り付け」
ダイアログのコード版です。ふつうの Copy Paste はセルを丸ごと動かしますが、
PasteSpecial はその中の 一つの層 だけが欲しくて他は要らないときに使う道具です。その力には、ほとん
どの人が最初につまずく厳しい制約が一つ伴います。まずはそこから見ていきましょう。
この記事で学べること
- 考え方の軸——
PasteSpecialは貼り付けにかけるフィルターであって、別種のコピーではない - ほとんどの失敗を防ぐ唯一のルール——読むのは 生きている クリップボードなので、
.Copyは直前に置く - 二つの軸——何が 渡るか(
Paste:=)と どう 着地するか(Operation:=、Transpose:=) - 値だけの貼り付けとその書式の罠(
xlPasteValues対xlPasteValuesAndNumberFormats) Application.CutCopyMode = Falseで後片付けするPasteSpecialが向かない場面と、直接移動のほうがよい理由
考え方の軸:貼り付けにかけるフィルター
ふつうの貼り付けはセルを丸ごとコピーします——値、数式、数値書式、罫線、塗りつぶし、すべて一度に。
PasteSpecial はその貼り付けの手前に フィルター を置きます。ソース全体を .Copy でクリップボード
に載せるところまでは同じですが、貼り付ける瞬間に「この層だけを通す」と指定できます。クリップボード
を、値・数式・書式・列幅という透明なシートの束だと考えてください。PasteSpecial は、その中から一枚
だけを取り出してターゲットに置ける唯一の道具です。
これがすべてであり、PasteSpecial が常に二段構えになる理由もここにあります。すべての層をクリップ
ボードに載せる .Copy と、どの層を残すか選ぶ .PasteSpecial です。前半を飛ばすとフィルターにかける
ものが何もなくなります——それがまさに、次に説明する失敗モードです。
最も大事なルール:読むのは「生きている」クリップボード
PasteSpecial method of Range class failed というエラーのほぼすべての裏には、この勘違いがあります。
PasteSpecial はコピーした範囲を覚えているわけではありません——実行された その瞬間 の
Windows のクリップボード を読みます。.Copy と .PasteSpecial の間で何かがクリップボードを消し
てしまうと、貼り付けるものが何もなくなり、実行時エラーが発生します。
Range("A1:A20").Copy
MsgBox "About to paste" ' この MsgBox がクリップボードを消すことがある
Range("C1").PasteSpecial xlPasteValues ' 実行時エラー 1004:PasteSpecial method ... failed
クリップボードは 状態を持ち、壊れやすい ものです。別の .Copy や .Cut、
Application.CutCopyMode = False、多くの場合 MsgBox や InputBox、ときには Excel がフォーカスを
失っただけでも消されます。対処は小技ではなく習慣です。.Copy と .PasteSpecial を隣り合わせに置
き、間には何も挟まない——ダイアログも、別のコピーも、ユーザー操作もなしです。ループの中で使うなら、
ループの外で一度コピーするのではなく、貼り付けの直前に毎回コピーしてください。
二つの軸:何が渡り、どう着地するか
PasteSpecial の呼び出しはすべて、二つの独立した選択で説明できます。一つ目の Paste:= は どの層
が渡るかを選びます。
Range("A1").PasteSpecial Paste:=xlPasteValues ' 計算結果の値だけ
Range("A1").PasteSpecial Paste:=xlPasteFormulas ' 数式(参照はずれる)
Range("A1").PasteSpecial Paste:=xlPasteFormats ' フォント・塗りつぶし・罫線——データなし
Range("A1").PasteSpecial Paste:=xlPasteColumnWidths ' 列幅だけ
Range("A1").PasteSpecial Paste:=xlPasteAll ' すべて(ふつうの貼り付けと同じ)
二つ目の Operation:= は、渡ってくる数値が既存の値とどう組み合わさるかを決めます——
xlPasteSpecialOperationAdd、Subtract、Multiply、Divide、None です。仕上げに二つのスイッチが
あります。Transpose:=True は行と列を入れ替え、SkipBlanks:=True はソースのセルが空のときターゲッ
トに触れずそのまま残します。「列のすべての数値に補正値を足す」という定番技は、これ一つの呼び出しで
済みます。補正値をセルに入れて .Copy し、対象範囲に対して
PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd を実行するだけです。
最もよく使う貼り付け「値だけ」と、その書式の罠
そもそも「形式を選択して貼り付け」を開く一番の理由が、この 値だけ の貼り付けです。生きている数式
を、それが計算した結果の数値に変えてくれるので、元のセルを削除したり揮発性の数式の再計算を止めたり
できます(詳しくは VBA 値の貼り付け を参照してください)。ただし罠があ
ります。素の xlPasteValues はコピーするのが 数値 であって 数値の書式 ではないので、日付の列は
45000 のようなシリアル値として貼り付き、通貨は記号を失います。
srcDates.Copy
dst.PasteSpecial Paste:=xlPasteValues ' 日付は 45000, 45001, ... として届く
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 日付は日付のまま届く——たいていこちらが欲しい
見た目 が重要なとき——日付、通貨、パーセントではほぼ常にそうです——は xlPasteValuesAndNumberFormats
を使いましょう。素の xlPasteValues は、書式を一切持ち込まず本当に生の数値だけが欲しいときのために
取っておきます。
後片付け:CutCopyMode と点線の枠
.Copy のあと、Excel はコピー元の周りにきらめく点線の枠を表示し、クリップボードを構えたままにしま
す。Application.CutCopyMode = False はその両方を消します——枠を外し、Excel に「もう終わった」と伝
えます。貼り付けが動くために厳密には必須ではありませんが、これをオンのままにしておくと、次に何気な
く押した Enter キーで再び貼り付けが起きてしまいますし、「生きたまま」残されたコピー範囲は、これま
で説明してきた脆さの一因にもなります。コピー・貼り付けのブロックの最後の行、PasteSpecial の直後に
置く習慣にしましょう。
PasteSpecial が向かない場面
PasteSpecial が力を発揮するのは、一つの層(値・書式・数式)や 操作(転置・加算)が必要なとき
だけです。範囲を そのまま ——値も数式も書式も一緒に——コピーしたいなら、クリップボードはまったく必
要ありません。src.Copy Destination:=dst が一文でコピーをすべて済ませてくれて、消えたり壊れたりする
ものもありません。値だけ が欲しいなら dst.Value = src.Value のほうがさらに速く、クリップボードに
も触れないので、この記事で挙げた失敗モードをすべて回避できます。判断はシンプルです。フィルターをか
けた 貼り付けには PasteSpecial を、丸ごとの コピーには
Copy Destination を使いましょう。代入で済む場面で PasteSpecial を
使うのは、いつか壊れる脆い一行を残すことになります。
ExcelMaster の活用
.Copy に .PasteSpecial を続けるこの組み合わせは、ちょっとしたテストでは動くのに本番で壊れる典型
です。二行の間に MsgBox が挟まったり、ループの外側で一度だけコピーしてしまったり、xlPasteValues
が日付の書式を静かに剥ぎ取ったり——そしてある日マクロが PasteSpecial method of Range class failed
を投げるか、シリアル値をそのまま信じる相手にそれを届けてしまいます。
ExcelMaster には、欲しい貼
り付けをそのまま伝えられます——「ここは値だけ貼って」「あのブロックの書式だけコピーして」「この列を
行に転置して」——すると、.Copy を隣接させたまま正しい PasteSpecial を書き、見た目が重要な場面で
は xlPasteValuesAndNumberFormats を選び、Application.CutCopyMode = False で後片付けまでしてくれ
ます。丸ごとコピーで済む場面ではクリップボードそのものを使いません。ブックとコードはあなたの手元に
残ります。
よくある質問
なぜ PasteSpecial method of Range class failed が起きるのか?
PasteSpecial が読むのは 生きている クリップボードで、そこに何もないからです。以前コピーした範囲
を覚えているのではなく、実行された瞬間にクリップボードにあるものを読みます。MsgBox、別の .Copy、
Application.CutCopyMode = False、あるいは Excel がフォーカスを失ったことなどでコピーと貼り付けの間
にクリップボードが消されていると、このメソッドは失敗します。.Copy と .PasteSpecial を、間に何も
挟まず隣り合う行に置いてください。
VBA で値だけを貼り付けるには?
コピー元を .Copy してから target.PasteSpecial Paste:=xlPasteValues を実行し、最後に
Application.CutCopyMode = False で締めます。セルが日付・通貨・パーセントなら、書式も一緒に来るよう
xlPasteValuesAndNumberFormats を使いましょう——素の xlPasteValues は生の数値をそのまま貼り付ける
ので、日付は 45000 のようなシリアル値として届きます。クリップボードすらいらず値だけでよいなら、
target.Value = source.Value はさらにシンプルです。
xlPasteValues と xlPasteValuesAndNumberFormats の違いは?
xlPasteValues は計算結果の数値と文字列だけを貼り付け、数値書式は落とします。だから日付はシリアル値
として表示され、通貨は記号を失います。xlPasteValuesAndNumberFormats は値 と 表示書式の両方を貼り
付けるので、日付は日付のまま、通貨は記号を保ったままになります。見た目が重要な、ほとんどの場合は後者
を使いましょう。
PasteSpecial で範囲を転置するには?
コピー元を .Copy してから Transpose:=True を付けて貼り付けます。例えば
target.PasteSpecial Paste:=xlPasteValues, Transpose:=True です。これで行と列が入れ替わります。デー
タだけを転置したいなら xlPasteValues と、書式も一緒に持っていきたいなら xlPasteAll と組み合わせ
ましょう。
PasteSpecial で範囲の数値に加算や乗算はできますか?
はい——それが Operation:= の軸です。演算に使う値を一つのセルに入れて .Copy し、対象範囲に対して
PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd(または Multiply、
Subtract、Divide)を呼びます。Excel はコピーした数値を既存の各値とその場で組み合わせます——列全
体を補正値で底上げしたり、係数で拡大縮小したりするのが一回の呼び出しで済みます。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-09。
関連ガイド: VBA 値の貼り付け · VBA Copy Destination · VBA Copy Paste · VBA Range · VBA Formula
