プログラミング初心者向けのVBA入門講座第7回です。
前回オブジェクト式の概要を紹介しましたが、今回はそのうちのオブジェクトについて追加の説明をします。
オブジェクトのコレクション
同じ種類のオブジェクトの集合体をコレクションといいます。
例えば複数のブックの集合体はWorkbooksコレクション、複数のワークシートの集合体はWorksheetsコレクションです。

コレクションは複数形で「s」がつくことに注意してください。
VBAではこれらのコレクションをまとめて操作したり、コレクションのなかの単体のオブジェクトを取り出して操作することができます。
例えばブックに”Sheet1“,”Sheet2“,”Sheet3“という3つのワークシートがあるとき
Worksheets.Select
とするとすべてのワークシートを選択した状態になります。
コレクションのなかにいくつオブジェクト(要素)が含まれるかは Count プロパティで取得できます。
さきほどの事例の場合
MsgBox Worksheets.Count
とするとメッセージボックスに「3」と表示されます。
コレクションのなかから特定のオブジェクト(要素)を取り出すときには Item プロパティを用います。Item プロパティには引数としてオブジェクト名かインデックス番号を指定します。
例えば先ほど事例のなかから”Sheet2“だけを選択したいときは
Worksheets.Item(“Sheet2”).Select
とシート名を指定したり、
Worksheets.Item(2).Select
とインデックス番号で指定するができます。

シートのインデックス番号はシートが配置された一番左端を「1」として右に向かって順番に割り振られます。
Item プロパティはおおくのケースでその記述を省略して引数だけを指定することが許されています。
前述の事例はともに
Worksheets(“Sheet2”).Select
Worksheets(2).Select
と記述することができ、一般的にこちらの省略した記述のほうがよく用いられています。

ただし、この場合でも「Itemプロパティを省略して記述している」ことを理解したうえで記述することは大切です。
同様にブックについてもWorkbooks(“Book1.xlsx”)とブック名で指定したり、Workbooks(1)とインデックス番号で指定することができます。

ブックのインデックス番号はブックを開いた順番に割り振られます。
セルオブジェクトについて
セルのオブジェクトであるRangeオブジェクトはセル範囲を表すもののため、Rangeそのものが単体のオブジェクトでもあり同時にコレクションでもあります。
単体のセルを指定するときは
Range(“A1”).Value = 100
とひとつのアドレスを指定し、複数のセルを指定するときは
Range(“A1:C3”).Value = 100
とセル範囲のアドレスを指定します。

複数セルでも「s」はつけずに単体セルと同じRangeと記述します。
またもうひとつセルを指定するときに使われるものとしてCellsがあります。
こちらは「s」がついていることからもわかるようにセルの集合体であるCellsコレクションです。
しかし単体を意味するCellオブジェクトというのは存在しません。Cellsコレクションから単体のセル(Rangeオブジェクト)を取得する場合もItemプロパティを用います。
Cells.Item(行番号, 列番号)
このときのItemプロパティも省略可能で一般的には次のように記述されることのほうが多いです。
Cells(行番号,列番号)

セルの指定方法については後日実例を交えて紹介します。
オブジェクトの階層構造
VBAのオブジェクトは階層構造になっています。
セルというオブジェクトはシートというオブジェクトに属しています。そのシートオブジェクトもブックオブジェクトに属しています。
例えばセルA1と言っただけではSheet1のセルA1なのかSheet2のセルA1なのか特定できませんね。Sheet1というシートも他のブックにも存在しているかもしれません。
そのため正確に表現するには「Book1.xlsxというブックに属しているSheet1というシートに属しているセルA1」と表現する必要があります。
このときセルからみてシートが親のオブジェクトになり、シートからみるとブックが親のオブジェクトになります。
オブジェクト式ではオブジェクトの階層を表すときに「.(ピリオド)」でつなげて記述します。
たとえば先述したA1の値に100を代入する式は
Workbooks(“Book1.xlsx”).Worksheets(“Sheet1”).Range(“A1”).Value = 100
となります。
オブジェクトの階層分「.(ピリオド)」で連結されるためわかりにくいですが、値を設定もしくは取得するプロパティやオブジェクトを操作するメソッドを用いるときにはそれらは必ず最後に記述されます。
- オブジェクト.オブジェクト.オブジェクト.プロパティ
- オブジェクト.オブジェクト.オブジェクト.メソッド

セルの値を表すValueプロパティは省略することもできるので〇〇.Range(“A1”) = 100 という記述がされる場合もあります。ただしValueプロパティを省略すると何をしているのか読み取り難くなるため当サイトではValueプロパティを省略した記述は推奨しません。
上位オブジェクトの省略
毎回すべての階層のオブジェクトを記述するのも煩雑です。VBAでは上位のオブジェクトを省略して記述することもできます。
ただしそのマクロが記述されているモジュールによって省略されたオブジェクトの判断がかわるため注意が必要です。
標準モジュール
標準モジュールでブックやワークシートモジュールが省略されたときはそのときにアクティブになっているブックおよびワークシートが指定されたものと判断されます。
シートモジュール
シートモジュールは特定のブックの特定のシートに属したモジュールです。シートモジュールでブックやシートモジュールが省略された場合はそのシートモジュールが属しているブックおよびシートが指定されたものと判断されます。
ブックモジュール
ブックモジュールは特定のブックに属したモジュールです。ブックモジュールでブックオブジェクトの指定が省略されたときはそのブックモジュールが属しているブックが指定されたと判断されます。シートオブジェクトが省略されたときには、そのときアクティブになっているシートが指定されたと判断されます。
フォームモジュール
UserFormのモジュールでブックやシートのオブジェクトの指定が省略されたときは標準モジュールと同じくそのときアクティブなブックやシートが指定されたと判断されます。

マクロのなかでオブジェクトを操作することによってアクティブなブックやシートが変わることがあります。そうすると省略された上位オブジェクトも変わってくるので注意が必要です。

複数のブックやシートを扱うときにはできるだけ上位オブジェクトを省略せずに指定するようにしましょう。
まとめ
今回はオブジェクトのコレクションや階層構造について紹介しました。
次回以降の講座で、前回のオブジェクト式とあわせて実際にVBAを記述して操作に慣れていくようにします。そうすることで文章だけではイメージがつかみにくかったところも少しずつ理解が深まっていくと思います。
コメント