エクセルの操作を実行するプロパティやメソッドの結果を反映するためにはその対象となるオブジェクトを特定する必要があります。このオブジェクトを特定することを「オブジェクトを取得する」と表現します。
VBAを理解するには「オブジェクトの取得」を理解していなければなりません。
VBAから捉えた場合、エクセルは「オブジェクト」の集合体であると言えます。
「オブジェクト」とはマクロで操作をする対象になります。
同じ種類のオブジェクトの集合を「コレクション」と呼びます。
ただ、全てのオブジェクトにコレクションが存在するわけではありません。
エクセルそのものをあらわすApplicationオブジェクトは単体としてしか扱えません。
また、セル範囲をあらわすRangeオブジェクトはコレクションがあるようにも思えますが、
もともと複数セルを表現する仕様になっているため、コレクションと言う概念がありません。
同じ種類のオブジェクトの集合としてのコレクションはVBAではあたかもひとつのオブジェクトのように扱うことができます。
全てのエクセルオブジェクトには必ず上下関係が存在します。
独立して存在するオブジェクトはありません。
わかりやすい例として、ApplicationオブジェクトからRangeオブジェクトまでの上下関係をたどると、
Applicationオブジェクト | ||||
---|---|---|---|---|
┗ | Workbookオブジェクト | |||
┗ | Worksheetオブジェクト | |||
┗ | Rangeオブジェクト |
「Book1のSheet1にあるA1セルをコピーする」というステートメントは表1のようにかけます。 |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||
上の階層からオブジェクトを取得するためのプロパティは、その下の階層のオブジェクトを取得するプロパティに対するオブジェクトになります。 しかしながら、必ずしも最上位のApplicationオブジェクトから階層をたどらなければいけないと言うことではありません。 Rangeオブジェクトを取得する場合は、 取得しようとするセル範囲を含むシートがアクティブな状態であれば、 その上位のオブジェクトの取得を省略し直接取得することができます。 上記の例ではマクロの中で先に 「Workbooks("Book1.xls")」の「WorkSheets("Sheet1")」がアクティブになるような記述があれば、 Range("A1").Copyだけの記述でも動作は有効です。 逆に省略したオブジェクトがアクティブでない場合はオブジェクトの取得に失敗する、あるいは意図していないオブジェクトに操作を実行してしまうことになります。 省略した記述でオブジェクトを取得する場合は該当のステートメントの時点でどのオブジェクトがアクティブになっているのかを意識してコードを書く必要があります。 |
コレクションが同じ種類のオブジェクトの集合であることはすでに述べましたが、 コレクションの中の個々のオブジェクトをアイテムと呼ぶときがあります。 コレクションから個々のオブジェクトを取得するにはItemメソッド、Itemプロパティを使用します。 |
expression.Item(Index) |
コレクションの個々のオブジェクトには自動的に連番が設定されます。ItemプロパティのIndexを
数値で指定することでコレクションから個々のオブジェクトを特定できます。
しかし、たいていの場合、このItemメソッド、Itemプロパティを省略することが可能です。 |
expression(Index) |
このようにコレクションをあらわすキーワードに
「半角括弧()」で囲んだインデックス値を続けて記述することで
オブジェクトを取得することができます。
そのため、とくにこのItemメソッド、Itemプロパティを意識して使用する必要はありません。 |
コレクションを持つオブジェクトが作成された場合は自動的に連番が与えられます。 この連番がインデックス値と呼ばれます。 このインデックス値を指定することでオブジェクトを取得することができます。 |
Worksheets(3).Select |
上記例の場合は「左から数えて3番目のワークシートを選択」します。 Worksheetsコレクションの場合はむしろ例外で作成した順番ではなくて左から数えた順番がインデックス値として与えられます。 |
コレクションによってはオブジェクトの名前で指定できる場合もあります。 基本的にはインデックス値の部分を「"(ダブルクォーテーション)」で囲んだ文字列とすることで指定します。 |
Worksheets("Sheet3").Select |
Worksheetsコレクションのように並んだ順番によってインデックス値が変更されてしまうコレクションの場合は名前でオブジェクトの取得を行ったほうが良い場合もあります。 |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||