Home » エクセルマクロ・Excel VBAの使い方 » 「オブジェクト名.プロパティ」という解説はウソですよ

「オブジェクト名.プロパティ」という解説はウソですよ

対象:Excel2007, Excel2010, Excel2013

VBA(Visual Basic for Applications)のコレクションオブジェクトについて、記事を書きました。

その続きの、コレクションオブジェクトから単一オブジェクトを取得するコードについて解説したいと思いますが、その前にどうしも書いておかなければいけないことがあります。

一般的によく見かけるオブジェクト式に書かれているのは、オブジェクト名ではなくプロパティだということです。

オブジェクトを特定する記述であるオブジェクト式について、
 「オブジェクト名.プロパティ」
 「オブジェクト名.メソッド」
のように書くといった解説が行われているWebや市販の書籍を見かけることがあります。

この誤った解説に騙されてしまっている人が、相当、いらっしゃいます。

[スポンサードリンク]

コード内に書かれるのはオブジェクト名なのか?

「オブジェクト名.プロパティ」という解説をそのまま信じてしまうと、例えば「Range("A1").Value」というオブジェクト式の「Range」を、オブジェクトの名前と理解するのは自然なことでしょう。

ですが、
「Range("A1").Value」というオブジェクト式に現われる「Range」は、
「Rangeオブジェクト」のRangeではありません。
「Rangeプロパティ」のRangeなのです、本当は。

仮に、
「オブジェクト名.プロパティ」
という解説を素直にそのまま信じるとしたならば、
 「ActiveCell.Value」は
 「ActiveCellという名前のオブジェクトのValueプロパティ」
 「Cells(1, 1).Value」は
 「Cellsという名前のオブジェクトのValueプロパティ」
と解釈しなければ、理屈が通らなくなってしまいます。

ですが、全オブジェクトを表示してくれるツールでもあるオブジェクトブラウザーのクラスペインをいくら探しても、ActiveCellという名前のオブジェクトも、Cellsという名前のオブジェクトも見つかりません。

「オブジェクト名.プロパティ名」という解説に騙されるな

もしも、ActiveCellという名前のオブジェクトが存在するならオブジェクトブラウザーのクラスペインで、Actionsの下に、ActiveCellが存在しているはずです。

もしも、Cellsという名前のオブジェクトが存在するならオブジェクトブラウザーのクラスペインで、CellFormatの下に、Cellsが存在しているはずです。

そんなオブジェクトはExcel VBAには存在しませんから、もちろん表示されるわけもありません。

コードに書かれるのはオブジェクト名ではなくプロパティ

結局、標準モジュール内の一般的なコードに書かれているのは、オブジェクト名ではないのです。

標準モジュール内のプロシージャでオブジェクト名を書くことも可能ですが、そのようなコードの例を見かけることは決して多くはありません。

Rangeも、ActiveCellも、Cellsも、オブジェクト名ではなく、プロパティなのです。

RangeもActiveCellもCellsも、グローバルのメンバーであるため、上位のオブジェクトへの参照・上位のオブジェクト式を書かないことが一般的ですが、勿論、上位のオブジェクト式から書くこともできます。

上位のオブジェクト式であるApplicationからコードを書いてみると、RangeもActiveCellもCellsもプロパティだということがよく見えてきます。

自動メンバー表示のアイコンを見ると、Rangeにはプロパティのアイコンが表示されています。

「オブジェクト名.プロパティ名」という解説に騙されるな

ActiveCellにもプロパティのアイコンが表示されています。

「オブジェクト名.プロパティ名」という解説に騙されるな

Cellsにもプロパティのアイコンが表示されています。

「オブジェクト名.プロパティ名」という解説に騙されるな

コードに書かれているのは、RangeもActiveCellもCellsもプロパティで、コードが実行されたときに、いずれもRangeオブジェクトを返すのです。

RangeもActiveCellもCellsも、グローバルメンバーであるため上位のオブジェクトへの参照・上位のオブジェクト式を省略できるプロパティなのです。

「オブジェクト名.プロパティ名」という解説に騙されるな

「オブジェクト名.プロパティ」という、記述に騙されないでください。

コードに書かれているのは、あえて書くなら「プロパティ.プロパティ」ですが、こんな書き方をしても、オブジェクト式を理解できていないレベルの方には、まったく意味がわからなくなってしまいます。ですから、オブジェクト式についてしっかり理解してらっしゃる著者さんは、書かれているプロパティがコード実行時にオブジェクトを返すということで、
「オブジェクト.プロパティ」
という記述をしてらっしゃるはずです。
誤解を与え続けてしまう、間違った、
「オブジェクト名.プロパティ」
という書き方ではなく。

なお丁寧に書くならば、コードに書かれているのは「(オブジェクトを返す)プロパティ.(単なるデータを返す)プロパティ」でしょう。

変数宣言部に書かれるのはオブジェクト名

なお、コードの中に出てくるRangeは、上記のとおりプロパティであって決してオブジェクト名ではありませんが、変数宣言に出てくる「Range」はオブジェクト名です。

変数宣言するときの自動メンバー表示のアイコンは、オブジェクトのアイコンですよね。

「オブジェクト名.プロパティ名」という解説に騙されるな

変数宣言で出てくる「Range」はオブジェクト名ですが、変数宣言以外で出てくる、オブジェクトを参照するための記述・オブジェクト式で書かれる「Range」は、しつこいようですが、オブジェクト名ではなくプロパティです。

これまで、「Range("A1").Value」のRangeを、RangeオブジェクトのRangeと思い込んでいた方は、この記事を一度読んだだけだと、相当に混乱するはずです。が、その混乱を抜けてオブジェクト式の文法をちゃんと理解すると、今までよく読めていなかったVBAのコードが、まったく違うものに見えてくることをお伝えしておきます。

最終更新日時:2018-12-30 06:01

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 「オブジェクト名.プロパティ」という解説はウソですよ

「エクセルマクロ・Excel VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.