PasteSpecial(形式を選択して貼り付け)とは
セルをコピーして貼り付けるとき、「数式ではなく計算結果の値だけ貼り付けたい」「罫線や色などの書式だけコピーしたい」といった場面はよくあります。手作業なら「形式を選択して貼り付け」ダイアログを使いますが、VBAで自動化する場合はPasteSpecialメソッドを使います。
普通にRange.Copyで貼り付けると、数式・書式・罫線などすべてがそのままコピーされてしまいます。集計表のレイアウトを崩したくない場合や、他のシートの数式をそのまま持ち込みたくない場合には、PasteSpecialで貼り付ける形式を細かく指定することが重要です。この記事では、代表的な使い方を実例付きで解説します。
基本構文
PasteSpecialは、コピー元の範囲をCopyした後、貼り付け先の範囲に対して呼び出します。
コピー元.Copy
貼り付け先.PasteSpecial Paste:=貼り付ける形式
Paste引数には、xlPasteValues(値のみ)やxlPasteFormats(書式のみ)といった定数を指定します。主な定数は以下の通りです。
| 定数 | 説明 |
|---|---|
| xlPasteAll | すべて(通常の貼り付けと同じ) |
| xlPasteValues | 値のみ |
| xlPasteFormats | 書式のみ |
| xlPasteFormulas | 数式のみ |
| xlPasteColumnWidths | 列幅のみ |
| xlPasteValuesAndNumberFormats | 値と表示形式 |
値だけを貼り付ける
数式の計算結果だけを別のセルに貼り付けたい場合はxlPasteValuesを使います。集計結果を別シートに数値として固定したいときによく使われます。
Sub PasteValuesOnly()
Dim wsSource As Worksheet
Dim wsTarget As Worksheet
Set wsSource = ThisWorkbook.Worksheets("集計元")
Set wsTarget = ThisWorkbook.Worksheets("結果")
wsSource.Range("A1:C10").Copy
wsTarget.Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
Copyを実行するとExcelは「コピーモード」(点線で囲まれた状態)になります。貼り付け後はApplication.CutCopyMode = Falseでこの状態を解除しておくのがマナーです。解除しないと、次にユーザーが何か操作したときに「コピー中は実行できません」という警告が出ることがあります。
書式だけを貼り付ける
罫線や色、フォントなどの見た目だけをコピーしたい場合はxlPasteFormatsを使います。
Sub PasteFormatsOnly()
Range("A1:D1").Copy
Range("A10:D10").PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
End Sub
見出し行の書式を別の行にも適用したい、といった場面で活用できます。値や数式は変更されず、見た目だけがコピー元と同じになります。
演算を伴う貼り付け(一括計算)
PasteSpecialのOperation引数を使うと、貼り付けと同時に四則演算を行うことができます。たとえば「すべてのセルの値を2倍にする」といった一括計算がワンステップで可能です。
Sub PasteWithMultiply()
Dim rateCell As Range
Set rateCell = Range("F1")
rateCell.Value = 1.1 '10%増しにする係数
rateCell.Copy
Range("A1:A10").PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationMultiply
Application.CutCopyMode = False
End Sub
このコードでは、F1セルに入力した1.1をコピーし、A1:A10の各セルに対して「かけ算」を行いながら貼り付けています。結果として、A1:A10の値がすべて1.1倍になります。Operation引数には他にもxlPasteSpecialOperationAdd(加算)、xlPasteSpecialOperationSubtract(減算)、xlPasteSpecialOperationDivide(除算)が指定できます。
行と列を入れ替えて貼り付ける(転置)
表の行と列を入れ替えて貼り付けたい場合は、Transpose:=Trueを指定します。
Sub PasteTransposed()
Range("A1:A5").Copy
Range("C1").PasteSpecial Paste:=xlPasteAll, Transpose:=True
Application.CutCopyMode = False
End Sub
縦に並んだデータを横並びに変換したいときなど、レイアウト変更が一瞬で完了します。
PasteSpecialを使うメリットと注意点
Range.Value = Range.Valueという代入方式でも値だけをコピーすることは可能ですが、PasteSpecialには以下のようなメリットがあります。
- 書式や列幅など、値以外の要素も個別に指定してコピーできる
Operation引数による一括計算ができるTransposeによる行列入れ替えができる
一方で注意点もあります。
- Copyしてから貼り付ける2ステップが必要:
Range.Value = Range.Valueのような1行では書けないため、コードがやや長くなります。 - 貼り付け先が結合セルだとエラーになることがある:あらかじめ結合を解除しておくか、貼り付け先の構成を確認しておきましょう。
- CutCopyModeの解除忘れ:解除し忘れると、コピー状態の点線が残ったままになり、ユーザーが混乱する原因になります。
まとめ
PasteSpecialメソッドを使うと、「値だけ」「書式だけ」「演算しながら」「行列を入れ替えて」など、通常のコピー&貼り付けでは難しい柔軟な貼り付け処理をVBAで自動化できます。
Paste引数で貼り付ける要素(値・書式・数式など)を指定するOperation引数で貼り付けと同時に四則演算ができるTranspose:=Trueで行と列を入れ替えて貼り付けられる- 貼り付け後は
Application.CutCopyMode = Falseを忘れずに実行する
集計表の作成や他シートへのデータ転記など、実務でよく使う場面が多いメソッドなので、ぜひ活用してみてください。


コメント