
値のみ貼り付け&簡単高速にコピーできる方法がわかる
本記事ではコピー&ペースト(以降コピペ)の中から「値貼り付け」にフォーカスを当てて説明します。
まずは通常のコピーメソッドの仕様を整理してみましょう。
通常のコピーメソッドは値を貼り付ける際に「書式設定」などセルの色々な設定を引き継いでしまいます。
よって値のみ(値だけ)コピぺしたい時に困ります。具体的に申し上げますと以下のような場合です。
- コピー先のセルにはコピー元セルの背景を引き継ぎたくない
- コピー先のセルにはコピー元セルの罫線を引き継ぎたくない
- コピー先のセルにはコピー元セルに書いてある数式は不要で表示された値だけ欲しい
こんな時です。頻繁に起こり得る事例です。なんとか解決させたいものですね。

結論としては値貼り付けの際にはPasteSpacialメソッドを使う事にしましょう。
「値貼り付け」を使う事で全て解決させることができますよ。
PasteSpacialメソッドはコピーした値の貼り付け方法を指定する事ができます。
この中の機能を使って貼り付け時にコピー元の「値だけ」をコピー先に貼り付けてみます。
値貼付けが「できない」、「よく分からない」という方にも理解できるように画像を多めにして説明しています。
一連の操作を紹介した後でより「簡単」&「高速」にコピペを行う裏技を紹介しますよ。

関連記事
本記事のサンプル事例は「コピー元とコピー先が同じワークシート」の処理を取り上げています。
しかし実際の仕事の中ではワークブック間やワークシート間でコピペが行われることが多いです。
以下記事では複数のワークシートやワークブックを使って値をコピペしています。
コピペ応用編VBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます
この本で勉強しました
コピーメソッドを勉強している段階の皆様はご自身の仕事をマクロに置き換える為に試行錯誤している事でしょう。
初心者様~少しマクロが分かる方は事例集のようなものを読んでいただくと手数が増えて世界が広がります。
私会社の机の上にこの本を置いています。アイデアをもらいたい時に使っています。

コピーメソッド
コピーメソッドはコピー後の貼り付け作業でバリエーションを持っています。
まずは基本的なコピーメソッドを紹介します。その後応用として「値貼り付け」を紹介します。
基本:シンプルなコピーメソッド
まずは基本の形を知る為にシンプルなコピーメソッドを紹介します。
この方法(コード)だとセルの情報をすべて引き継いでしまうので今回の課題は達成できません。ご注意ください。
Sub コピーメソッド()
'セルA1の値をコピーしてセルA2に貼り付け
Range("A1").Copy Range("A2")
End Sub
仕組みとしては「Copy」という文字の後に([Destination])という引数で貼り付け先を指定します。
通常は貼り付け先を指定しますがこの引数はコの字かっこ(ブラケット)なので指定しなくても良いです。
指定しないとクリップボードにコピーする値を確保したまま貼り付け先無しでコードが進んでいきます。
プロシージャを抜ける際に「値をもったままです」という様なエラーは出ませんのでご注意ください。

繰り返しますがこの方法ではセルA1の書式設定も引き継いで値をコピーする事になります。
状態としては「セル全体」としてコピーする事になります。
応用:PasteSpecialメソッド
ここからは「値のみ貼り付ける」という作業を検討していきましょう。
具体的な方法としてはCopyメソッドでDestinationを指定せずに貼り付け用のコード(コマンド)を用意します。
用意するコードはPasteSpecialメソッドです。
VBEのオブジェクトブラウザー(VBEでF2キー押下)で探すと以下画像のようになります。

構文とパラメータは以下の通りです。量が多いのですが使い方はシンプルです。ゆっくり確認してください。
構文
構文はこちらです。引数にはコの字かっこ(ブラケット)が付いてないのですが全て必須ではなく任意の引数です。
引数を指定しない時は基本で紹介したCopyメソッドと同じ方法で貼り付けを行います。
PasteSpecial (Paste、 Operation、 SkipBlanks、 Transpose)
「値貼り付け」を実行する為にはPasteという引数をコントロールします。
引数(パラメータ)
引数として用意するパラメータは4つです。全て必須ではないです。
デフォルト設定(規定値)が決まっているので指定しなくてもエラーになりません。
番号 | 名前 | 型 | 説明 |
---|---|---|---|
1 | Paste | XlPasteType | 貼り付ける範囲の部分 。( xlPasteAll や xlPasteValues など) |
2 | Operation | XlPasteSpecialOperation | xlPasteSpecialOperationAdd などの貼り付け操作。 |
3 | SkipBlanks | バリアント | 既定値はFalse。 Trueを指定するとクリップボードの範囲内の 空白セルがコピー先の範囲に貼り付けされない。 |
4 | Transpose | バリアント | 既定値はFalse。 Trueを指定すると範囲を貼り付けるときに行と列を入れ替える。 |
XlPasteType
引数「Paste」で指定するのはXlPasteTypeです。12通り指定できます。困った時は以下リストを参照ください。
デフォルト(規定値)は1番です。値貼り付けは11番の「xlPasteValues」です。
番号 | 名前 | 値 | 説明 |
---|---|---|---|
1 | xlPasteAll | -4104 | すべてを貼り付けます。規定値。 |
2 | xlPasteAllExceptBorders | 7 | 輪郭以外のすべてを貼り付けます。 |
3 | xlPasteAllMergingConditionalFormats | 14 | すべてを貼り付け、条件付き書式をマージします。 |
4 | xlPasteAllUsingSourceTheme | 13 | ソースのテーマを使用してすべてを貼り付けます。 |
5 | xlPasteColumnWidths | 8 | コピーした列の幅を貼り付けます。 |
6 | xlPasteComments | -4144 | コメントを貼り付けます。 |
7 | xlPasteFormats | -4122 | コピーしたソースの形式を貼り付けます。 |
8 | xlPasteFormulas | -4123 | 数式を貼り付けます。 |
9 | xlPasteFormulasAndNumberFormats | 11 | 数式と数値の書式を貼り付けます。 |
10 | xlPasteValidation | 6 | 入力規則を貼り付けます。 |
11 | xlPasteValues | -4163 | 値を貼り付けます。 |
12 | xlPasteValuesAndNumberFormats | 12 | 値と数値の書式を貼り付けます。 |
XlPasteSpecialOperation
引数「Operation」で指定するのはXlPasteSpecialOperationです。
デフォルト(規定値)は4番です。コピー値と貼り付け側に用意された値を演算したうえで表示させます。
番号 | 名前 | 値 | 説明 |
---|---|---|---|
1 | xlPasteSpecialOperationAdd | 2 | コピーされたデータは、コピー先セルの値に追加されます。 |
2 | xlPasteSpecialOperationDivide | 5 | コピーされたデータは、コピー先セルの値を分割します。 |
3 | xlPasteSpecialOperationMultiply | 4 | コピーされたデータは、コピー先セルの値に乗算されます。 |
4 | xlPasteSpecialOperationNone | -4142 | 貼り付け操作で計算は行われません。規定値。 |
5 | xlPasteSpecialOperationSubtract | 3 | コピーされたデータは、コピー先セルの値から減算されます。 |
事例:PasteSpecialメソッドを使って「値貼り付け」を実行
サンプルプロシージャを作成してみました。引数PasteにxlPasteValuesを指定します。
これでコピーした値を貼り付ける際は値だけを貼り付ける事になります。
Sub コピーメソッド_値貼り付け()
'セルA1の値をコピーしてセルA2に値貼り付け
Range("A1").Copy
Range("A2").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
画像を用意しました。引数「Paste」のみを用意しているので「Paste:=」という書き方をしています。
この後にxlPasteValuesを指定する事で値貼り付けのコードを用意する事になります。

全ての引数を指定すると以下画像の様になります。

コピーの解除
コピーの指示が残ったままだと範囲指定したセルに点線が残ったままになります。これを解除します。
CutCopyModeプロパティにFalseを代入(挿入)しましょう。
Application.CutCopyMode = False
シンプルにこれだけです。クリップボードに保持している値をクリアしコピー状態を解除します。
参考:Worksheetオブジェクト(クラス)のPasteメソッド
Worksheetオブジェクト(クラス)もPasteメソッドを持っていますがおすすめはしません。
先に結論を申し上げますと扱いが難しいので使わなくても良いです。
理由は対象となるオブジェクト(クラス)がWorksheetオブジェクトになるので扱いが難しい為です。
使用時は Worksheets(“シート名”).Paste という書き方になります。(貼り付け元セルの情報を引き継ぎます)
これだとシートは指定できるのですが貼り付け先のセルを指定できません。
対策としてはPasteメソッドの少し前でセルを指定しておく必要があります。面倒ですよね。
あえて使う必要もないのでRangeオブジェクト(クラス)に用意されたPasteメソッドを使いましょう。

裏技:より簡単&高速にコピーできる方法
これは厳密に言うとコピペではないのかもしれません。
しかしコピペと同じ結果(値貼り付けと同じ効果)を用意する事ができます。
イコールで値貼り付けを再現する
こちらが実際のコードです。イコールを使ってコピー元のセルの値をコピー先のセルに展開します。
セルの情報は引き継ぎません。値貼り付けです。理由はコードの下の文章を読んでください。
Sub コピーメソッド_裏技()
'セルA2にセルA1の値を代入(Valueは省略可能)
Range("A2").Value = Range("A1").Value
End Sub
基本に立ち返ってみましょう。VBAではイコールがある時は「左辺に右辺を代入」という決まりがあります。
この理屈から「コピー先セルのValueプロパティにコピー元セルのValueプロパティを代入する」となります。
Valueプロパティだけを扱っているので背景や罫線などの情報はコピペされないです。
これでコピーしてから貼り付けという一連の作業が無くシンプルに値だけコピーする(記述する)ことができます。
実行時間の短縮になります
Copyメソッドを使った処理よりイコールを使った処理の方が時短につながります。
数個のセルの値を扱う際は作業時間に差は無いのですが十万単位のセルに対して作業をすると大きな差が出ます。
PCのスペックや作業量で差が出るのでここでは事例を紹介しません。気になる方はご自身で試してみてください。
「大量のコピペでマクロが重たいな」と感じた時はイコールを選択してみてください。
実行時間の短縮は配列がおすすめ
Copyメソッドもイコールを使った処理も結局は都度セルへのアプローチが必須です。
セルに関わる回数が増えれば増えるほど実行速度が遅くなります。この問題を解決させるのは「配列」です。
配列を使えばセルへのアプローチ回数を大幅に減らす事が出来るので実行時間の短縮が可能となります。
以下記事には配列を使ったコードと配列を使わないコードの比較ができます。興味ある方はお試しください。
時短といえば「配列」【検索にも使える】VBAの2次元配列で作業の高速化を実現させる
まとめ
値のみ(値だけ)を貼り付けたい時に使うPasteSpacialメソッドについて解説しました。
最後は少し違った値貼り付けの方法(イコールを使う方法)を見ていただきました。
コピペはシンプルな作業ですが奥が深いです。ここでは値貼り付けだけを取り上げましたが色々な事ができます。
まずは基本形と値貼り付けのコードを使い込んでください。その後でバリエーションを増やす事を考えましょう。
コピペのバリエーションを増やす事が出来たらコピペの対象を広げます。
ワークシート間やワークブック間のコピペが出来る様になると転記が可能になります。(ソースはこちら)
その後に複数のワークシートやワークブックを扱える様にする事を考えてください。
別ブックへのパスを理解する【VBA】絶対パス相対パスの書き方|理解はカレントディレクトリがポイント
複数ファイルにアプローチVBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する