● Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について・その2・簡易版~(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があります。Excelはプロパティ経由、Accessはコレクション経由、が多いです。)

※2018/09/24、ツリーの図が間違っていたので色々直しました。それ以前員読まれた方、ウソ情報を書いてしまい、ごめんなさい。
  
※2019/05/14 修正:この記事の「コレクション経由のオブジェクト取得ができる」という記述はすべて間違いでした。
大変申し訳ございませんでした。
本日別件でたまたまAccessのオブジェクトブラウザを見てみたら、すべて間違いとわかりました。
「大切な基礎の部分」で大ウソを流布してしまい、本当に申し訳ございませんでした。
穴があったり入りたいです。

「オブジェクト式」におけるAccessの「Forms」(つまり「Application.Forms」の「Forms」)は、「コレクション名」ではなくExcelの場合と同様、「プロパティ名」でした。
Accessのオブジェクトブラウザで確認できます。
Accessのオブジェクトブラウザで、Applicationを検索してオブジェクトのメンバを見ると、中に「Forms」というものがあり、すると、そのアイコンは「プロパティ」を表すアイコンです。
また、一番下の説明ペインにも「Property Forms As Forms」と書いてあります。
つまり、「プロパティのForms は、Forms というコレクションオブジェクトを返します。」という意味ですから、結果、「Application.Forms」の「Forms」は、コレクションではなくプロパティでした。
よってAccessでよく書く「Forms("フォーム1")」とか「Forms(1)」などの「Forms」は「コレクション名」ではなく「プロパティ名の「Forms」であった、ということです。
VBE上でFormsにカーソルを置いて、F1キーを押すとコレクションのことが出てきて、かつ、Excelのヘルプのように「 ××× オブジェクトを取得するには ××× プロパティを使います」と明示的に書いてないので誤解してしまいました。
今後は、オブジェクトブラウザから先に見るようにします。

ExcelやWordなどの「ユーザーフォーム」の各コントロール(テキストボックスやコマンドボタンなど)の場合も、これに同じです。
オブジェクトブラウザで調べると説明ペインに「Property ×××× As ×××× 」と書いてあります。

※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。

目次
 ★ はじめに。「オブジェクトの取得」とは?
 ★ オブジェクトの取得=参照式を書く、という場合の複数の方法(複数の系統)
 ★ もう少し言い方を変えると・・・
 ★ オブジェクトモデルの構造からすると、(01)が自然なんだけど、Excelでは(02)がメッチャ多い。
 ★ オブジェクトやプロパティのヘルプを読んだときの用語の解説
 ★ 「Range.Range プロパティ」と「Worksheet.Range プロパティ」のヘルプをオブジェクトブラウザから明確に切り替える方法
 ★ オブジェクトの取得を「プロパティ経由で書く」・・・ということの実際とその意味のもう少し詳しい説明?掘り下げ?(「ヘルプ」に書いてあること。)
 ★ 結局、プロパティやメソッドには2種類のそれらがあることになります。
 ★ Excel以外のソフトの状況
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
  
  
  
  
本記事は、VBA初心者の方への記事です。
以下の記事をお読みなって、「オブジェクトって何?、オブジェクト変数って何?、コレクションって何?」、ということをなんとなくでイメージしてもらえると、本記事もなんとなくわかっていただけるかもしれません。

※絶対にこちらも読んでおいてください!! ↓↓↓
★★★★★★★★★★★★★★★★ 超重要!!必読!!ExcelVBAが上達するかどうかの最初の分かれ道!オブジェクトとオブジェクト式について~★★★★★★★★★★★★★★★★
少し詳しく、でもそこそこまとめた記事です。

用語:VBAプログラミングでの「オブジェクト」 について

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(詳細版:巷では個々の細かい用語の説明ばかりで、全体像としては、意外と短くはまとめられていないこと)

用語:「オブジェクト変数」とは?(ついでに「コレクション」についても少し・・・)

Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があります。Excelはプロパティ経由、Accessはコレクション経由、が多いです。)

Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?~その2(詳細版:巷では意外と分類・整理・説明されていないこと)

  
  

うまく説明できていないですけど、よろしくお願いいたします。

  
  
★ はじめに。「オブジェクトの取得」とは?

VBAプログラミングでは、「オブジェクト」に「プロパティ」を与え、「メソッド」で動かす、という処理をすることが多いです。

そして、その「オブジェクト」についてですが・・・、ExcelでもWordでもAccessでも、VBAにてオブジェクトに「プロパティ」を与え、「メソッド」で動かすという「操作」「処理」をするためには、まず、なにはともあれ、「オブジェクトの取得」という作業をしなければなりません。

「オブジェクト」に対する操作(命令)は、「オブジェクトの取得」があってはじめて、できることでありまして、逆に言いますと、それができなければ何も操作ができませんので・・・。

また、「オブジェクトを取得する」とは、
・「操作対象のオブジェクトを1つに特定する。」とか、
・「操作対象としたい、何らかの1つのオブジェクトを、選択する。」
・「操作対象としたい、何らかの1つのオブジェクトが、”選択された”、という状態にする。」

という意味の作業でもあります。
例えばヘルプを読んでいるときは、その文脈等を考えて、一番しっくりくる訳をあてはめればいいと思います。

  
  
で、「じゃあ、実際のプログラミングでは何をするの?」というとなんですが、実際にプログラムを書くときの「オブジェクトの取得」とは、
・「オブジェクトへの参照式を書く」
・「オブジェクトへの参照を”式”として書く・式にする」
・「オブジェクト式を書く」
という作業をします。
(以降、ちょっと短くして「オブジェクト参照式とか、適当に書いてしまいます。もしくはヘルプに書いてあるとおり「オブジェクト式」という言葉を使います。すみません。)

つまり、「オブジェクトを取得する」とは、プログラム記述的には、「オブジェクト参照式を書く」という意味になります。

(※ヘルプでは「オブジェクト式」と書かれています。「オブジェクト式=特定のオブジェクトを指定する式。」とも書かれています。)

「オブジェクト参照式が正しく書けた」時点で、「オブジェクトの取得が完了した」ということになります。(上記の箇条書きの状態が完了した、ということにもなります。)

※参考記事
当サイトでは「オブジェクト参照式」「オブジェクト式」のほかに、便宜上、「部分オブジェクト式」という言葉も使っています。「今選択しているオブジェクトの階層構造を省略しないオブジェクト式を書くため」に、その説明に便利なのでそうしています。そのことについては→こちら
  
  
で、そのあとは、ケースバイケースですが、そのままその参照式を使うことが多いです。
(特に初心者の方の場合は多いです。)

中級者になると、その取得したオブジェクト(正しく書いたオブジェクト参照式)を、「オブジェクト変数」というものに代入することができるようになってるいるので、そういう処理が増えてきます。

というわけで、例えばヘルプやWeb記事などで「オブジェクトの取得」という言葉を見たときは、
「ああ、まずは、正しい参照式を書いて、オブジェクトをゲットすることが必要なんだな」
ということと、
「取得したオブジェクトはオブジェクト変数とかいうものに丸っと代入できるんだな」
ということの、
2つのことを思い浮かべてください。

  
  

★ オブジェクトの取得=参照式を書く、という場合の複数の方法(複数の系統)

ExcelVBAに限らず、WordもAccess・その他を含めたVBAプログラミングでは、この「オブジェクトの取得をする」、すなわち、「オブジェクト参照式を正しく書く」時に、少なくとも3系統の書き方(入り口)があります。

(01)「コレクション経由」で書く方法(コレクション=コレクションオブジェクト)
(02)「プロパティ経由」で書く方法
(03)「メソッド経由」で書く方法

  
  

  
  
★ もう少し言い方を変えると・・・

例えば、(01)の「コレクション経由」で書くとは、「コレクションを入り口としてオブジェクト参照式を書く」、「コレクションを入り口としてオブジェクトを取得する」というようなイメージです。

(02)の「プロパティ経由」で書くとは、「コレクション経由ではなくてプロパティを入り口としてオブジェクト参照式を書く」、「プロパティを入り口としてオブジェクトを取得する」というようなイメージです。

(03)の「メソッド経由」で書く、ということなら、「コレクション経由やプロパティ経由ではなくてメソッドを入り口としてオブジェクト参照式を書く」、「メソッドを入り口としてオブジェクトを取得する」というようなイメージです。

※このとき、単一オブジェクトを取得する場合は、コレクション経由・プロパティ経由・メソッド経由、すべてにおいて「引数」と呼ばれるものが必要になることが多いようです。カッコを使ってその中に引数(設定値)を記述する場合が多いようです。
「Range("A1")」とか
「Worksheets(1)」、「Worksheets("Sheet1")」とか、そういう「×××(引数)」みたいな形の、カッコと引数(設定値)がくっついたパターンです。

単一オブジェクトではなく、コレクションオブジェクトを取得する場合もあります。そのときは、プロパティ経由・メソッド経由が多いのですが、その場合は、カッコや引数が何も必要なく、プロパティ名やメソッド名を書くだけでコレクションオブジェクトを取得できる場合が多いようです。
「Worksheets」とか、
「Workbooks」とか
「Axes」とか、そういう感じのカッコなどが無いパターンです。
(逆に言うと、プロパティ名やメソッド名だけだとコレクションが取得されてしまうので注意します。他の場所でエラーにならないようにするために。)

※「オブジェクト」には大きく分けて、2種類があります。「単一のオブジェクト」と「同種・あるいは異種の”単一のオブジェクト”たちを複数束ねた、コレクションオブジェクト(=略してコレクション)」との2種類です。
※コレクションの中身がすべて同種のオブジェクトとは限りません。Sheetsコレクションなどがいい例です。Sheetsコレクションはワークシートやグラフシート、その他シートの集合体です。例えば、「Workbook.Worksheets プロパティ」は、引数を何も書かないとコレクションを取得できますが、それはWorksheetsコレクションではなく、Sheetsコレクションを取得します。(そういうややこしい仕様にすることはできればエンドユーザーとしては嫌なんですが・・・。なんでこんな仕様にしたんでしょうか?大変紛らわしいです。)


※コレクションにはどんながものあるか?を知りたいときは、オブジェクトブラウザで「Item」で「完全に一致する単語だけを検索」、で検索するとずらっと出てきます。ヘルプによると、多くのコレクションの既定のプロパティが「Itemプロパティ」だそうなのでそういう動きになるんだと思います。(実際にはExcelのライブラリじゃなくてOfficeのライブラリのItemプロパティが”既定”みたいですけど・・・)
  
  
さらに言うと・・・

(01)「コレクション経由」で書く・・・とは、Accessに多いのですが、たとえば、Forms(0)とかForms("フォーム名")と書いて、フォームをオブジェクトとして取得する方法です。
このとき、「Forms」は「Formsコレクション」そのものです。
「コレクション」とは、「単一オブジェクトを複数束ねたもの」ですから、複数あるものの中から、単一のどれかをチョイスする」といった感じになるので「自然」です。
Excelの場合は、「ユーザーフォーム」や、その上に配置するコマンドボタンやリストボックス、コンボボックスなどを取得する場合が「コレクション経由」(コレクション直)で書く場合が多いです。

それに対して、(02)「プロパティ経由」で書く・・・とは、プロパティの設定値(引数とか)を指定することのみで、しかし、同時にオブジェクトまでも、「連鎖的・共同的・連動的」に 取得してしまう・呼び出してしまう方法です。
ExcelやWordに多いのですが、例えばExcelなら、「Range.Rangeプロパティ」です。
「Range.Rangeプロパティ」は「RangeオブジェクトのRangeプロパティ」という感じの意味ですが、このプロパティの場合、「Range.Rangeプロパティ」の設定値を記述しただけで、「Range.」というオブジェクトを連鎖取得したとみなします!・・・みたいな感じです。
「Range("A1")」みたいに書きます。

Rangeは選択範囲を意味するオブジェクトですが、選択範囲はもともと決まったサイズのものが複数あるわけでもなく、「どっからどこまでとどっからどこまで」みたいに複数の選択範囲を一度に処理したい場合もあります。

いまやっと思えたですけど、「選択範囲」は結構「ぐっちゃぐちゃで不規則な形」になるので、「コレクションから整然とどれかをチョイスする」、なんてことははなから無理っぽいです。
(Accessの「選択」は列と行の指定だけとか、SQLとかでやるので、かっちりしてて、不規則な形にはなりにくいです。)

なので、かどうかは知りませんが、まあ、たしかに「Range.Rangeプロパティ」で選択範囲を指定することで、『(選択範囲起点で=Rangeプロパティ起点で)オブジェクトを自動連鎖取得する・・・』、というのは面倒が無くて便利といえば便利かもしれません。(Range.Cells プロパティなども同様)

でもまあ、それでも僕なんかは「Range.Select」みたいなプロパティを作ってもらって『「Range.」(オブジェクト名)は省略可能です』みたいにしてくれたほうがわかりやすくていいのにな、なんて思ってしまいます。
特に「Worksheetオブジェクト」なんて、「プロパティじゃなくてコレクションから選ぶ形でいいのに・・・」、なんて思ってしまいます。

なお、(03)の、「メソッド経由」も『(02)「プロパティ経由」で書く・・・』と同様な感じです。

  
  
★ オブジェクトモデルの構造からすると、(01)が自然なんだけど、Excelでは(02)がメッチャ多い。


  
「オブジェクトモデル」としては階層構造になっていて、上から・・・
「コレクション=コレクションオブジェクト=単一オブジェクトが複数に束ねられたもの」
「単一オブジェクト」
となっていると思います。
そしてそれぞれにプロパティやメソッドがあります。

一応簡易的なイメージ図にしてみると・・・・(あくまでもイメージ図です。)、
  
  
上位の階層の:単一のオブジェクト(A) ---- プロパティやメソッド(B)
    |
    |
   現階層の:コレクション(C) ---- プロパティやメソッド(D)
    |
    |
   現階層の:単一のオブジェクト(E) ---- プロパティやメソッド(F)
        |
        |
     下位の階層の:コレクションor単一オブジェクト(G)--プロパティやメソッド(H)
  
  
・・・といった感じのイメージでオブジェクトモデルの構造になっていると思うんですが、今、取得したいのは(E)だとします。

実際、ほとんどの場合が(C)ではなく(E)が多いと思うんですが、
まず、「コレクション経由」で(E)を取得したい場合は、(C)→(E)という上から(縦方向だけ)のある意味「正の流れ」
となる感じだと思います。

一方、そうではなく、「プロパティ経由」で(E)を取得したい場合は、(B)→(E)という「斜め上?」「横方向からの動きを含んだ?」からの「イレギュラーな流れ」
で取得する・・・。
といった感じでしょうか?

ただ、ここで一つ注意点があるのですが、(B)からの取得の場合は、大雑把に言うと・・・、「上の階層のプロパティやメソッドから取得する・・・」ということなんですが、ただそれは現:単一オブジェクトの上に在るコレクションのプロパティやメソッドからではなく、この図ではそのまた上の、「1つ上位の階層の」「単一オブジェクト」の「プロパティやメソッド」からの取得となります。これを覚えておくと、オブジェクトブラウザが見やすくなりますし、ヘルプとの連携・活用・コスパアップもしやすくなります。(例えば「Worksheetオブジェクト(単一)」の取得の場合は、「Worksheetsコレクション」が保持するプロパティやメソッドからではなく、上位の単一オブジェクトの「Workbookオブジェクト」が保持するプロパティやメソッドから(その場合は「Worksheetsプロパティ」から)オブジェクトを取得する、という動きになります。)

なお、(B)からの取得の流れが、(B)→(E)っていう風に、(E)へ「直」で行くものなのか、それとも、(B)→(C)→(E)っていう感じで(C)の「コレクション」をワンクッション挟んで行くものなのかは、僕にはまだわかりません。
(「オブジェクトを取得できるプロパティ」のうち、その多くが「引数を何も指定しない場合は自動的にコレクションを取得することになる」という性格を持っているようですので、そのことからすると「(C)のコレクションを経由する」ということなのではないかと思います。そこから察しますに、「引数を指定した場合もコレクションを経由することになる」ということなんではないかと思われますが、それが本当にそうなのkは僕にはまだわかりません。)

その辺はプロの先生にお金をお支払いして聞いてください。

でも、Excelの場合は、むしろその(B)→(C)→(E)のルートのほうが多いのかしらん??

もちろん、(C)もオブジェクトの一種ですので、(C)を取得したい場合は、(B)→(C)もあります。

「プロパティ経由」でのオブジェクトの取得についてはひとまず以上です。
  
  
【補足】
「オブジェクト式」に近いイメージの「オブジェクトの階層構造図」について

上の図では、プロパティの位置関係を描かないといけなかったので、コレクションの位置づけが、縦方向(つまり単一オブジェクトの上)にありましたが、プロパティをちょっと置いておいて、「オブジェクト式」基準で考えると、「コレクションは単一オブジェクトの左側」にあるほうが、「オブジェクト式」との連動ができて、理解しやすいです。
例えば下図のような感じです。

  
上位の階層の:
コレクション---単一オブジェクト 
            |
            |
           現階層の:
           コレクション---単一オブジェクト
                        |
                        |
                      下位の階層の:
                      コレクション---単一オブジェクト

※もちろん、すべてのコレクションと単一オブジェクトのそれぞれの中に、それぞれ独自のプロパティ・メソッド・イベント等々が内包・保持されています。

なお、このような図のかたちで考えると、それぞれの階層を「ドットで区切るイメージ」とリンクさせられるので、その意味でもわかりやすいのではないかと思います。
それぞれのコレクションと単一オブジェクトに、すべてに「プロパティ」と「上下階層自由往来機能」「上下階層のメンバ流用機能」が内包され、また、多くにメソッドも内包されています。イベントが内包されているものもあります。

実際、「オブジェクト式」の記述では、このように、コレクションが単一オブジェクトと同じ階層にあるかのように見えます。(たとえば、「コレクション用の階層」が、「1階層分、ドットとドットで囲まれることはありません」ので。)

「オブジェクト式」の記述では、コレクション単位、あるいは、オブジェクト単位の「いずれか」で、「 . (ドット)」で区切ります。
「コレクション単位で1つ目のドットを使い、オブジェクト単位で2つめのドットを使い・・・」というようなことはしません。ドットとドットの間に書くのは、コレクションか単一オブジェクトのいずれかです。

その「雰囲気、図式」が、1つ前の図よりも、この直上の図のほうがよく表れてます。
マイクロソフトのサイトのオブジェクト全図では、1つ前の図と同じく、「コレクションが縦(上)に位置して」いますが・・・、つまり、コレクションと単一オブジェクトで「2階層分」を取っていますが、実際には、コレクションと単一オブジェクトで「1階層分」しか使っていません。(オブジェクト式に則した実際のイメージでは。)
その点をよく見ていただいて、直上の図のイメージで理解もしてみてください。
  
  
※補足終わり。これ以降は、1つ前の図のほうに戻ります。

  
  

あと、「メソッド経由」でオブジェクトを取得する場合も、「プロパティ経由」の場合と同様に、(B)→(E)(もしくは(B)→(C)→(E)?)という、「ある意味イレギュラーな流れ」です。
  
  
ちなみにですが、Excelの場合で、(C)→(E)という「正の流れ」でのオブジェクト取得が多いのは「ユーザーフォーム」がらみの場合です。「ユーザーフォーム」を作ったときに、コマンドボタンやリストボックスなどの取得に(C)→(E)という「コレクション経由」の流れが多いです。(「コントロール」と呼ばれるオブジェクトの一種の取得をする場合に多いです)

Accessもこの(C)→(E)という「正の流れ」・「コレクション経由」でのオブジェクト取得が多いです。

(B)→(E)(もしくは(B)→(C)→(E)?)という「イレギュラーな流れ」が多いのが、ExcelやWord、
ということになるかと思います。(PowerPointなどは調べてませんのでご自分でも調べてみてください。ヘルプに
  
  

なんで、そんな風に異なるの?ということなんですが、あまり考えないほうがいいと思います。
大切なのは、Excelでも、Wordでも、Accessでも、
・「単一のオブジェクト」を取得するには、(C)→(E)というある意味「正の流れ」と
  (B)→(E)・(B)→(C)→(E)・(B)→(C)というある意味「イレギュラーな流れ」のなかで、
・3系統のやり方があって(=コレ・プロ・メソ経由の3つ(2つ)の入り口があって)、
・ソフトによってそれぞれのウェイトが違う、
ということを理解することと、
・プロパティ経由だろうが、コレクション経由だろうが、メソッド経由だろうが、取得しているのは「オブジェクト」であり、
・「そうやってオブジェクトを取得できる」
という事実です。

逆に言うと、「そうやってでしか、オブジェクトを取得でき”ない”(特にプロパティ経由やメソッド経由)」「もとからそういう掟・仕様になってしまっている」「だからあれこれ考えても仕方がない」という事実です。

もっと言うと、本当に大切なのは、「最終的には、今現在・どんなオブジェクト(単一 or コレクション)を取得できているのか?が明確にわかりされすればいい。」ということです。

『 単一オブジェクトの取得は、コレクション起点の ”正の流れ” 以外に、プロパティやメソッド起点での ”イレギュラーな流れ” でもできる 』、という事実をあらかじめ知っていれば、ヘルプも、VBAのWeb記事も、書籍も、全部理解度が上がるからです。

ヘルプやWeb情報が自力で読めるようになれば、当然、記述ミスやトラブル解決の腕も上がると思います。

  
  
★ オブジェクトやプロパティのヘルプを読んだときの用語の解説

(ア)オブジェクトのヘルプの場合

「▽▽オブジェクトを取得するには、××××プロパティを使用します。」
=「▽▽オブジェクトを取得するにはコレクション経由などではなく、××××プロパティ経由で取得してください。というか、××××プロパティを使えば自動的に▽▽オブジェクトを取得できます。もっと言うと、××××プロパティ経由じゃないと▽▽オブジェクトを取得できない仕組みにしてあります。」

  
  
(イ)コレクション(=コレクションオブジェクト)のヘルプの場合

「×× オブジェクト」
=「××オブジェクト という名前のコレクション。」

「××オブジェクトは ▽▽コレクションのメンバー」
=「××オブジェクトは ▽▽コレクションに属します、含まれます、など。」

「××コレクションを取得するには、▽▽プロパティを使用します。」
=「▽▽コレクションを取得するにはコレクション経由などではなく、××××プロパティ経由で取得してください。というか、××××プロパティを使えば自動的に▽▽コレクションを取得できます。もっと言うと、××××プロパティ経由じゃないと▽▽コレクションを取得できない仕組みにしてあります。」

具体例:「単体の Worksheet オブジェクトを取得するには、Worksheets(index) プロパティを使用します。引数 index には、ワークシートのインデックス番号または名前を指定します。」
=「Worksheets(グラフシートなどを除く左からの順番)といった感じで書くか、Worksheets("シート名")と書けばWorksheet オブジェクトを取得できます。」

  
  
(ウ)プロパティのヘルプの場合

「××を返します。」(××はオブジェクトかコレクション)
=「××を取得できます。」
=「××をオブジェクト変数に代入できます(Set構文で)」

「オブジェクト修飾子を指定せずにこのプロパティを使用すると、××となります」
=「構文の、プロパティ名の前の部分を指定せずに省略すると、××となります」
=「例えば Range.Range プロパティ の場合、プロパティ名の前の部分を指定せずに省略すると、××となります」

「Range.Range プロパティ」
=「RangeオブジェクトのRangeプロパティ」

「Worksheet.Range プロパティ」
=「WorksheetオブジェクトのRangeプロパティ」

「Range.Range プロパティ」はRange.Rangeと2単語を書いた時点で1つのオブジェクトを返す?
「Worksheet.Range プロパティ」はWorksheet.Range2単語を書いた時点で同上?
で、両方ともRange.やWorksheet.省略すると「ActiveSheet.Range のショートカットとなります。つまり、アクティブ シートから範囲を取得します。アクティブ シートがワークシートでない場合、このプロパティは失敗します。」となる・・・と書いてあります。
  
  
★ 「Range.Range プロパティ」と「Worksheet.Range プロパティ」のヘルプをオブジェクトブラウザから明確に切り替える方法

  
  

★ オブジェクトの取得を「プロパティ経由で書く」・・・ということの実際とその意味のもう少し詳しい説明?掘り下げ?(「ヘルプ」に書いてあること。)

Excelの場合は、セルやシートなどをオブジェクトとして取得したい場合は、基本、「1つ上位の単一オブジェクト」が保持する「プロパティ」経由でオブジェクト式を書くことになります。

ここでは「A1セル」を取得する場合を考えてみます。

「A1セル」をオブジェクトとみなしてVBAで操作をしたいときは、冒頭でも書いたとおり、まずは、「A1セルを意味するRangeオブジェクト」というものを取得しないといけません。

つまり、「A1セルをオブジェクトとして取得する参照式を書く」・・・、「A1セルのオブジェクト式を書く」・・・、ということになります。

基本、A1セルをオブジェクトとして取得する参照式は、「Range(”A1”)」と書きます。
(階層構造を省略せずに書くと「Application.Workbooks(番号か名前).Worksheets(番号か名前).Range(”A1”)」となります。)

で、この「Range(”A1”)」の「Range」、ですが、この単語を「1単語だけ」で見ると、実はそれは「Rangeオブジェクト」という意味ではありません。

「Range(”A1”)」という風に、セルのアドレスをカッコで囲んで書くところまでを含めて、はじめて、「Rangeオブジェクト」となります。

逆に、そうでないと「Rangeオブジェクト」とはなりません。

それでは「Range」1単語だけで見た場合、それは何なのか?というと、それはRangeオブジェクトの1つ上位単一オブジェクトである、「”Worksheetオブジェクト”が保持=保有=内包するRangeプロパティ」の「Range」なのです。

その証拠にというと何ですが、「Rangeオブジェクト」のヘルプページを読むと、途中に(割と上のほうかな?「使用例」のところに)・・・

『 1つのセルまたはセル範囲を表す Range オブジェクトを取得するには、Range(arg) プロパティを使用します。』

・・・と書いてあります。

では、今度は「Rangeオブジェクト」や「Worksheetオブジェクト」の、「Rangeプロパティ」のほうのヘルプページを読んでみると・・・・

(このプロパティを使うことで)『セルまたはセル範囲を表す Range オブジェクトを返します。』(を返します=を取得できます。)

・・・と書いてあります。

※注
RangeオブジェクトのRange プロパティ→Range.Range プロパティ
WorksheetオブジェクトのRange プロパティ→Worksheet.Range プロパティ

なぜ、「Range プロパティ」というだけの情報から、「Rangeオブジェクト」や「Worksheetオブジェクト」のことが出てくるかというと、「オブジェクトブラウザ」で「Range」で「完全に一致する語句」モードで調べると、「Range プロパティ」を保持しているオブジェクトの一覧が出て、その中に、「Rangeオブジェクト」や「Worksheetオブジェクト」が出てくるからです。この一覧のオブジェクトが、「Rangeオブジェクト」の1つ上位の単一オブジェクトたちです。ほかにも出てきますが、その2つが今の話に一番関係するっぽいのでその2つを選びました。
  
  
つまり、
『Range オブジェクトを取得するには、(何らかの上位の単一オブジェクトの)Range(arg) プロパティを使用します。』
『(このプロパティを使うことで)Range オブジェクトを返します。(返します=取得できます。)』
と書いてあるわけです。

なので、「Range(”A1”)」の「Range」という単語は、「Rangeオブジェクト」という意味ではなくて、「Rangeオブジェクトが保持=保有=内包するRangeプロパティ」の「Range」なのです。

で、「Range」という1単語だけで見ると確かに「プロパティ名」なんですが、繰り返しになりますが、「Range」という単語だけはなく、「("A1")」もくっつけた「Range("A1")」全体で見てみると、この「Range(”A1”)」全体は、「オブジェクト(Rangeオブジェクト)」としてとらえることができます。

「Range」だけを見ると「単なるプロパティ名」・・・、でも、
「Range("A1")」全体で見ると「オブジェクト」・・・となります。

この場合、「オブジェクト名」ではなく、「オブジェクト」となります。
「Range("A1")」という記述は、「A1」というセルの、入力値、セルの色、フォント、文字の色や大きさ、数式、罫線設定、等々、その他すべての機能を保持した「オブジェクト」となります。

「Range」という1単語だけで見るとそれは「プロパティ名」で、
「Range("A1")」とカッコやセルのアドレスも含めるとそれは、『オブジェクトを表現している「オブジェクト式」』である・・・、
とも言えます。


そういう理屈になります。

※補足01
Excelには「Rangeプロパティ」は、Application、AutoFilter、Hyperlink、Range、Shapes、Worksheetといった複数のオブジェクトに存在しますが、ヘルプにはそのどれもが、(微妙な違いはありますが)基本的には「セル範囲を表す Range オブジェクトを返します(××を返します=××を取得できます)。」と書かれています。

※補足02
逆に言いますと、もし(Rangeプロパティではなく)、Rangeオブジェクトだけで直接、Rangeオブジェクトを取得できるなら、ヘルプには、
『1 つのセルまたはセル範囲を表す Range オブジェクトを取得するには、このオブジェクトを使って、Range(arg) と書きます。』
と書かれているはずです。
わざわざ、『Range(arg) プロパティを使用します。』などと、プロパティの指定などがなされることはないと思います。

同じように、Rangeオブジェクトが保持する「Cellsプロパティ、RangeプロパティとCellsプロパティの複合、Offset プロパティ、Union メソッド 」も、それ経由でオブジェクトの取得ができる、すなわち、オブジェクト参照式が書ける、そういう「プロパティ」や「メソッド」だ、ということになります。
これは「Rangeオブジェクト」のヘルプの一番最初に書いてあります。

  
  

★ 結局、プロパティやメソッドには2種類のそれらがあることになります。

オブジェクトを取得するのに、「プロパティ経由」の書き方がある、ということは、
(ExcelだけでなくすべてのソフトのVBAのプロパティには)、
「ただ単に設定値を取得するだけのプロパティ」(フォントの種類、××色、幅、高さ、など)

「プロパティの設定値(引数)などを指定ができつつ、同時に、オブジェクトの取得までもが、連鎖的・共同的・連動的にできてしまうプロパティ」(RangeオブジェクトならRangeプロパティ、Cellsプロパティ、など)
の2種類がある、
ということも意味しています。(詳しくは→こちらの素晴らしい正統派・王道の講師さんのWebページを。僕もこちらで知りました。)

同様に、「メソッド」についても、
「メソッド経由」の書き方がある、ということは、
「ただ単にオブジェクトを動かすだけのメソッド」(開く、閉じる、コピペする、印刷、など)

「メソッドで使う何らかの設定値(引数)などを指定ができつつ、同時に、オブジェクトの取得までもが、連鎖的・共同的・連動的にできてしまうメソッド」(Rangeオブジェクトの場合ならUnionメソッド)
の2種類がある、
ということを意味しています。
  
  

★ Excel以外のソフトの状況

ちなみにですが、
・Excelは(02)が非常に多いです。でも(01)も(03)も少しあります。
 ユーザーフォームでも(02)が多かったでした。
・Wordもそうかもしれません。(あまりよくは知りませんが多分そうです)
・Access、は(01)が多いです。(02)と(03)は少ないです。
 実際にはAccessも(02)が多いのでした。
・DAOやADO、は(01)だけかもしれません。チェックしてませんが・・・。
(※ DAOやADO、はVBAとは別の独立した機能ですが、VBAとかなり関係が深いのでご紹介させていただきました。)

  
  

というわけで、Excel、Access、Word、で、「オブジェクトの参照式」を書くときには、書き方の系統(入り口)が少なくとも(01)~(03)の3つがあると意識しておいてください。

特に、Excelでは(01)ではなくて(02)がメッチャ多いので、注意が必要です。とくにAccessVBAから先に学んでいた場合は誤解しやすいのでご注意ください。僕もつい先日まで誤解していました。