セル範囲をコピーし、形式を選択して貼り付ける方法を解説します。
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