【Excel VBA】形式を選択して貼り付ける(PasteSpecialメソッド)|Excel VBA |
Excelで「コピー → 貼り付け」をすると、値・数式・書式などを全部まとめて貼り付けられます。しかし「値だけ貼り付けたい」「書式はそのままで数式は消したい」など、貼り付ける内容を選びたい場面もあります。そんなときに使えるのが、VBAのPasteSpecialメソッドです。例えば、以下のような用途で使用されます。
・計算式なしで値のみ貼り付けたい
・書式だけコピーして見た目を統一したい
・数式だけ転記して再利用したい
本記事では、実務でよく使われる「値のみ貼り付け」や「数式のみ貼り付け」などの形式を中心に、業務効率化につながる実践的なVBAテクニックを初心者にもわかりやすく解説します。
まず、Excelの機能について説明します。Excelでセルをコピーすると、[ホーム]タブの[クリップボード]に[貼り付け]ボタンが表示されます。[貼り付け]ボタンをクリックすると、貼り付けの方法を選択できるメニューが展開されます。

貼り付けメニューの対応表
| 貼り付け | |||
|---|---|---|---|
| 貼り付け | 数式 | 数式と数値の書式 | 元の書式を保持 |
| 罫線なし | 元の列幅を保持 | 行/列の入れ替え | |
| 値の貼り付け | |||
| 値 | 値と数値の書式 | 値と元の書式 | |
| その他の貼り付けオプション | |||
| 書式設定 | リンク貼り付け | 図 | リンクされた図 |
さて、Excel VBAで「形式を選択して貼り付け」の機能を使用する場合は、PasteSpecialメソッドを使用します。通常のPasteメソッドではすべての情報(値・書式・数式など)が貼り付けられてしまいますが、PasteSpecialを使えば、貼り付ける内容を細かく制御できます。
Rangeオブジェクトに対するPasteSpecialメソッドの構文は次のとおりです。
Range (“貼り付け先のセル範囲”).PasteSpecial _
Paste :=(貼り付け内容[省略可能]),
Operation :=(演算方法[省略可能]),
SkipBlanks :=(空白セルを無視するか[省略可能]),
Transpose :=(行列を入れ替えるか[省略可能])
よく使われる貼り付け対象と引数「Paste」に使用する定数との対応表
| 貼り付け対象 | 定数 | 説明 |
|---|---|---|
| すべて | Paste | (※規定値) |
| 値のみ | xlPasteValues | 数式を除いた値のみを貼り付けたいときに便利 データの整形やCSVファイル出力前の処理に最適 |
| 書式のみ | xlPasteFormats | 罫線や背景色などの書式を統一したい場合に便利 |
| 数式のみ | xlPasteFormulas | 関数や計算式をそのまま転記したいときに便利 |
例:A1のセル領域をクリップボードにコピーして、B1に値を貼り付けします。
Sub values()
Range("A1").Copy
Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
コピー元セル範囲の大きさと、貼り付け先セル範囲の大きさが同じ場合は、Valueを使用したほうが高速です。詳しくは「【Excel VBA】セルの値だけをコピーする」を参照してください。
例:A1のセル領域をクリップボードにコピーして、C1に書式を貼り付けします。
Sub formats()
Range("A1").Copy
Range("C1").PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
End Sub
例:A1のセル領域をクリップボードにコピーして、D1に数式を貼り付けします。
Sub formulas()
Range("A1").Copy
Range("D1").PasteSpecial Paste:=xlPasteFormulas
Application.CutCopyMode = False
End Sub
コピー後の「点滅する枠線(マーキー)」を消すために「Application.CutCopyMode = False」を追加してコピー状態を解除しておくと、マクロ終了後にユーザーが誤って貼り付け操作をしてしまうリスクを防ぐことができます。
| 貼り付け対象 | 定数 | 説明 |
|---|---|---|
| 値と数値の書式 | xlPasteValuesAndNumberFormats | 値と数値の書式を同時に貼り付ける |
| 数式と数値の書式 | xlPasteFormulasAndNumberFormats | 数式と数値の書式を同時に貼り付ける |
| 入力規則 | xlPasteValidation | 入力規則(ドロップダウンなど)を貼り付ける |
| コメント | xlPasteComments | セルに付けたコメントを貼り付ける |
貼り付け形式の解説に加えて、Transpose引数を使って縦方向のデータを横方向に展開する方法を紹介します。行と列を入れ替えて貼り付けたい場合は、Transpose:=Trueを指定します。
例:A1:A12の縦方向に入力された「1月〜12月の売上」をC1から横方向に貼り付けて見やすくします。
Sub TransposeMonthly()
Range("A1:A12").Copy
Range("C1").PasteSpecial Transpose:=True
Application.CutCopyMode = False
End Sub
ここまで、PasteSpecialメソッドのいろいろな貼り付け方法をご紹介しました。
ただし、PasteSpecialメソッドが使用できない貼り付け方法もあります。PasteSpecialを使用できない「リンク貼り付け」については「【Excel VBA】セルに貼り付ける(Pasteメソッド)」を参照してください。