和風スパゲティのレシピ

日本語でコーディングするExcelVBA

形式を選択して貼り付ける - PasteSpecial

セル範囲をコピーし、形式を選択して貼り付ける方法を解説します。

RangeオブジェクトのPasteSpecialメソッドを使用します。


ただし、「ただの値貼り付け」を実行したい場合は、
Copyメソッドを使用せず直接セルの値をValueプロパティでコピーする、

セル範囲.Value = セル範囲.Value

この記述の方が圧倒的に高速です。

こちらについての詳細は以下の記事をご覧ください。
www.limecode.jp

基本構文

コピー元範囲.Copy

貼り付け先範囲.PasteSpecial [貼付形式]

Application.CutCopyMode = False ' コピーモードを終了
' 加算・減算などの計算、空白セルの無視、行列の入れ替えを利用する場合
コピー元範囲.Copy

貼り付け先範囲.PasteSpecial [貼付形式], Operation:=[計算方法], SkipBlanks:=[空白セル無視], Operation:=[行列入れ替え]

Application.CutCopyMode = False ' コピーモードを終了


引数はすべて省略可能です。


第1引数である貼付形式(Paste)を省略するとxlPasteAll(すべて)になります。

が、形式を選択して貼り付けなのにその指定がないのは可読性に欠くので、
原則第1引数は省略せずにコーディングしてください。


空白セルの無視(SkipBlanks)と行列の入れ替え(Transpose)にはTrue/Falseが指定でき、省略時はFalse(どちらも行わない)となっています。

貼付形式(Paste)と計算方法(Operation)には以下の引数を指定可能です。

Pasteに指定できる値

定数 貼り付ける内容
xlPasteAll すべて
xlPasteAllExceptBorders 罫線以外のすべて
xlPasteAllMergingConditionalFormats 条件付き書式を統合したすべて
xlPasteAllUsingSourceTheme コピー元のテーマを使用したすべて
xlPasteColumnWidths 列幅
xlPasteComments コメント
xlPasteFormats 書式
xlPasteFormulas 数式
xlPasteFormulasAndNumberFormats 数式と表示形式
xlPasteValidation 入力規則
xlPasteValues
xlPasteValuesAndNumberFormats 値と表示形式

Operationに指定できる値

定数 計算内容
xlPasteSpecialOperationNone 計算しない
xlPasteSpecialOperationAdd 加算(+
xlPasteSpecialOperationSubtract 減算(-)
xlPasteSpecialOperationMultiply 乗算(×)
xlPasteSpecialOperationDivide 除算(÷)

サンプルコード

Dim コピー元範囲 As Range
Set コピー元範囲 = ThisWorkbook.Worksheets("Sheet1").Range("A1:C5")

Dim 貼り付け先セル As Range
Set 貼り付け先セル = ThisWorkbook.Worksheets("Sheet2").Range("E1")

' 値のみ貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteValues

' 数式のみ貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteFormulas

' 書式のみ貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteFormats

' 値と表示形式を貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteValuesAndNumberFormats

' 列幅を貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteColumnWidths

' コピー元の空白セルを無視
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteAll, SkipBlanks:=True

' 行と列を入れ替えて値貼り付け
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteValues, Transpose:=True

' 貼り付け先の値にコピー元の値を加算
コピー元範囲.Copy
貼り付け先セル.PasteSpecial xlPasteValues, Operation:=xlPasteSpecialOperationAdd

' コピーモードを終了(どの処理を選んでも必ず書くこと)
Application.CutCopyMode = False

解説

セル範囲を形式を選択して貼り付けるには、
RangeオブジェクトのPasteSpecialメソッドを使用します。

先にCopyメソッドでセル範囲をコピーし、
貼り付け先のRangeにPasteSpecialメソッドを実行してください。


Paste引数を指定することで、
値・数式・書式・列幅など、貼り付ける内容を選択できます。

他引数としてOperation、SkipBlanks、Transposeがありますが、
これらはすべて「形式を選択して貼り付け」ダイアログと同じ仕様です。


このコードを実行すると(正確にはCopyメソッドを引数なしで実行すると)、
Excelがコピーモードになってセルに点線マークが表示されます。

この状態のままだとCtrl+VだけでなくEnterキーも貼付けに割り当てられてしまうため、
コード実行後にはApplication.CutCopyMode = Falseを必ず実行してください。


また、冒頭にも書きましたが、ただの値貼り付けであれば、

セル範囲.Value = セル範囲.Value

の方が圧倒的に高速です。

詳細はこちらの記事をご覧ください。
www.limecode.jp