エクセルVBAのオブジェクト・コレクション
<< VBAのプロシージャ構造 :前の記事
前回のプロシージャの構造の中でステートメントを解説しましたが、ステートメントの中には「オブジェクト」が存在します。今回はそのオブジェクトについて詳しく解説します。
目次
オブジェクト・コレクションとは
オブジェクトとはエクセルのワークブック・ワークシート・セル・グラフ・オートシェイプなど、操作の対象となるもののことを言います。また、複数のオブジェクトの集合体はコレクションと呼ばれます。
例えば、以下の図で説明すると、ワークブック・ワークシート・セルはオブジェクトですが、ワークシート全体はコレクションとなります。
オブジェクトの階層構造
オブジェクトは、オブジェクト同士の親子関係で構成されています。たとえば、下記の図を見て分かるようにExcel本体のアプリケーションを表すApplicationオブジェクトには、ブックを表すWorkbookオブジェクトが含まれています。
この場合、Applicationオブジェクトが親でWorkbookオブジェクトが子の関係にあります。このようにオブジェクト同士の親子関係をもとに階層化されたオブジェクトの構造を「オブジェクトの階層構造」または「オブジェクトモデル」といいます。
ちなみに、Worksheetオブジェクトから見たWorkbookオブジェクトのような親オブジェクトのことを「コンテナ」と呼びます。
階層構造の書き方
階層構造のオブジェクトを利用するには決まった書式に則って記述します。決まった書式とは、以下のように親オブジェクト名と子オブジェクト名の間に「.(ピリオド)」で結んで記述します。
親オブジェクト名.子オブジェクト名
オブジェクトを確認
ここでは、マクロの記録と実行で作成したマクロからどのようなオブジェクトがあるか確認していきます。以下が作成されたマクロの詳細になります
Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2014/12/19 ユーザー名 : xxx
'
'
Range("A2").Select
ActiveCell.FormulaR1C1 = "りんご"
Range("B2").Select
ActiveCell.FormulaR1C1 = "100"
End Sub
マクロを見てみると「Range("A2")」のA2セルオブジェクトと「Range("B2")」のB2セルオブジェクトがあります。その後にSelectメソッドと呼ばれているものがありますが、こちらは直訳すると「選択」になりますので、それぞれのセルを選択する処理になります。
Range("A2").Select
Range("B2").Select
ExcelのVBAで記述する場合は、このようにオブジェクトを指定してからそのオブジェクトに対してどのような処理を行うかを記述します。ただし、これまで説明したようにオブジェクトの中には多くのオブジェクトが存在します。
本来であれば「ApplicationオブジェクトのWorkbookオブジェクトの・・・」のように上位オブジェクトから目的のオブジェクトまで階層をたどって記述していきますが、中には省略できるオブジェクトもあります。
今回の事例がまさに省略できるオブジェクトで本来であれば以下のように記述をします。こちらはExcelの「Book1」ワークブックの「Sheet1」ワークシートのセルA2オブジェクトを表していますが非常に長い記述になっているのが分かるかと思います。
Application.Workbooks("Book1").Worksheets("Sheet1").Range("A2").Select
Application.Workbooks("Book1").Worksheets("Sheet1").Range("B2").Select
このように省略するとコードの簡素化も図れますが、ワークブックやワークシート間でデータのやり取りをする場合に対象のオブジェクトを指定しなければ期待通りの処理を行えないこともあります。その処理がどのオブジェクトに対して行う処理なのかを意識しながら記述するようにしましょう。
VBAで操作できる主なオブジェクト
エクセルVBAには様々なオブジェクトを操作することができますが、こちらでは、主に利用されるオブジェクトを紹介します。こちらを見て分かるようにsが付いた複数形の場合はコレクションとなります。
オブジェクト | VBAのオブジェクト・コレクション |
---|---|
アプリケーション | Applicationオブジェクト |
ウィンドウ | Windowsコレクション Windowオブジェクト |
ワークブック | Workbooksコレクション Workbookオブジェクト |
ワークシート | Worksheetsコレクション Worksheetオブジェクト |
シート | sheetsコレクション sheetオブジェクト |
セル | cellsコレクション cellオブジェト Rangeオブジェクト |
グラフ | Chartsコレクション Chartオブジェクト |
ユーザーフォーム | UserFormオブジェクト |
コレクションの使い方
コレクションは複数のオブジェクトの集合体と説明しましたが、VBAではコレクション名を記述することでコレクションに対して操作することができます。コレクションを操作するには、大きく分けて以下の2つの方法があります。
- コレクションとしてオブジェクトをまとめて操作する
- コレクションの中のオブジェクトを選択して操作する
コレクションとしてオブジェクトをまとめて操作する場合は、コレクション名に「.(ピリオド)」を付けて処理を実行するプロパティやメソッドを記述します。
コレクション名.プロパティ名/メソッド名
下記はコレクションとしてオブジェクトをまとめて操作した事例です。Countプロパティはオブジェクトの数を返しますので、こちらではセル1にワークシートの数を代入しています。
Sub Sample()
Range("A1") = Worksheets.Count
End Sub
続いて、コレクションの中のオブジェクトを選択して操作する場合は、コレクション名に「()」(カッコ)を付けてその中にインデックス番号もしくはオブジェクトの名前を記述します。
コレクション名(インデックス番号もしくはオブジェクトの名前).プロパティ名/メソッド名
下記はコレクションの中のオブジェクトを選択して操作した事例です。Worksheetsコレクションの1番目のワークシートを選択する処理になります。
Sub Sample()
Worksheets(1).Select
End Sub
他にも以下のように記述できます。こちらはWorksheetsコレクションの中でワークシート名が「Sheet1」を選択する処理になります。
Sub Sample()
Worksheets("Sheet1").Select
End Sub
このように特定のオブジェクトを利用する場合は、そのオブジェクトを取得するための正しい記述方法で取得しなければいけません。
今回のWorksheetオブジェクトで言えば「Worksheetsコレクション」「ActiveSheetプロパティ」を利用しなければ取得できず、「Worksheet」と記述して利用するとエラーが発生します。個別のワークシートを操作する場合でも「Worksheetsコレクション」は利用されるということを覚えておきましょう。
また、他のオブジェクトの取得方法も異なってきますので、それぞれのオブジェクトの記述方法についても十分気をつけましょう。
まとめ
今回は、オブジェクトとはどのようなものかについて解説しました。オブジェクトは数多く存在しますが、全てを覚える必要はありません。実際にプログラミングする場合は、処理をされるものがどのようなオブジェクトで構成されているのかを意識しながら記述するようにしましょう。
また、「セルの選択」処理では簡単に説明しましたが、オブジェクトだけでは何も操作できません。オブジェクトを操作するために「プロパティ」と「メソッド」というものが用意されています。次回は、まず「プロパティ」について解説していきます。
次の記事: オブジェクトのプロパティ >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。