範囲指定セルのコピー&ペーストはイコールで高速に処理できる
Rangeオブジェクトを使って範囲指定されたセルの値でコピペ風の処理を実行してみます。
実際はコピペではなく値の代入ですがコピペと同じ効果を実現しつつ処理速度も速いのでこの方法を採用しました。
コード
コードはこちらです。
Sub 範囲指定セルの代入()
Dim rng1 As Range 'Range型で変数を定義
Dim rng2 As Range 'Range型で変数を定義
Set rng1 = Range("G5:I7") '変数にセルの範囲を格納
Set rng2 = Range("B5:D7") '変数にセルの範囲を格納
With rng2 'オブジェクト変数rng2でWithステートメントを組む
.Value = rng1.Value 'オブジェクト変数rng1の値を代入
.HorizontalAlignment = xlCenter '文字位置(横)を中央に揃える
.VerticalAlignment = xlCenter '文字位置(縦)を中央に揃える
End With
End Sub
作業前/作業後
作業前のセルです。B5からD7のセルは空欄です。
作業後のセルです。B5からB7のセルにはG5からI7の値が入ります。
コードだけ欲しい方向けにコードとセルの状態を見ていただきました。
説明が必要な方は以降の解説記事をご覧ください。
電子書籍はこちらです。
解説
コードの解説をします。ポイントは4点です。
- オブジェクト変数とは
- 代入時はプロパティを指定する
- ValueプロパティとValue2プロパティ
- Valueプロパティは値のみ
1つずつ説明していきます。
1_オブジェクト変数とは
オブジェクト変数は変数の一種です。通常の変数は値を格納しますがオブジェクト変数はオブジェクトを格納します。
オブジェクトを格納と書きましたが実際に変数に格納されるのは対象のオブジェクトが元々持っている所在地です。
詳細は関連記事をご覧ください。
オブジェクト変数を見た目で確認することができます
オブジェクト変数にオブジェクトが格納されている様に見える場所があります。
画像はVBEのローカルウインドウです。対象の変数を+ボタンで展開してみてください。
多くのプロパティが並んでいますね。見た目では変数の中にオブジェクトが格納されている様に見えます。
繰り返しとなりますが変数にオブジェクトが格納されている様に見えるだけですのでご注意ください。
(詳細はこちらの記事をご覧ください)
2_代入時はプロパティを指定する
イコールを使ってオブジェクト変数rng2のValueプロパティにオブジェクト変数rng1のValueプロパティを代入します。
画像はオブジェクト変数rng1のValue2プロパティです。
この値をそのままオブジェクト変数rng2のValueプロパティに代入(イコールを使う)します。
配列を理解している方であればこの状態が分かると思います。配列が分からない方はこちらの記事をご覧ください。
3_ValueプロパティとValue2プロパティ
オブジェクト変数rng1のValueプロパティを見ると「Value2」になっています。
これは内部で1つの情報に対し「Value」、「Value2」という2つのアクセスする経路を持っているという状態です。
あくまで2つのプロパティの値は別々の存在ではなく同じプロパティを異なる名前で指しているだけという事です。
基本的には文字列であれば気にせずValueプロパティを使ってください。(日付などは後述の事例を参照ください)
ローカルウインドウに表示されるのはValue2ですのでこちらの方がプログラム内での優先度が高いのかもしれませんね。
事例:ValueプロパティとValue2プロパティに日付を代入してみる
ここでValueプロパティとValue2プロパティの違いを提示しておきます。
例えば日付を変数に格納したとします。すると変数の中身はこのように情報が分けられます。
- Valueプロパティ ・・・ 2024/09/04
- Value2プロパティ ・・・ 45539
Value2プロパティでは日付をシリアル値で持っています。これだけの違いです。
値を貼り付ける予定のセルに「セルの書式設定」で「日付」を設定してしまえば出力される結果は同じになります。
Valueプロパティで貼り付けてもValue2プロパティで貼り付けても「2024/09/04」が入ります。
4_Valueプロパティは値のみ
Valueプロパティに代入できるのは値のみです。つまりセルの背景等は格納されません。
現に冒頭で紹介したコードではHorizontalAlignmentとVerticalAlignmentで文字の位置を別途設定しています。
背景などはRangeオブジェクトから見るとInteriorプロパティで設定できます。
必要に応じて値の代入後に別途設定し直してください。
まとめ
Rangeオブジェクトを使った範囲指定セルのコピー&ペーストについて解説しました。
実際はコピペではなく値の代入ですがコピペと同じ効果を得られる処理です。加えてコピペより処理が高速です。
オブジェクト変数の考え方に慣れれば問題無く使うことができる処理ですので是非使ってみてください。
次の記事ではワークシート間でRangeオブジェクトを使った範囲指定セルのコピー&ペースト(代入)にトライします。
参考:コピペの記事も紹介しておきます。