VBA×コピペ|値のみ貼り付け&簡単高速にコピーできる方法を公開

PasteSpecialメソッドのタイトル

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

値のみ貼り付け&簡単高速にコピーできる方法がわかる

本記事ではコピー&ペースト(以降コピペ)の中から「値貼り付け」にフォーカスを当てて説明します。

まずは通常のコピーメソッドの仕様を整理してみましょう。

通常のCopyメソッドは値を貼り付ける際に「書式設定」などセルの色々な設定を引き継いでしまいます。

よって値のみ(値だけ)コピぺしたい時に困ります。具体的に申し上げますと以下のような場合です。

  • コピー先のセルにはコピー元セルの背景を引き継ぎたくない
  • コピー先のセルにはコピー元セルの罫線を引き継ぎたくない
  • コピー先のセルにはコピー元セルに書いてある数式は不要で表示された値だけ欲しい

こんな時です。頻繁に起こり得る事例です。なんとか解決させたいものですね。

EnjoyExcel
EnjoyExcel

結論としては値貼り付けの際にはPasteSpacialメソッドを使う事にしましょう。

「値貼り付け」を使う事で全て解決させることができますよ。

PasteSpacialメソッドはコピーした値の貼り付け方法を指定する事ができます。

この中の機能を使って貼り付け時にコピー元の「値だけ」をコピー先に貼り付けてみます。

値貼付けが「できない」、「よく分からない」という方にも理解できるように画像を多めにして説明しています。

一連の操作を紹介した後でより「簡単」&「高速」にコピペを行う裏技を紹介しますよ。

関連記事

本記事のサンプル事例は「コピー元とコピー先が同じワークシート」の処理を取り上げています。

しかし実際の仕事の中ではワークブック間やワークシート間でコピペが行われることが多いです。

以下記事では複数のワークシートやワークブックを使って値をコピペしています。

コピペ応用編VBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます

コピペをした後に文字列を置き換える事も多いかと思います。置換についてまとめてみました。

この本で勉強しました

コピーメソッドを勉強している段階の皆様はご自身の仕事をマクロに置き換える為に試行錯誤している事でしょう。

初心者様~少しマクロが分かる方は事例集のようなものを読んでいただくと手数が増えて世界が広がります。

私会社の机の上にこの本を置いています。アイデアをもらいたい時に使っています。

仕事をマクロに置き換える事ができる

電子書籍(Kindleストア)もおすすめです。私一部の書籍は電子書籍で購入しています。

リンク先の記事では電子書籍を読む為の環境を簡単に構築する方法を紹介しています。

記事の中では電子書籍(Kindle)×デュアルモニターの作業環境を見ていただくことが出来ます。

電子書籍はPCでの作業効率が格段に上がるのでおすすめです。興味がある方は是非ご覧ください。

PasteSpecialメソッドのアイキャッチ

コピーメソッド

コピーメソッドはコピー後の貼り付け作業でバリエーションを持っています。

まずは基本的なコピーメソッドを紹介します。その後応用として「値貼り付け」を紹介します。

基本:シンプルなコピーメソッド

まずは基本の形を知る為にシンプルなコピーメソッドを紹介します。

この方法(コード)だとセルの情報をすべて引き継いでしまうので今回の課題は達成できません。ご注意ください。

Sub コピーメソッド()

    'セルA1の値をコピーしてセルA2に貼り付け
    Range("A1").Copy Range("A2")

End Sub

仕組みとしては「Copy」という文字の後に([Destination])という引数で貼り付け先を指定します。

通常は貼り付け先を指定しますがこの引数はコの字かっこ(ブラケット)なので指定しなくても良いです。

指定しないとクリップボードにコピーする値を確保したまま貼り付け先無しでコードが進んでいきます。

プロシージャを抜ける際に「値をもったままです」という様なエラーは出ませんのでご注意ください。

CopyメソッドのDestinationを指定
画像内の赤線をご覧ください。

繰り返しますがこの方法ではセルA1の書式設定も引き継いで値をコピーする事になります。

状態としては「セル全体」としてコピーする事になります。

応用:PasteSpecialメソッド

ここからは「値のみ貼り付ける」という作業を説明していきます。

具体的な方法としてはCopyメソッドでDestinationを指定せずに貼り付け用のコード(コマンド)を用意します。

用意するコードはPasteSpecialメソッドです。

Q
PasteSpecialメソッドについて教えてください。
A

コピーした値を貼り付ける際に

「形式、演算、空白の処置、行列の向き」を指示できるメソッドです。

VBEのオブジェクトブラウザー(VBEでF2キー押下)で探すと以下画像のようになります。

オブジェクトブラウザーでPasteSpecialメソッドを選択してみた
Rangeクラス(オブジェクト)が持っているPasteSpecialメソッドです。

構文とパラメータは以下の通りです。量が多いのですが使い方はシンプルです。ゆっくり確認してください。

構文

構文はこちらです。引数にはコの字かっこ(ブラケット)が付いてないのですが全て必須ではなく任意の引数です。

引数を指定しない時は基本で紹介したCopyメソッドと同じ方法で貼り付けを行います。

PasteSpacialメソッド

PasteSpecial (Paste、 Operation、 SkipBlanks、 Transpose)

「値貼り付け」を実行する為にはPasteという引数をコントロールします。

引数(パラメータ)

引数として用意するパラメータは4つです。全て必須ではないです。

デフォルト設定(規定値)が決まっているので指定しなくてもエラーになりません。

番号名前説明
1PasteXlPasteType貼り付ける範囲の部分 。( xlPasteAll や xlPasteValues など)
2OperationXlPasteSpecialOperationxlPasteSpecialOperationAdd などの貼り付け操作。
3SkipBlanksバリアント既定値はFalse。
Trueを指定するとクリップボードの範囲内の
空白セルがコピー先の範囲に貼り付けされない。
4Transposeバリアント既定値はFalse。
Trueを指定すると範囲を貼り付けるときに行と列を入れ替える。
4つの引数について説明しています。
XlPasteType

引数「Paste」で指定するのはXlPasteTypeです。12通り指定できます。困った時は以下リストを参照ください。

デフォルト(規定値)は1番です。値貼り付けは11番の「xlPasteValues」です

番号名前説明
1xlPasteAll-4104すべてを貼り付けます。規定値
2xlPasteAllExceptBorders7輪郭以外のすべてを貼り付けます。
3xlPasteAllMergingConditionalFormats14すべてを貼り付け、条件付き書式をマージします。
4xlPasteAllUsingSourceTheme13ソースのテーマを使用してすべてを貼り付けます。
5xlPasteColumnWidths8コピーした列の幅を貼り付けます。
6xlPasteComments-4144コメントを貼り付けます。
7xlPasteFormats-4122コピーしたソースの形式を貼り付けます。
8xlPasteFormulas-4123数式を貼り付けます。
9xlPasteFormulasAndNumberFormats11数式と数値の書式を貼り付けます。
10xlPasteValidation6入力規則を貼り付けます。
11xlPasteValues-4163値を貼り付けます。
12xlPasteValuesAndNumberFormats12値と数値の書式を貼り付けます。
最初の引数「Paste」のパラメータです。
XlPasteSpecialOperation

引数「Operation」で指定するのはXlPasteSpecialOperationです。

デフォルト(規定値)は4番です。コピー値と貼り付け側に用意された値を演算したうえで表示させます。

番号名前説明
1xlPasteSpecialOperationAdd2コピーされたデータは、コピー先セルの値に追加されます。
2xlPasteSpecialOperationDivide5コピーされたデータは、コピー先セルの値を分割します。
3xlPasteSpecialOperationMultiply4コピーされたデータは、コピー先セルの値に乗算されます。
4xlPasteSpecialOperationNone-4142貼り付け操作で計算は行われません。規定値
5xlPasteSpecialOperationSubtract3コピーされたデータは、コピー先セルの値から減算されます。
2番目の引数「Operation」のパラメータです。

一息つきましょう:手作業で「値貼り付け」

手作業でショートカットを使ってコピー&ペーストを行う際は「Ctrl+C」でコピー、「Ctrl+V」で貼り付けです。

しかしこの方法では値貼り付けになりません。セルの背景など色々な情報もペーストされてしまいます。

ここではショートカットで値貼り付けを実践してみます。まずは「Ctrl+C」でコピーをとりましょう。

その後値を貼り付けたいセルに移動してから「Ctrl+Alt+V」。すると以画像のようなダイアログボックスが表示されます。

キーボードで「V」をクリックすると値(V)に黒丸が移動します。そのあとEnterをクリックすると値貼り付け完了です。

ダイアログボックス「形式を選択して貼り付け」

ショートカットなら比較的簡単に作業効率を上げることができます。

VBAと合わせて使うとさらに作業効率を上げることができますよ。

ショートカットだけじゃない

事例:PasteSpecialメソッドを使って「値貼り付け」を実行

サンプルプロシージャを作成してみました。引数PasteにxlPasteValuesを指定します。

これでコピーした値を貼り付ける際は値だけを貼り付ける事になります。

Sub コピーメソッド_値貼り付け()

    'セルA1の値をコピーしてセルA2に値貼り付け
    Range("A1").Copy
    Range("A2").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False

End Sub

画像を用意しました。引数「Paste」のみを用意しているので「Paste:=」という書き方をしています。

この後にxlPasteValuesを指定する事で値貼り付けのコードを用意する事になります。

PasteSpacialメソッドの引数Pasteだけを指定
「値貼り付け」は引数PasteでxlPasteValuesを指定します。

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

PasteSpacialメソッドの引数をすべて指定
Pastespecialメソッドの引数をすべて指定しました。

コピーの解除

コピーの指示が残ったままだと範囲指定したセルに点線が残ったままになります。これを解除します。

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プロパティだけを扱っているので背景や罫線などの情報はコピペされないです。

これでコピーしてから貼り付けという一連の作業が無くシンプルに値だけコピーする(記述する)ことができます。

ご注意ください

基礎の再確認です。Valueプロパティは省略できます。よってイコールの左辺、右辺のValueは書かなくてもOKです。

実行時間の短縮になります

Copyメソッドを使った処理よりイコールを使った処理の方が時短につながります。

数個のセルの値を扱う際は作業時間に差は無いのですが十万単位のセルに対して作業をすると大きな差が出ます。

PCのスペックや作業量で差が出るのでここでは事例を紹介しません。気になる方はご自身で試してみてください。

大量のコピペでマクロが重たいな」と感じた時はイコールを選択してみてください。

実行時間の短縮は配列がおすすめ

Copyメソッドもイコールを使った処理も結局は都度セルへのアプローチが必須です。

セルに関わる回数が増えれば増えるほど実行速度が遅くなります。この問題を解決させるのは「配列」です。

配列を使えばセルへのアプローチ回数を大幅に減らす事が出来るので実行時間の短縮が可能となります。

以下記事では配列を使ったコードと配列を使わないコードの比較ができます。興味ある方はお試しください。

時短と言えば「配列」【検索にも使える】VBAの2次元配列で作業の高速化を実現させる

まとめ

値のみ(値だけ)を貼り付けたい時に使うPasteSpacialメソッドについて解説しました。

最後は少し違った値貼り付けの方法(イコールを使う方法)を見ていただきました。

コピペはシンプルな作業ですが奥が深いです。ここでは「値貼り付け」だけを取り上げましたが色々な事ができます。

まずは基本形と値貼り付けのコードを使い込んでください。その後でバリエーションを増やす事を考えましょう。

コピペのバリエーションを増やす事が出来たらコピペの対象を広げます。

ワークシート間やワークブック間のコピペが出来る様になると転記が可能になります。(ソースはこちら

その後に複数のワークシートやワークブックを扱える様にする事を考えてください。

別ブックへのパスを理解する【VBA】絶対パス相対パスの書き方|理解はカレントディレクトリがポイント

複数ファイルにアプローチVBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する

EnjoyExcel

タイトルとURLをコピーしました