オブジェクトを取得する

エクセルの操作を実行するプロパティやメソッドの結果を反映するためにはその対象となるオブジェクトを特定する必要があります。このオブジェクトを特定することを「オブジェクトを取得する」と表現します。
VBAを理解するには「オブジェクトの取得」を理解していなければなりません。

  1. オブジェクトとコレクション
  2. オブジェクトの階層構造
  3. コレクションからオブジェクトを所得

  1. オブジェクトとコレクション
  2. ◆オブジェクト

    VBAから捉えた場合、エクセルは「オブジェクト」の集合体であると言えます。
    「オブジェクト」とはマクロで操作をする対象になります。

    操作の対象となるオブジェクトの例
    ブック、ワークシート、セル
    ワークシートへ貼り付けられたグラフ、オートシェイプ、画像、コマンドボタン
    ツールバーに表示されるツールバーやメニュー

    ◆コレクション

    同じ種類のオブジェクトの集合を「コレクション」と呼びます。
    ただ、全てのオブジェクトにコレクションが存在するわけではありません。
    エクセルそのものをあらわすApplicationオブジェクトは単体としてしか扱えません。
    また、セル範囲をあらわすRangeオブジェクトはコレクションがあるようにも思えますが、 もともと複数セルを表現する仕様になっているため、コレクションと言う概念がありません。
    同じ種類のオブジェクトの集合としてのコレクションはVBAではあたかもひとつのオブジェクトのように扱うことができます。

    ▲PAGETOP

  3. オブジェクトの階層構造
  4. ◆オブジェクトの上下関係

    全てのエクセルオブジェクトには必ず上下関係が存在します。
    独立して存在するオブジェクトはありません。
    わかりやすい例として、ApplicationオブジェクトからRangeオブジェクトまでの上下関係をたどると、

    Applicationオブジェクト
    Workbookオブジェクト
    Worksheetオブジェクト
    Rangeオブジェクト

    と言う上下関係になります。
    このような上下関係があるのは、エクセルが複数のブックを同時に開くことができ、また、ひとつのブックにも複数のシートを含むような仕様になっているためです。
    あるセルに操作を行う際に複数のブック、シートが存在している場合は、操作の対象となるセルを特定するためには「どのブックのどのシート」のセルなのかこの階層をたどって特定する必要があります。
    つまり、操作の対象となるオブジェクトを正確に把握するための階層構造というわけです。

    ◆階層を意識したオブジェクトの取得

    「Book1のSheet1にあるA1セルをコピーする」というステートメントは表1のようにかけます。
    表1
    Workbookオブジェクトから
    Worksheetオブジェクトを取得するプロパティ
    Application .Workbooks("Book1.xls") .WorkSheets("Sheet1") .Range("A1") .Copy
    Applicationオブジェクトから
    Workbookオブジェクトを取得するプロパティ
    Worksheetオブジェクトから
    Rangeオブジェクトを取得するプロパティ
    上の階層からオブジェクトを取得するためのプロパティは、その下の階層のオブジェクトを取得するプロパティに対するオブジェクトになります。
    しかしながら、必ずしも最上位のApplicationオブジェクトから階層をたどらなければいけないと言うことではありません
    Rangeオブジェクトを取得する場合は、
    取得しようとするセル範囲を含むシートがアクティブな状態であれば、
    その上位のオブジェクトの取得を省略し直接取得することができます。
    上記の例ではマクロの中で先に
    「Workbooks("Book1.xls")」の「WorkSheets("Sheet1")」がアクティブになるような記述があれば、
    Range("A1").Copy
    だけの記述でも動作は有効です。
    逆に省略したオブジェクトがアクティブでない場合はオブジェクトの取得に失敗する、あるいは意図していないオブジェクトに操作を実行してしまうことになります。
    省略した記述でオブジェクトを取得する場合は該当のステートメントの時点でどのオブジェクトがアクティブになっているのかを意識してコードを書く必要があります。

    ▲PAGETOP

  5. コレクションからオブジェクトを所得
  6. ◆Itemメソッド・Itemプロパティ

    コレクションが同じ種類のオブジェクトの集合であることはすでに述べましたが、 コレクションの中の個々のオブジェクトをアイテムと呼ぶときがあります。 コレクションから個々のオブジェクトを取得するにはItemメソッドItemプロパティを使用します。
    expression.Item(Index)
    
    コレクションの個々のオブジェクトには自動的に連番が設定されます。ItemプロパティのIndexを 数値で指定することでコレクションから個々のオブジェクトを特定できます。 しかし、たいていの場合、このItemメソッド、Itemプロパティを省略することが可能です。
    expression(Index)
    
    このようにコレクションをあらわすキーワードに 「半角括弧()」で囲んだインデックス値を続けて記述することで オブジェクトを取得することができます。 そのため、とくにこのItemメソッド、Itemプロパティを意識して使用する必要はありません。

    ◆インデックス値で指定する

    コレクションを持つオブジェクトが作成された場合は自動的に連番が与えられます
    この連番がインデックス値と呼ばれます。
    このインデックス値を指定することでオブジェクトを取得することができます。
    Worksheets(3).Select
    上記例の場合は「左から数えて3番目のワークシートを選択」します。
    Worksheetsコレクションの場合はむしろ例外で作成した順番ではなくて左から数えた順番がインデックス値として与えられます

    ◆名前で指定する

    コレクションによってはオブジェクトの名前で指定できる場合もあります。
    基本的にはインデックス値の部分を「"(ダブルクォーテーション)」で囲んだ文字列とすることで指定します。
    Worksheets("Sheet3").Select
    Worksheetsコレクションのように並んだ順番によってインデックス値が変更されてしまうコレクションの場合は名前でオブジェクトの取得を行ったほうが良い場合もあります。

▲PAGETOP
≪前のページへ   VBAマクロビギナーの部屋目次へ   次のページへ*工事中*

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送