VBAテクニック集 VBA一覧 デバッグ・エラー処理 実行時エラー

【VBA】貼り付け途中でエラーが起こる原因とは(PasteSpecial)|突然止まる・貼れない

Excel VBAでコピー&貼り付け処理を書いていると、
次のような 非常にストレスの高いトラブル に遭遇することがあります。

  • PasteSpecial の途中で突然エラーになる
  • 1回目は成功するが、2回目で止まる
  • 行数が多いとエラーになる
  • RPA実行時だけ貼り付けに失敗する
  • エラー内容が分かりづらく、原因特定ができない

特に厄介なのが、

  • コードは一見正しそう
  • CopyもPasteSpecialも書いてある
  • 環境やデータ量で再現したりしなかったりする

という点です。

PasteSpecialは、
Excel VBAの中でも 「状態依存・環境依存・タイミング依存」
の影響を非常に受けやすい命令です。

この記事では、
Excel VBAにおける
「PasteSpecialの途中でエラーが起こる原因」 をテーマに、

  • PasteSpecialの仕組みと前提条件
  • 貼り付け途中で止まる代表的な原因
  • エラーが起こるNGパターンと具体例
  • 実務で安定させるための設計方法
  • PasteSpecialに頼らない代替案

を、トラブル対応マニュアルとしてそのまま使えるレベル で徹底解説します。

✅ PasteSpecialとは何をする命令か

※まず前提を整理します。

・PasteSpecialの役割

PasteSpecial は、

  • コピーした内容の
    • 書式
    • 数式
    • 列幅

などを 指定して貼り付ける ための命令です。

Range("A1").PasteSpecial xlPasteValues

この1行で、

  • 直前にコピーされた内容
  • その一部(値のみなど)

を貼り付けることができます。


・PasteSpecialの重要な特徴

PasteSpecialは、

「クリップボードの状態」に完全依存する

という、
VBAの中でも特殊な命令です。

つまり、

  • コピーされていない
  • コピーが解除された
  • 別の操作が割り込んだ

といった状態では、
正常に動作しません。


✅ 「貼り付け途中でエラーが起こる」とはどういう状態か

※症状を切り分けます。

・よくある症状

  • ループ途中でエラー1004が出る
  • 数百行貼れた後、急に止まる
  • Copyは成功しているように見える
  • PasteSpecial行で止まる
  • 再実行すると動いたり動かなかったりする

これらはすべて、

PasteSpecialの前提条件が
途中で崩れている

ことを示しています。


✅ 原因①:コピー元が途中で変わっている(クリップボード上書き)

※最頻出原因です。

・よくあるコード

Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteValues

一見問題なさそうですが、
この 間に別の操作が入る と危険です。


・危険なパターン

Range("A1:A10").Copy

' ここで別の処理
Debug.Print "処理中"

Range("B1").PasteSpecial xlPasteValues

・なぜエラーになるのか

Debug.Printや他の操作が入ると、

  • クリップボードが解放される
  • コピー状態が解除される

ことがあり、
PasteSpecial実行時に

「貼り付けるものが存在しない」

状態になります。


・対策

  • Copy〜PasteSpecialの間に処理を挟まない
  • もしくは PasteSpecialを使わない

✅ 原因②:Selection / ActiveCell に依存している

※PasteSpecialと非常に相性が悪い書き方です。

・NGコード例

Range("A1:A10").Copy
Range("B1").Select
Selection.PasteSpecial xlPasteValues

・なぜ途中で失敗するのか

このコードは、

  • アクティブ状態
  • 選択状態
  • フォーカス

に強く依存します。

途中で、

  • 別シートがアクティブ
  • 他のセルが選択
  • RPA操作が割り込む

と、
貼り付け先が存在しない状態 になります。


・対策①:Selectionを使わない

Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteValues

・対策②:Activate / Selectを使わない設計

PasteSpecialは
直接Range指定が基本 です。

参考:【VBA】Activateを使わない方法




✅ 原因③:貼り付け先のRangeサイズが合っていない

※データ量依存でよく起きます。

・NG例

Range("A1:A10").Copy
Range("B1:B5").PasteSpecial xlPasteValues

・問題点

  • コピー元:10行
  • 貼り付け先:5行

この場合、
PasteSpecialは途中で失敗します。


・対策

貼り付け先は、

  • 左上セルのみ指定
  • もしくは同サイズ指定

が原則です。

Range("B1").PasteSpecial xlPasteValues

✅ 原因④:結合セルが含まれている

※見落とされやすいが非常に多い原因です。

・状況

  • コピー元に結合セル
  • 貼り付け先に結合セル
  • 結合状態が一致していない

・結果

PasteSpecialは、

結合状態を解釈できず
途中でエラー

になります。


・対策

  • 事前に結合解除
  • 結合セルを避ける設計
Range("A1:A10").UnMerge

✅ 原因⑤:フィルター・非表示行が絡んでいる

※実務で非常に多いです。

・NGパターン

  • オートフィルター中
  • 可視セルのみコピー
  • 通常のPasteSpecial

・なぜ失敗するのか

可視セルコピーは、

  • 不連続Range
  • 内部的に複雑な構造

になるため、
PasteSpecialが途中で失敗することがあります。


・対策

Range("A1:A10").SpecialCells(xlCellTypeVisible).Copy
Range("B1").PasteSpecial xlPasteValues

それでも不安定な場合は、
PasteSpecialを使わない方法 を検討します。

参考:【VBA】可視セルの一つ下に移動・取得する方法|非表示行をスキップして正確に処理


✅ 原因⑥:Application.CutCopyMode の影響

※途中でCopy状態が解除される代表例です。

・問題のある流れ

Range("A1:A10").Copy
Application.CutCopyMode = False
Range("B1").PasteSpecial xlPasteValues

・結果

  • Copy状態が解除
  • PasteSpecialでエラー

・対策

Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteValues
Application.CutCopyMode = False



✅ 原因⑦:イベント・画面更新が割り込んでいる

※ループ処理中に多発します。

・状況

  • Worksheet_Change
  • ScreenUpdating
  • 他イベント

が PasteSpecial の途中に割り込むと、
コピー状態が崩れます。


・対策

Application.EnableEvents = False
Application.ScreenUpdating = False

' Copy & PasteSpecial

Application.ScreenUpdating = True
Application.EnableEvents = True

✅ 原因⑧:RPA・バックグラウンド実行環境

※UiPathなどで最頻出です。

・RPA環境の特徴

  • 画面が存在しない
  • フォーカスが不安定
  • クリップボード操作が競合

この環境では、

PasteSpecialは非常に不安定

になります。


・対策:PasteSpecialを使わない

Range("B1:B10").Value = Range("A1:A10").Value

値貼り付けはこれが最強 です。


✅ PasteSpecialを使わない安全な代替案

※実務ではこちらが主流です。

・値貼り付け

Range("B1:B10").Value = Range("A1:A10").Value

・数式貼り付け

Range("B1:B10").Formula = Range("A1:A10").Formula

・書式貼り付け

Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteFormats

※書式だけはPasteSpecialが必要なケースあり。


✅ PasteSpecialを安定させる実務テンプレート

※どうしても使う場合。

Application.ScreenUpdating = False
Application.EnableEvents = False

Range("A1:A10").Copy
Range("B1").PasteSpecial xlPasteValues

Application.CutCopyMode = False
Application.EnableEvents = True
Application.ScreenUpdating = True

✅ よくある勘違い

※トラブルの元です。

・「PasteSpecialは万能」

→ 非常に不安定です。

・「Copyが成功しているからPasteも成功する」

→ 全く別問題です。


✅ まとめ:PasteSpecialのエラーは「クリップボード依存」が原因

  • PasteSpecialは状態依存
  • Selection依存は危険
  • コピー状態は簡単に崩れる
  • RPA環境では特に不安定
  • 代替手段があるなら使わない

「貼り付け途中でエラーが起こる」
PasteSpecialトラブルの正体は、

VBAのバグ
Excelの不具合

ではありません。

クリップボードに依存した
不安定な命令を、
不安定な状態で使っている

これがすべてです。

実務では、

  • 値代入
  • Formula代入

に置き換えるだけで、
PasteSpecial由来のエラーは ほぼ全滅 します。

ぜひこの記事を、
「PasteSpecialで詰まったときの最終判断基準」 として活用し、
安定したExcel VBAコードを書いていってください。

参考:【VBA】Excel VBAのPasteSpecialメソッドの活用方法

    -VBAテクニック集, VBA一覧, デバッグ・エラー処理, 実行時エラー