実行時エラー1004「Range クラスの PasteSpecial メソッドが失敗しました」の原因と直し方

公開日:2026年10月10日 執筆:Takuya カテゴリ:エラー対処

値の貼り付け(PasteSpecial)で実行時エラー1004が出る原因を、コピーが消えている・切り取りの後に使っている・貼り付け先が合わない、の3つに分けて解説し、クリップボードを使わない確実な書き方を紹介します。

どんなエラーか

Copy でコピーしたあと、PasteSpecial で「値だけ貼り付け」などをしようとしたときに出るエラーです。マクロの記録で作ったコードをそのまま使っていると、よく出会います。

このエラーの特徴は、同じマクロでも動くときと動かないときがあることです。原因の多くは、コピーした内容(クリップボード)が貼り付けの時点で消えていることにあります。

よくある原因1:貼り付けの前にコピーが解除されている

Copy と PasteSpecial の間で、セルに値を書き込む、行を挿入・削除する、ブックを保存する、Application.CutCopyMode = False を実行する、といった操作をすると、コピーが解除されることがあります。その状態で PasteSpecial を実行すると、貼り付けるものがないためエラーになります。

対処としては、Copy の直後に PasteSpecial を書き、間に別の処理をはさまないことです。別のブックを開く処理などが間に入る場合は、開いたあとにコピーし直します。

よくある原因2:切り取り(Cut)の後に PasteSpecial を使っている

PasteSpecial は「コピー」した内容にしか使えません。Cut で切り取った範囲に対して PasteSpecial を実行すると、エラーになります。移動したい場合は、Cut の引数に貼り付け先を指定するのが確実です。

' エラーになる例
ws.Range("A1:C10").Cut
ws.Range("E1").PasteSpecial xlPasteValues

' 正しい例(切り取って E1 に移動する)
ws.Range("A1:C10").Cut Destination:=ws.Range("E1")

よくある原因3:貼り付け先が合わない

コピーの内容が残っていても、貼り付け先に問題があると同じエラーになります。次の点を確認します。

  • 貼り付け先のシートが保護されている
  • 貼り付け先に結合セルがあり、コピー元と形が合わない
  • 列全体(A:A など)をコピーして、1行目以外のセルに貼り付けようとしている
  • フィルターで絞り込んだ範囲や、複数の離れた範囲を選んで貼り付けようとしている

確実な方法:クリップボードを使わずに値を代入する

値だけを貼り付けたいのであれば、Copy と PasteSpecial を使わず、コピー先の Value にコピー元の Value を代入するのが最も確実です。クリップボードを使わないため、ほかの操作やほかのアプリの影響を受けず、処理も速くなります。

ポイントは、貼り付け先の大きさを Resize でコピー元とそろえることです。書式も必要な場合だけ、Copy と PasteSpecial xlPasteFormats を組み合わせます。

Dim src As Range
Set src = wsFrom.Range("A2:F" & lastRow)

' 値だけを貼り付け(PasteSpecial xlPasteValues と同じ結果)
wsTo.Range("A2").Resize(src.Rows.Count, src.Columns.Count).Value = src.Value

※リモートデスクトップやほかのアプリが同時にクリップボードを使うと、コピーの内容が書き換わることがあります。自動実行するマクロでは、できるだけクリップボードを使わない書き方にしてください。

ほかの記事