VBAを学習している初心者の方の多くが「Rangeプロパティ」という言葉を聞くと困惑してしまうと思います。
「Rangeはオブジェクトと習ったのにRangeプロパティって何?」と疑問に思うことでしょう。
なかには「RangeはオブジェクトだからRangeプロパティというのは間違い」と早々に決めつけてしまう人もいるかもしれません。
もちろん「Rangeプロパティ」は間違いではなくMicrosoftの公式ヘルプページにも記載されている正式なものです。
今回はこれらの疑問を解決するためVBAのプロパティについて詳しく説明していきたいと思います。
Rangeプロパティを理解するための2つの概念
Rangeプロパティを理解するためには、VBAのプロパティについて次の2点を理解する必要があります。
- プロパティのなかにはオブジェクトを返すプロパティがある
- VBAでは(一部の例外を除いて)オブジェクトを返すプロパティからオブジェクトを取得して、その取得したオブジェクトを操作する。
それぞれ詳しくみていきましょう。
オブジェクトを返すプロパティ
オブジェクト.プロパティ
というオブジェクト式があった場合、このプロパティは「オブジェクトの状態や様子を表す値を設定もしくは取得するためのもの」と説明できます。
例えば、
Activesheet.Name
の Name プロパティは現在アクティブなシートのシート名を設定したり取得することができます。
また、
Range(“A1”).Value
の Value プロパティはセルA1の値を設定もしくは取得することができます。
ただ、プロパティのなかにはこのようにオブジェクトの値ではなく、オブジェクトそのものを取得できるプロパティがあります。
わかりやすい事例でいうとオブジェクトの集合体であるコレクションから単体のオブジェクトを取得するための Item プロパティがあります。
→オブジェクトのコレクションについてはこちらの記事を参照ください。
Worksheets.Item(1)
のItemプロパティは左端からひとつめのWorksheetオブジェクトを返します。
また、
Cells.Item(1,1)
のItemプロパティはセルA1のRangeオブジェクトを返します。
まずはこのようにプロパティのなかにはオブジェクトを返すプロパティも存在するということを理解してください。
プロパティには大きく次の2種類があると考えるとよいでしょう。
- (数値や文字列などの)値を返す(または設定する)プロパティ
- オブジェクトを返すプロパティ
そして「Rangeプロパティ」の正体はこの「オブジェクトを返すプロパティ」なのです。
そのあたりをもう少し詳しくみていきましょう。
VBAのオブジェクト式でオブジェクトを操作するしくみ
例えば次のようなオブジェクト式があるとき
Range(“A1”).Value
これはよく「オブジェクト.プロパティ」と表現されます。
しかし正確に表現するとこれは
「オブジェクトを返すプロパティ.値を返す(もしくは設定する)プロパティ」
なのです。
オブジェクト式で記述されるオブジェクトの記述のほとんどはこの「オブジェクトを返すプロパティ」になります。(一部例外あり)
例として
Application.Workbooks(“Book1.xlsx”).Worksheets(“Sheet1”) _
.Range(“A1”).Value = 100
という構文があるとします。
これは Item プロパティを省略された一般的な記述方法ですが、省略せずに記述すると次のようになります。
Application.Workbooks.Item(“Book1.xlsx”).Worksheets.Item(“Sheet1”) _
.Range(“A1”).Value = 100
この左辺に記述されたオブジェクト式はすべてプロパティであり、最後のValueプロパティが「値を返すプロパティ」でそれ以外はすべて「オブジェクトを返すプロパティ」です。
この左辺のオブジェクト式についてひとつずつ解説していくと
- ApplicationプロパティによってApplicationオブジェクトを取得
- 取得したApplicationオブジェクトに属するWorkbooksプロパティによってWorkbookオブジェクトの集合体であるWorkbooksオブジェクトコレクションを取得
- 取得したWorkbooksオブジェクトコレクションのなかからItemプロパティによってブック名が「Book1.xlsx」のWorkbookオブジェクトを取得
- 取得したWorkbookオブジェクトに属するWorksheetsプロパティによってWorksheetオブジェクトの集合体であるWorksheetsオブジェクトコレクションを取得
- 取得したWorksheetsオブジェクトコレクションから Itemプロパティによってシート名が「Sheet1」のWorksheetオブジェクトを取得
- 取得したWorksheetオブジェクトに属するRangeプロパティによって「セルA1」のRangeオブジェクトを取得
- 取得したRangeオブジェクトに属するValueプロパティによってセルの値を設定
このようにVBAのオブジェクト式ではオブジェクトを操作するために「オブジェクトを返すプロパティ」を記述することでそのオブジェクトを取得しているのです。(一部例外を除く)
一部例外について
オブジェクト式でオブジェクトを操作するために記述するのは「オブジェクトを返すプロパティ」と説明しましたが、一部例外もあります。
例えば次のような記述で
Sheet1.Range(“A1”).Value = 200
このなかの「Sheet1」はプロパティではありません。
これはVBAProjectに生成されたクラスのオブジェクト名で、オブジェクト式で直接このオブジェクト名を記述して指定することができます。

「Sheet1」はひとつめのシートにデフォルトでつけられるオブジェクト名です。オブジェクト名はプロパティウィンドウから変更することもできます。
また、オブジェクト式ではありませんが次のように変数を宣言するときに指定するオブジェクトの型の記述もプロパティではありません。
Dim rng As Range
これらの一部の例外を除けばVBAのコードのなかに記述されるオブジェクトの多くは「オブジェクトを返すプロパティ」です。
まとめ
今回はVBAにおけるオブジェクトとプロパティの関連について紹介しました。
- プロパティのなかには「オブジェクトを返すプロパティ」がある
- VBAではその「オブジェクトを返すプロパティ」で取得したオブジェクトを操作している
(一部例外を除く)
という2点をおさえておくと理解しやすくなると思います。
コメント