● Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があって、Excelはプロパティ経由、Accessはコレクション経由、が多いです。)
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
  
※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 ×××× 」と書いてあります。

  
  
本記事は、VBA初心者の方への記事です。以下の記事を読んでから読んでみてください。
用語:VBAプログラミングでの「オブジェクト」 について

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

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

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

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

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

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

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

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

また、「オブジェクトを取得する」とは、
・「操作対象のオブジェクトを1つに特定する。」とか、
・「操作対象としたい、何らかの1つのオブジェクトを、選択する。」
・「操作対象としたい、何らかの1つのオブジェクトが、”選択された”、という状態にする。」
という意味の作業でもあります。
例えばヘルプを読んでいるときは、その文脈等を考えて、一番しっくりくる訳をあてはめればいいと思います。

「オブジェクト」に対する操作(命令)は、「オブジェクトの取得」があってはじめて、できることでありまして、逆に言いますと、それができなければ何も操作ができませんので・・・。
『オブジェクトに「プロパティ」を与え、メソッドで動かす』・・・ということはもちろん、ただ単に、『オブジェクトの プロパティの設定値を調べる』ということもできません。

で、いきなりですみませんが、その「オブジェクトの取得」・・・のイメージ・・・ですが・・・、それは次のような感じです。

 @オブジェクトを「リモコン操作」できるようにするために・・・、

 ・オブジェクトに対しての住所情報を取得する
 ・オブジェクトへの位置情報を取得する
 ・オブジェクトへのトンネル情報を取得する
 ・オブジェクトへのリンク情報を取得する
 ・オブジェクトへのショートカットアイコンを取得する・・・
 ・今この場所と、ある1つのオブジェクトを電波でつなぐ・・・
                  そのための情報を取得する・・・

これらはすべて、あくまでも「イメージ」ですが、でもあたらずとも遠からず、だと思います。

で、実際のプログラミングで何をするのかというと、「オブジェクトへの参照式を書く」「オブジェクトへの参照を式を書く・式にする」という作業をします。(以降、ちょっと短くして「オブジェクト参照式とか、適当に書いてしまいます。すみません。)

つまり、「オブジェクトを取得する」とは「オブジェクト参照式を書く」という意味になります。

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

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

で、そのあとは、ケースバイケースですが、そのままその参照式を使うことが多いです。
(特に初心者の方の場合は多いです。)

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

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

※補足
取得できたオブジェクトは「オブジェクトの丸ごとコピー」ではなく、「オブジェクトへの参照」、だそうです。
ということはやはり、以下のようなものとなります。

・オブジェクトに対しての住所情報
・オブジェクトへの位置情報
・オブジェクトへのトンネル情報
・オブジェクトへのリンク情報
・オブジェクトへのショートカットアイコン・・・
・今この場所と、ある1つのオブジェクトを電波でつなぐ・・・そのための情報

「道を作ってあげて、そこからオブジェクトを動かす」、「リモコンでつなげて動かす」みたいな感じっぽいです。

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

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

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

※2019/05/14追記
このほかに、VBA(VBE6.DLLやVBE7.DLL)の関数、例えばGetObject関数やCreateObject関数などでの取得、あるいは、Offce全体のオブジェクトのメソッドやプロパティ、ADOやDAOのメソッドなどでの取得、もできます。Officeソフト(WordやAccess、PowerPointなども共通です。)
ここでは、「1つのソフトの中だけの話」として書きました。

どれがどういう方法なのか?という詳しいことはおいおいどこかでご説明すると致しまして、ともかく最低限この3つの系統があることだけ、一応、念頭に置いておいてください。(もしかしたら4つ目のもあるのかもしれません。僕はそこまで必要としてないので調べてませんけど・・・)

逆に言うと、私たち初心者は、いつかは、「この3つがある」、「3つの区別がつく」(※ 2つでした。)という状態にまで、「オブジェクト」について、理解をしておくほうがいいです。

理由は、これらの違いがわかると、「ヘルプやWeb記事、オブジェクトブラウザの意味」、がより読める・理解できるようになりますし・・・、であれば、それに伴って「自力で問題解決できる腕が上がる」ので、初級から中級にも上がりやすくなるからです。

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

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

また、「プロパティ経由」でオブジェクトの参照式(オブジェクト式)を書くときに、「コレクション経由」で書いているように見えることがあります。

例えばExcelの場合は「Worksheets(1)」とか「Worksheets("Sheet1”)」とかの書き方です。
(「Workbooks(2)」なども同様です。)

複数形の「s」がついているのでいかにも「コレクション経由」で書かれているかのように見えますが、どうやらこれらはプロパティ経由です。

多分ですみませんけど、「Application.Worksheetsプロパティ」とか、「Workbook.Worksheetsプロパティ」とかを経由してオブジェクトを取得しています。(「Workbooks(2)」ならApplication.Workbooksプロパティ。)

ではなぜ、(1)とか(2)とか("Sheet1”)と「コレクションに見間違えるような」書き方ができるのでしょうか?

ど素人の勝手な推測ですけど、ヘルプを読むとこれらのプロパティは・・・、『「Application.」とか「Workbook.」といった「オブジェクト修飾子」を省略すると、「グラフシートやらその他の種類のシート」を除外した「作業中のブックのすべてのワークシートのコレクションオブジェクト」を取得してくれるプロパティだ・・・・』、とヘルプには書かれています。
(※「オブジェクトを取得できるプロパティ」のヘルプ等々に、「××を返します。」と書いてあったら、「××を取得できます」、という意味です。そう読み替えてください。たいていの場合「××」は、単一オブジェクトかコレクションのことを言っていると思います。)

なので、「コレクションを取得できる」ということは、コレクションと同じような書き方ができるように、VBAの開発チームが設計した、「コレクションと同名のプロパティにした」というようなことかもしれないなあ?と勝手に推測しています。
  
  
また「プロパティ経由」の書き方がある、ということは、
(ExcelだけでなくすべてのソフトのVBAのプロパティには)、
「ただ単に設定値を取得するだけのプロパティ」(フォントの種類、××色、幅、高さ、など)

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

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

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

これらは、今すぐにはまったく理解できないかもしれませんが、『オブジェクト変数やコレクション』を「強く意識した」プログラム記述の機会が増えてくると、なんとなく分かってくると思います。

たとえば「共通部品・汎用部品などを作る」といったことが増えてくるとなんとなく分かってくると思います。

逆に言うと、オブジェクト変数やコレクションのことをまずは理解・操作ができないと、ちょっと難しくて意味不明なままかもしれません。(オブジェクト変数やコレクションの一部のことはこちらの→『用語:「オブジェクト変数」とは?(ついでに「コレクション」についても少し・・・) 』を見てみてください。)

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

「オブジェクトモデル」としては階層構造になっていて、上から・・・
「コレクション=コレクションオブジェクト=単一オブジェクトが複数に束ねられたもの」
「単一オブジェクト」
となっているイメージだと思います。(あくまでもイメージです)

そしてそれぞれにプロパティやメソッドがあります。

一応簡易的なイメージ図にしてみると・・・・(あくまでもイメージ図です。)、
  
  
上位の階層の:単一のオブジェクト(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)の「コレクション」をワンクッション挟んで行くものなのかは、僕にはまだわかりません。
その辺はプロの先生にお金をお支払いして聞いてください。

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

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

「プロパティ経由」でのオブジェクトの取得についてはひとまず以上です。

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

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

※ 正しくはユーザーフォームもAccessも「プロパティ経由」でした。大変申し訳ございませんでした。

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

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

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

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

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

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

  
  

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

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

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

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

基本、A1セルをオブジェクトとして取得する参照式は、「Range(”A1”)」と書きますが、この「Range(”A1”)」の「Range」は「Rangeオブジェクト」という意味ではなくて、「Rangeオブジェクトが保持するRangeプロパティ」の「Range」なのです。

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

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

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

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

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

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

つまり、
『Range オブジェクトを取得するには、Range(arg) プロパティを使用します。』
『(このプロパティを使うことで)Range オブジェクトを返します。(=取得できます。)』
と書いてあるわけです。

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

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

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

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