オブジェクトを階層構造で指定し、命令対象を明確にする

基礎から始めるVBA VBA

シリーズ前回の記事では、オブジェクト、メソッド、プロパティについて学びました。

前回記事はこちら
タナイ
タナイ

今回は、オブジェクトについてもう少し詳しく見ていきましょう。

オブジェクトの指定は明確でなくてはならない

前回の復習になりますが、VBAコードの基本構造は

オブジェクト.プロパティ
オブジェクト.メソッド

という形をしていました。

「オブジェクト」はVBAプログラムで「命令を行いたい対象」を表します。

Sub changeCell()
    Range("A1").Value=1
End Sub

上のコードではA1のセルを表すRange("A1")が「オブジェクト」です。

しかし、エクセルにはたくさんのシートやブックが存在します。

タナイ
タナイ

例えば複数のシートが存在している状態でA1セルをオブジェクトに指定する場合は、「どのシートのA1セルなのか」をはっきりさせておく必要があります。

対象を明確に指定するためには、オブジェクトの階層構造を理解する必要があります。

現実世界を例にとると

たとえばサラリーマンが部署内の会話で「田中さん」と言えば同じ部署にいる田中さんを暗黙的に指しているとわかって会話が成立します。

しかしながら「田中」という苗字の社員は、他の部署や他地域の営業所にもいるかもしれません。つまり、人間が会話をするときは、前後の文脈からどの田中さんを指しているか暗黙的に判断するわけです。

一方でコンピュータが会話に参加するとなったらどうでしょう。

プログラムは何も指定されなければ、文脈やユーザーの意図を汲み取る能力はないため、単に田中さんと言われても「どの」田中さんなのかできません。あなたのプログラムには、もしかすると全国津々浦々のどこかにいる別の田中さんが見えているかもしれません。

したがって、あなたがプログラムを作成するなら「今話している田中さんはこの会社の我々と同じ部署にいる田中さんのことだよ」と教えてあげなければなりません。

タナイ
タナイ

これがVBAでオブジェクトを明確に指定する意義です

オブジェクトは階層構造をしている

ここでエクセルの構成要素を考えてみましょう。

まず大きなくくりとしてExcelアプリケーションそのものがあります。

ユーザーはExcelアプリケーションの中で「ブック」を開いています。

ブック:*.xlsxや*.xlsm等の拡張子をExcelファイルのこと

「ブック」は複数の「シート」からできています。そして、「シート」はさらに多数の「セル」から構成されています。

つまり、

アプリケーション>ブック>シート>セル

という階層構造が存在するわけです。

オブジェクトの指定にこの階層構造を使えば、処理対象となるオブジェクトを明確に指定できます。

タナイ
タナイ

先ほどの田中さんを例にとれば、以下のようなイメージでしょうか。

アプリケーション:日本全体
ブック:企業
シート:部署
セル:苗字

日本には多くの苗字があります。今回は田中でしたが、鈴木でも高橋でも同じことですね。

オブジェクトを階層構造で指定する方法

では、オブジェクトを階層構造で指定する具体的な例を見てみましょう。

下記画像のエクセルファイル(ブック)内には「名前」「住所」「電話番号」の3つのシートがあります。

この中の「住所」シート「セルA1」に「東京都」と入力するコードを書いてみましょう。

Sub addAddress()
    ThisWorkbook.Worksheets("住所").Range("A1").Value = "東京都"
End Sub
タナイ
タナイ

VBAで文字列を入力するときは””(ダブルクォーテーション)で囲うことを忘れないようにしましょう。

Worksheets(住所)などとした場合は、エラーになります。

この書き方だと「住所」という変数に格納された値を参照することになってしまう。

「住所」のシート、A1セルに「東京都」と入力されました。

このように、オブジェクトを明確に指定したい場合は、

アプリケーション.ブック.シート.セル

のように上の階層と下の階層を「.(ピリオド)」でつないで表現していきます。

この例ではWorksheets(“住所”)で住所ワークシートを指定した後、「.」でRange(“A1”)をつなぎました。こうすることで「住所ワークシートのA1セル」と命令対象のオブジェクトを明確にしたのです。

Worksheetsは複数のWorksheetオブジェクトを含むコレクションです。詳しくは別途解説しますが、そのオブジェクトが含まれているグループ全体を表すには複数形の表記にしてコレクションを用います。Worksheets(“住所”)なら、ワークシートコレクションの中の「住所」という名前のシートという意味になります。

オブジェクトを明確に指定しなかったときの挙動はどうなるか

では、ブックやシートの指定をしないでプログラムを作成したときの動きについても確認していきましょう。

結論から言うと、シートの指定をせずRangeを使った場合、アクティブになっているシートのRangeだと解釈されます。

Sub addAddress()
    Range("A1").Value = "東京都"
End Sub

たとえば上記のプロシージャを「名前」シートを選択した状態で動かすと、「名前」シートのA1セルが「東京都」に書き換わります。

プロシージャが動作している途中でアクティブシートが切り替わってしまえば、以降は切り替わったシートに対しプログラムが働くようになります。

結果、全く意図しない変更が加えられてしまい大惨事になることがあります。

タナイ
タナイ

VBAで書き換えた処理はExcel編集機能の「戻る」が使えません。プログラムの誤作動には細心の注意を払う必要があります。

オブジェクトの指定を明確にし、エラーを防ぐように心がけていきましょう。

コメント

タイトルとURLをコピーしました