値のみ貼り付け&簡単高速にコピーできる方法がわかる
本記事ではコピー&ペースト(以降コピペ)の中から「値貼り付け」にフォーカスを当てて説明します。
まずは通常のコピーメソッドの仕様を整理してみましょう。
通常のCopyメソッドは値を貼り付ける際に「書式設定」などセルの色々な設定を引き継いでしまいます。
よって値のみ(値だけ)コピぺしたい時に困ります。具体的に申し上げますと以下のような場合です。
こんな時です。頻繁に起こり得る事例です。なんとか解決させたいものですね。
結論としては値貼り付けの際にはPasteSpacialメソッドを使う事にしましょう。
「値貼り付け」を使う事で全て解決させることができますよ。
PasteSpacialメソッドはコピーした値の貼り付け方法を指定する事ができます。
この中の機能を使って貼り付け時にコピー元の「値だけ」をコピー先に貼り付けてみます。
値貼付けが「できない」、「よく分からない」という方にも理解できるように画像を多めにして説明しています。
一連の操作を紹介した後でより「簡単」&「高速」にコピペを行う裏技を紹介しますよ。
関連記事
コピペをした後に文字列を置き換える事も多いかと思います。置換についてまとめてみました。
置換はこの関数1択マクロで文字列の置換はVBA関数のReplace|4つの方法を比較
範囲指定セルのコピペについても記事を用意しました。
範囲指定セル間の代入【Rangeオブジェクト】範囲指定セルのコピー&ペースト|イコールで高速に処理
この本で勉強しました
コピーメソッドを勉強している段階の皆様はご自身の仕事をマクロに置き換える為に試行錯誤している事でしょう。
初心者様~少しマクロが分かる方は事例集のようなものを読んでいただくと手数が増えて世界が広がります。
私会社の机の上にこの本を置いています。アイデアをもらいたい時に使っています。
電子書籍もおすすめです。私一部の書籍は電子書籍で購入しています。
コピーメソッド
コピーメソッドはコピー後の貼り付け作業でバリエーションを持っています。
まずは基本的なコピーメソッドを紹介します。その後応用として「値貼り付け」を紹介します。
基本:シンプルなコピーメソッド
まずは基本の形を知る為にシンプルなコピーメソッドを紹介します。
この方法(コード)だとセルの情報をすべて引き継いでしまうので今回の課題は達成できません。ご注意ください。
Sub コピーメソッド()
'セルA1の値をコピーしてセルA2に貼り付け
Range("A1").Copy Range("A2")
End Sub
仕組みとしては「Copy」という文字の後に([Destination])という引数で貼り付け先を指定します。
通常は貼り付け先を指定しますがこの引数はコの字かっこ(ブラケット)なので指定しなくても良いです。
指定しないとクリップボードにコピーする値を確保したまま貼り付け先無しでコードが進んでいきます。
プロシージャを抜ける際に「値をもったままです」という様なエラーは出ませんのでご注意ください。
繰り返しますがこの方法ではセルA1の書式設定も引き継いで値をコピーする事になります。
状態としては「セル全体」としてコピーする事になります。
応用:PasteSpecialメソッド
ここからは「値のみ貼り付ける」という作業を説明していきます。
具体的な方法としてはCopyメソッドでDestinationを指定せずに貼り付け用のコード(コマンド)を用意します。
用意するコードはPasteSpecialメソッドです。
VBEのオブジェクトブラウザー(VBEでF2キー押下)で探すと以下画像のようになります。
構文とパラメータは以下の通りです。量が多いのですが使い方はシンプルです。ゆっくり確認してください。
構文
構文はこちらです。引数にはコの字かっこ(ブラケット)が付いてないのですが全て必須ではなく任意の引数です。
引数を指定しない時は基本で紹介したCopyメソッドと同じ方法で貼り付けを行います。
「値貼り付け」を実行する為には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 | コピーされたデータは、コピー先セルの値から減算されます。 |
一息つきましょう:手作業で「値貼り付け」
手作業でショートカットを使ってコピー&ペーストを行う際は「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を指定する事で値貼り付けのコードを用意する事になります。
こちらは全ての引数を指定しています。以下画像の様になります。
引数(パラメータ)を全て指定するという事は特定の引数を指定する際に使う「:=」は使わない仕様となります。
コピーの解除
コピーの指示が残ったままだと範囲指定したセルに点線が残ったままになります。これを解除します。
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メソッドについて解説しました。
最後は少し違った値貼り付けの方法(イコールを使う方法)を見ていただきました。
コピペはシンプルな作業ですが奥が深いです。ここでは「値貼り付け」だけを取り上げましたが色々な事ができます。
まずは基本形と値貼り付けのコードを使い込んでください。その後でバリエーションを増やす事を考えましょう。
コピペは削除とセットで勉強しましょう
データを貼り付けはデータの削除とセットで勉強すると実務に活かしやすくなります。
データを削除する方法【ExcelVBA】セルの値や罫線、背景を削除|Clearメソッド