VBA(Visual Basic for Applications)でマクロを作成するようなときに、ExcelのCellsプロパティで自動メンバー表示させる方法、WorksheetsプロパティではCellsプロパティで有効な方法が使えないということ、そもそもVBE(Visual Basic Editor)で自動メンバー表示されるものとされないものの違いが何なのか、を記事にしてきました。
今回はCellsプロパティで引数指定をしたときに、自動メンバー表示されない理由を解説しておきます。
なお、
この理由は、私が自力で見つけたものではなく、「Making Sense of Cells Intellisense - Part 1」という記事で知ったものです。
I would like to thank Mr. Colin Legg for the excellent article.
Cellsで自動メンバー表示されない理由
Cellsプロパティで自動メンバー表示されない理由を、1行でまとめると以下のとおりです。Cellsプロパティで引数を指定した場合、Rangeオブジェクトのデフォルトプロパティに引数を指定したことになり、Rangeオブジェクトのデフォルトプロパティの戻りが、Variant型のため
Cells().なら自動メンバー表示される理由
上位オブジェクトを参照する記述がない状態で
「cells(1, 1).」
と書き始めた場合は、グローバルなCellsプロパティを利用していることになります。
オブジェクトブラウザで、グローバルなCellsプロパティを確認すると、
「Property Cells As Range」
と記述されています。
CellsプロパティはRangeを返すと書かれています。
Cellsプロパティは曖昧なObjectではなく、明確にRangeを返すわけです。ですから、本来的にはCellsプロパティはRangeオブジェクトのメンバーを自動的に表示できるのです。
これが、引数指定を省略して「cells().」「cells.」と書いたときにRangeオブジェクトのメンバーが自動的に表示される理由です。(前回の自動メンバー表示されるものとされないものについての記事の最後に、疑問を感じるはずと書いた部分でもあります)
Cells(1, 1).では自動メンバー表示されない理由
さて、
「cells().」「cells.」なら自動メンバー表示されるのに「cells(1, 1).」では自動メンバー表示されない理由です。
注目すべきは
「Property Cells As Range」
という記述です。引数を指定できる形になっていません。
引数を指定できるプロパティは、例えばグローバルなRangeプロパティのように、
「Property Range(Cell1, [Cell2]) As Range」
と、記述されているものなのです。
Cellsプロパティは
「Property Cells As Range」
と引数を指定する形になっていませんから、(本来は)引数を指定できないことになってしまいます。
しかし、
Excelでマクロを作るときに、Cellsプロパティに引数を2つ指定するのは、極めて一般的なことです。
コードウィンドウで「cells(」と入力したときは、下図のように、
「_Default([RowIndex], [ColumnIndex])」
というヒントまで表示されます。
RowIndex・ColumnIndexと2つの引数を指定できることをヒントは示してくれています。
どういうことなのでしょうか??
ヒントに「_Default」と表示されているところに秘密が隠されています。
Cellsプロパティは
「Property Cells As Range」
のとおり、Rangeオブジェクトを返すので、Cellsプロパティで引数の指定をした場合に、Rangeオブジェクトの_Defaultプロパティの指定を開始したと解釈されている、ということなのです。
オブジェクトブラウザでRangeオブジェクトのデフォルトプロパティを確認すると、
「Property _Default([RowIndex], [ColumnIndex])」
と書かれています。
ヒントに表示されていた
「_Default([RowIndex], [ColumnIndex]」
と同じ記述があります。
そして、、「As Range」といった戻りの型が明示されていません!
型が明示されていないということはオールマイティなVariant型が返されるということです。
Variant型は、Object型よりも更に何でもOKな型ですから、自動メンバー表示しようがないのです。
これが、Cellsプロパティで引数指定を行うときに、自動メンバー表示がされない理由です。
まとめ
ここまでの記事を全部まとめると、以下のとおりです。
Cellsプロパティに「cells(1, 1).」のように引数を指定したときは、戻りの型がVariantであるRangeオブジェクトの_Defaultプロパティを指定しているとみなされ、自動メンバー表示されない。
しかし、Cellsプロパティに引数を指定しないときには戻りの型がRangeと明確なため、「cells().」「cells.」のように引数指定を行っていないときにはRangeのメンバーが自動的に表示される。Cellsプロパティを使ったときに自動メンバー表示されない理由について、日本語では、明らかに間違った情報も流れてしまっていますが、これが筋の通った理由です。
I wish to thank Mr. Colin Legg again for the great article.
Home » Excel VBA Rangeオブジェクト » Cellsプロパティ » Cellsプロパティで自動メンバー表示されない理由