Excel(エクセル)【12】VBAマクロにおけるオブジェクトの基礎知識と階層構造

Excel(エクセル)のVBAでマクロを書いていると、必ず「オブジェクト」という言葉に出会います。オブジェクトとは、簡単に言えば「これから何かの処理を加える対象そのもの」のことです。この考え方を理解していないと、コードをコピーして動かすことはできても、自分でマクロを組み立てたり、思うように修正したりするのが難しくなります。今回は、VBAにおけるオブジェクトの考え方と、その階層構造、記述を省略するためのルールについて整理します。

VBAにおける「オブジェクト」とは

オブジェクトは、何か特定のものを指す決まった単語ではなく、「処理の対象になっているもの」を表す概念です。たとえば「セルに色を塗る」というマクロを書くなら、その時のオブジェクトは「セル」になります。

同じように、処理の対象がワークシートであればオブジェクトは「ワークシート」になりますし、ブック全体であればオブジェクトは「ブック」になります。つまり、コードを書くたびに、何がオブジェクトになるのかは変わってくるということです。VBAでは、これらをそれぞれ次のキーワードで表します。

  • セル・セル範囲:Range
  • ワークシート:Worksheet
  • ブック:Workbook

実際にセルへ色を付けるコードで確認してみましょう。

Sub セルに色を塗る()
	Worksheets("Sheet1").Range("A1:B2").Interior.Color = RGB(200, 200, 200) '色を塗ります
End Sub

このコードでは、「Sheet1」という名前のワークシートにある「A1:B2」のセル範囲が、色を塗るというオブジェクトとして指定されています。なお、すでに「Sheet1」がアクティブなシートになっている場合は、ワークシート名の指定を省略して、次のように短く書くこともできます。

Sub セルに色を塗る()
	Range("A1:B2").Interior.Color = RGB(200, 200, 200) '色を塗ります
End Sub

オブジェクトは階層構造になっている

VBAのオブジェクトは、バラバラに存在しているわけではなく、上下関係を持った階層構造として整理されています。具体的には、一番上にExcelアプリケーション全体を表す「Application」、その下に開いているブックを表す「Workbooks」、さらにその下に各シートを表す「Worksheets」、そして一番下にセル範囲を表す「Range」という順番になっています。

本来であれば、上の階層から順番にたどって書くのが正式な記述方法です。ただし、すでに説明したとおり、操作対象がアクティブな状態であれば、その階層の指定を省略できます。たとえば、現在開いているExcel自体(Application)を毎回書く人はまずいません。複数の階層を続けて指定したい場合は、「.(ピリオド)」でオブジェクトをつなげて記述します。

処理が複雑になり、複数のブックやシートをまたいで操作するマクロほど、「今どのオブジェクトを指しているのか」を正確に書き分ける必要があります。階層構造の考え方を理解しておくと、こうした複雑なコードを読み書きする際の見通しが格段によくなります。

インデックス番号でオブジェクト名の指定を省略する

ここまでは「Worksheets(“Sheet1”)」のように、シート名を直接指定してオブジェクトを指定する方法を見てきました。これとは別に、シートの並び順を表す「インデックス番号」を使って指定する方法もあります。

たとえば、シートが左から「Sheet1」「Sheet2」「Sheet3」の順に並んでいるとします。このとき、一番右の「Sheet3」を操作したい場合は、シート名を書かずに「Worksheets(3)」とだけ記述すれば指定できます。インデックス番号を使う場合は、シート名のように「”(ダブルクオーテーション)」で囲む必要はありません。

Sub セルに色を塗る()
    Worksheets(3).Range("A1:B2").Interior.Color = RGB(200, 200, 200)   '色を塗ります
End Sub

ここで注意したいのは、インデックス番号があくまで「シートの並び順(左から何番目か)」を基準にしている点です。たとえばシートを「Sheet3」「Sheet1」「Sheet2」の順に並べ替えた場合、上記と同じコードを実行すると、3番目に並んでいる「Sheet2」が操作対象になります。シート名そのものは、インデックス番号による指定には一切関係しません。

同じインデックス番号による指定は、ワークシートだけでなくブック(Workbooks)に対しても使えます。この場合は、最初に開いたブックから順に1、2、3…とカウントされていきます。

まとめ

VBAのマクロを自在に書けるようになるには、「オブジェクト」という考え方を避けて通れません。処理ごとに対象となるオブジェクトが変わること、オブジェクトには階層構造があること、そしてアクティブな状態であれば記述を省略できることの3点を押さえておけば、コードの意味を正しく読み解けるようになります。まずは今回紹介したサンプルコードを実際に動かしながら、少しずつ感覚をつかんでいきましょう。

マクロのエラーへの対処に不安がある方は【11】マクロのエラー対処法、シリーズの最初から復習したい方は【1】マクロとは?もあわせてご覧ください。

このテーマの関連記事はこちら