この記事を読んでわかること
- VBAで値のみ貼り付け(書式のみ貼り付け)をする方法がわかる
- 「PasteSpecial」の書き方・使い方を学べる
- 「PasteSpecial」を使う場合の注意点やよくあるエラーを知っておける
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBA(Excelマクロ)のPasteSpecialとは?
「PasteSpecial」は、Excelの「形式を選択して貼り付け」機能を、VBAで自動化できるメソッドです。

メソッドとは、特定のオブジェクト(セルやシートなど)に対して実行できる機能で、
「オブジェクト名.メソッド名」というコードで記述します。
「Range(“A1”).PasteSpecial」と記述することで、
PasteSpecialメソッドをセルA1に対して実行したということになります。
「PasteSpecial」を使うことで、例えば以下のようなことが可能です。
コピー元の内容を自由に選んで貼り付けられるのが最大の特徴です。
では、「PasteSpecial」の使い方・書き方を見ていきましょう。
PasteSpecialの使い方・書き方
まずはPasteSpecialの基本構文をお見せします。
PasteSpecialの基本構文
▼基本構文
Range("コピー元のセル").Copy
Range("貼り付け先のセル").PasteSpecial Paste:=オプション(値のみ貼り付けなど)
▼使用例
Range("A1").Copy
Range("A2").PasteSpecial Paste:=xlPasteValues
簡単な使い方

上図が元データで、A1セルに数式が入っています。
このA1セルのデータをA2セルに値のみ貼り付けしてみましょう。
下記がそのVBAコードです。
Sub 値のみ貼り付け()
Range("A1").Copy
Range("A2").PasteSpecial Paste:=xlPasteValues
End Sub

A2セルにコピーできました。
画面の右上が「2」となっているため、数式が値のみに変換されているのがわかります。
上書きで値のみ貼り付け
貼り付け先のセルとコピー元のセルを同じにすることで、上書きすることも可能です。
Sub 値のみ貼り付けで上書き()
Range("A1").Copy
Range("A1").PasteSpecial Paste:=xlPasteValues ' A1セルに上書きされる
End Sub
元のセルの数式は消えてしまいますのでご注意ください。
複数セルを値のみ貼り付け
範囲選択した複数セルを値貼り付けすることも可能です。

Sub 複数セルを値のみ貼り付け()
Range("A1:C1").Copy
Range("A2:C2").PasteSpecial Paste:=xlPasteValues
End Sub

コピーモードや選択状態を解除
「PasteSpecial」を使用すると、コピー元のセルがコピーモード(点線)になったり、貼り付け先のセルが選択状態になったりします。

このような状態を解除したい場合は、貼り付け後に以下の2行を記述してください。
Application.CutCopyMode = False
Range("A1").Select
コピーモードや選択状態が解除されます。

オプション一覧
Range("A2").PasteSpecial Paste:=オプション名
オプションを変更することで、書式のみや列幅のみなど、値のみ貼り付け以外も可能です。
主な貼り付けオプション
- xlPasteValues:値のみ貼り付け
- xlPasteFormats:書式のみ貼り付け
- xlPasteFormulas:数式のみ貼り付け
- xlPasteColumnWidths:列幅のみ貼り付け
- xlPasteAll:すべてを貼り付け(デフォルト)
しかしながら、「PasteSpecial」を使う際に注意点が1つあります。
次項をご覧ください。
PasteSpecialを使う際の注意点
値のみや書式のみなど、いろいろなオプションがありますが、複数のオプションを同時に使うことはできません。
例えば値と書式のみを貼り付けしたい場合でも、それぞれを単体で実行するか、Withステートメントを利用する必要があります。
Sub 値と書式のみ貼り付け1()
Range("A1").Copy
Range("A2").PasteSpecial Paste:=xlPasteValues ' 値のみを貼り付け
Range("A2").PasteSpecial Paste:=xlPasteFormats ' 書式のみを貼り付け
End Sub
Sub 値と書式のみ貼り付け2()
Range("A1").Copy
with Range("A2") ' withを使用
.PasteSpecial Paste:=xlPasteValues ' 値のみを貼り付け
.Range("A2").PasteSpecial Paste:=xlPasteFormats ' 書式のみを貼り付け
End With
End Sub
より実践的な活用例
下記VBAコードは、Sheet1のA1~E5セルの値と列幅をSheet2に貼り付けした例です。
Sub 値と列幅だけをコピー()
Worksheets("Sheet1").Range("A1:E5").Copy ' Sheet1のA1~E5をコピー
With Worksheets("Sheet2").Range("A1:E5") ' WithでSheet2の操作をまとめる
.PasteSpecial Paste:=xlPasteValues ' 値のみ貼り付け
.PasteSpecial Paste:=xlPasteColumnWidths ' 列幅のみ貼り付け
End With
Application.CutCopyMode = False
Range("A1").Select
End Sub

よくあるエラーと対処法
PasteSpecialメソッドは失敗しました

「実行時エラー1004:RangeクラスのPasteSpecialメソッドは失敗しました」と表示されて処理が失敗する場合は、主に以下2つの原因が考えられます。
- 「.copy」を使用していない
- 処理が速すぎる
「.copy」を使用していない場合がほとんどです。
コードを再確認してみましょう。
稀に、処理が速すぎてエラーが出る場合があります。
処理の間にwaitを挟むなど、待機時間を設けるよう試してみてください。
Sub 値のみ貼り付け()
Range("A1").Copy
Application.Wait Now + TimeValue("00:00:05") ' 5秒待機
Range("A2").PasteSpecial Paste:=xlPasteValues
End Sub
最後に
VBA(Excelマクロ)のPasteSpecialで値のみ貼り付けをする方法について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!