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


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

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

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

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

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

[スポンサードリンク]

単独のセルを表すRangeオブジェクトを確認するサンプルマクロ

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


Sub Rangeオブジェクトの違いを確認する()
 Dim tgt As Range
 Dim rng As Range

 Set tgt = Range("A1:B3")
 tgt.Select
 MsgBox tgt.Address(False, False)

 For Each rng In tgt
  rng.Select
  MsgBox rng.Address(False, False)
 Next rng
End Sub

上記のマクロを実行すると、
  Set tgt = Range("A1:B3")
  tgt.Select
  MsgBox tgt.Address(False, False)
の部分で、A1:B3セルが選択されて、メッセージボックスには「A1:B3」と表示されます。

つづいて、
  For Each rng In tgt
   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 tgt As Range
 Dim rng As Range

 Set tgt = Range("A1:B3").Rows ' 「.Rows」を追加
 tgt.Select
 MsgBox tgt.Address(False, False)

 For Each rng In tgt
  rng.Select
  MsgBox rng.Address(False, False)
 Next rng
End Sub

先のプロシージャで、
  Set tgt = Range("A1:B3")
となっていた部分が、
  Set tgt = Range("A1:B3").Rows
と、Rowsプロパティを使って行を表すRangeオブジェクトを取得している点が違います。

最初の、
  Set tgt = Range("A1:B3").Rows
  tgt.Select
  MsgBox tgt.Address(False, False)
の部分は、先のマクロと同じ動きをします。
A1:B3セルが選択され、メッセージボックスに「A1:B3」と表示されます。

にも関わらず、
  For Each rng In tgt
   rng.Select
   MsgBox rng.Address(False, False)
の部分の動きは違います。
コードとしては、先のプロシージャとまったく同じですが、オブジェクト変数・tgtにセットされているRangeが違うため、違う動きをします。

先のプロシージャは、個々のセルが順番に選択されたのに対し、このプロシージャは行単位で選択が行われ、メッセージにはアドレスが、
  A1:B1 A2:B2 A3:B3
の順に表示されます。
これが行を表すRangeオブジェクトです。

処理対象のセルを、
  Set tgt = Range("A1:B3").Rows
とRange.Rowsプロパティを使って取得しているので、行を表すRangeオブジェクトを単一オブジェクトとして持つ、コレクションオブジェクトとしてのRangeが取得されたのに対し、先のプロシージャでは
  Set tgt = Range("A1:B3")
となっていたので、個々のセルを単一オブジェクトとして持つ、コレクションオブジェクトとしてのRangeが取得されているためです。

[スポンサードリンク]

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

TrackBack:1

TrackBack URL
全てのシートの行を非表示にするExcelマクロ from インストラクターのネタ帳
全シートで特定の行を非表示にするExcelマクロをご紹介しています。

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

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

検索


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

.