以下のような階層関係にある、Excel VBAの、よく使われる4つのオブジェクトのうち、
Application
└ Workbook
└ Worksheet
└ Range
理解するのがもっとも難しいのは、何といってもRangeオブジェクトです。
Rangeを理解するのを難しくしている要因はいくつかありますが、同じRangeオブジェクトであっても、個々のセルを表すRangeと、行や列を表すRangeが存在していることが、そのひとつです。
個々のセルを表すRangeオブジェクトと、行や列を表すRangeオブジェクトの違いが明確になっていない方は、簡単なマクロを実行して、違いをしっかりと実感しましょう。
単独のセルを表すRangeを確認するサンプルマクロ
まずは以下のSubプロシージャを実行しましょう。
Dim target As Range
Set target = Range("A1:B3")
target.Select
MsgBox target.Address(False, False)
Dim rng As Range
For Each rng In target
rng.Select
MsgBox rng.Address(False, False)
Next
End Sub
上記のマクロを実行すると、
Set target = Range("A1:B3")
target.Select
MsgBox target.Address(False, False)
の部分で、A1:B3セルが選択されて、メッセージボックスには「A1:B3」と表示されます。
つづいて、
For Each rng In target
rng.Select
MsgBox rng.Address(False, False)
の部分で、A1:B3に含まれる個々のセルが、
A1 B1 A2 B2 A3 B3
の順に(アルファベットのZを書くときのような順番で)選択され、メッセージボックスにそのアドレスが表示されます。
Excel VBAで、セルをFor Each~Nextループで処理するのに慣れている方なら、特に疑問を持つことのない動きでしょう。
行を表すRangeを確認するサンプルマクロ
続いて、以下のSubプロシージャを実行してみてください。
Dim taraget As Range
Set target = Range("A1:B3").Rows '「.Rows」を追加
target.Select
MsgBox target.Address(False, False)
Dim rng As Range
For Each rng In target
rng.Select
MsgBox rng.Address(False, False)
Next
End Sub
先のプロシージャで、
Set target = Range("A1:B3")
となっていた部分が、
Set target = Range("A1:B3").Rows
と、Rowsプロパティを使って行を表すRangeオブジェクトを取得している点が違います。
最初の、
target.Select
MsgBox target.Address(False, False)
の部分は、先のマクロと同じ動きをします。
A1:B3セルが選択され、メッセージボックスに「A1:B3」と表示されます。
にも関わらず、
For Each rng In target
rng.Select
MsgBox rng.Address(False, False)
の部分の動きは違います。
コードとしては、先のプロシージャとまったく同じですが、オブジェクト変数targetにセットされているRangeが違うため、違う動きをします。
先のプロシージャは、個々のセルが順番に選択されたのに対し、このプロシージャは行単位で選択が行われ、メッセージにはアドレスが、
A1:B1 A2:B2 A3:B3
の順に表示されます。
これが行を表すRangeオブジェクトです。
処理対象のセルを、
Set target = Range("A1:B3").Rows
とRange.Rowsプロパティを使って取得しているので、行を表すRangeオブジェクトを単一オブジェクトとして持つ、コレクションオブジェクトとしてのRangeが取得されたのに対し、先のプロシージャでは
Set target = Range("A1:B3")
となっていたので、個々のセルを単一オブジェクトとして持つ、コレクションオブジェクトとしてのRangeが取得されているためです。
最終更新日時:2020-08-31 09:04
- Newer:VBAからMATCH関数利用時にエラーを回避する
- Older:VBAで選択図形の名前を取得する
Home » Excel VBA Rangeオブジェクト » 行・列を表すRange » 個々のセルを表すRangeと行を表すRange