【VBA(Excelマクロ)】PasteSpecialで値のみ貼り付け【徹底解説】

スポンサードリンク
VBA

この記事を読んでわかること

  • 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
値と列幅をSheet2に貼り付け
スポンサードリンク

よくあるエラーと対処法

PasteSpecialメソッドは失敗しました

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など、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました