Home » ExcelVBA Rangeオブジェクト » 行・列を表すRange » 個々のセルを表すRangeと行を表すRange

個々のセルを表すRangeと行を表すRange

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

以下のような階層関係にある、Excel VBAの、よく使われる4つのオブジェクトのうち、
 Application
  └ Workbook
    └ Worksheet
      └ Range
理解するのがもっとも難しいのは、何といってもRangeオブジェクトです。

Rangeを理解するのを難しくしている要因はいくつかありますが、同じRangeオブジェクトであっても、個々のセルを表すRangeと、行や列を表すRangeが存在していることが、そのひとつです。

個々のセルを表すRangeオブジェクトと、行や列を表すRangeオブジェクトの違いが明確になっていない方は、簡単なマクロを実行して、違いをしっかりと実感しましょう。

[スポンサードリンク]

単独のセルを表すRangeを確認するサンプルマクロ

まずは以下のSubプロシージャを実行しましょう。

Sub Rangeオブジェクトの違いを確認する()
 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プロシージャを実行してみてください。

Sub Rangeオブジェクトの違いを確認する()
 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

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » 行・列を表すRange » 個々のセルを表すRangeと行を表すRange

「行・列を表すRange」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.