Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があって、Excelはプロパティ経由、Accessはコレクション経由、が多いです。»Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があって、Excelはプロパティ経由、Accessはコレクション経由、が多いです。)Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があって、Excelはプロパティ経由、Accessはコレクション経由、が多いです。Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があって、Excelはプロパティ経由、Accessはコレクション経由、が多いです。)※まだ書きかけです。※間違ってたらすみません。※メモ書きなので、自分でも意味不明な箇所も多いです。修正:この記事の「コレクション経由のオブジェクト取得ができる」という記述はすべて間違いでした。申し訳ございませんでした。本日別件でたまたまAccessのオブジェクトブラウザを見てみたら、すべて間違いとわかりました。「大切な基礎の部分」で大ウソを流布してしまい、本当に申し訳ございませんでした。穴があったり入りたいです。「オブジェクト式」におけるAccessの「Forms」(つまり「Application.Forms」の「Forms」)は、「コレクション名」ではなくExcelの場合と同様、「プロパティ名」でした。Accessのオブジェクトブラウザで確認できます。Accessのオブジェクトブラウザで、Applicationを検索してオブジェクトのメンバを見ると、中に「Forms」というものがあり、すると、そのアイコンは「プロパティ」を表すアイコンです。Forms」と書いてあります。いうコレクションオブジェクトを返します。」という意味ですから、結果、「Application.Forms」の「Forms」は、コレクションではなくプロパティでした。よってAccessでよく書く「Forms("フォーム1")」とか「Forms(1)」などの「Forms」は「コレクション名」ではなく「プロパティ名の「Forms」であった、ということです。プロパティを使います」と明示的に書いてないので誤解してしまいました。今後は、オブジェクトブラウザから先に見るようにします。ExcelやWordなどの「ユーザーフォーム」の各コントロール(テキストボックスやコマンドボタンなど)の場合も、これに同じです。本記事は、VBA初心者の方への記事です。以下の記事を読んでから読んでみてください。『Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があります。Excelはプロパティ経由、Accessはコレクション経由、が多いです。「オブジェクトの取得」とは?VBAプログラミングでは、「オブジェクト」に「プロパティ」を与え、「メソッド」で動かす、という処理をすることが多いです。その「オブジェクト」についてですが、オブジェクトに「プロパティ」を与え、「メソッド」で動かすという「操作」「処理」をするためには、まず、なにはともあれ、「オブジェクトの取得」という作業をしなければなりません。・「操作対象のオブジェクトを1つに特定する。・「操作対象としたい、何らかの1つのオブジェクトを、選択する。・「操作対象としたい、何らかの1つのオブジェクトが、”選択された”、という状態にする。」という意味の作業でもあります。ヘルプを読んでいるときは、その文脈等を考えて、一番しっくりくる訳をあてはめればいいと思います。「オブジェクト」に対する操作(命令)は、「オブジェクトの取得」があってはじめて、できることでありまして、逆に言いますと、それができなければ何も操作ができませんので・・・。プロパティの設定値を調べる』ということもできません。すみませんが、その「オブジェクトの取得」・・・のイメージ・・・ですが・・・、それは次のような感じです。・今この場所と、ある1つのオブジェクトを電波でつなぐ・・・そのための情報を取得する・・・これらはすべて、あくまでも「イメージ」ですが、でもあたらずとも遠からず、だと思います。実際のプログラミングで何をするのかというと、「オブジェクトへの参照式を書く」「オブジェクトへの参照を式を書く・式にする」という作業をします。(以降、ちょっと短くして「オブジェクト参照式とか、適当に書いてしまいます。)つまり、「オブジェクトを取得する」とは「オブジェクト参照式を書く」という意味になります。(※ヘルプでは「オブジェクト式」と書かれています。「オブジェクト式=特定のオブジェクトを指定する式。」とも書かれています。)「オブジェクト参照式が正しく書けた」時点で、「オブジェクトの取得が完了した」ということになります。(上記の箇条書きの状態が完了した、ということにもなります。)で、そのあとは、ケースバイケースですが、そのままその参照式を使うことが多いです。(特に初心者の方の場合は多いです。)中級者になると、その取得したオブジェクト(正しく書いたオブジェクト参照式)を、「オブジェクト変数」というものに代入することができるようになってるいるので、そういう処理が増えてきます。「取得したオブジェクトはオブジェクト変数とかいうものに丸っと代入できるんだな」ということの、2つのことを思い浮かべてください。取得できたオブジェクトは「オブジェクトの丸ごとコピー」ではなく、「オブジェクトへの参照」、だそうです。いうことはやはり、以下のようなものとなります。「道を作ってあげて、そこからオブジェクトを動かす」、「リモコンでつなげて動かす」みたいな感じっぽいです。オブジェクトの取得=参照式を書く、という場合の複数の方法(複数の系統)ExcelVBAに限らず、WordもAccess・その他を含めたVBAプログラミングでは、この「オブジェクトの取得をする」、すなわち、「オブジェクト参照式を正しく書く」時に、少なくとも3系統の書き方があります。※2019/05/14追記このほかに、VBA(VBE6.DLLやVBE7.DLL)の関数、例えばGetObject関数やCreateObject関数などでの取得、あるいは、Offce全体のオブジェクトのメソッドやプロパティ、ADOやDAOのメソッドなどでの取得、もできます。Officeソフト(WordやAccess、PowerPointなども共通です。)ここでは、「1つのソフトの中だけの話」として書きました。どれがどういう方法なのか?という詳しいことはおいおいどこかでご説明すると致しまして、ともかく最低限この3つの系統があることだけ、一応、念頭に置いておいてください。(もしかしたら4つ目のもあるのかもしれません。)という状態にまで、「オブジェクト」について、理解をしておくほうがいいです。理由は、これらの違いがわかると、「ヘルプやWeb記事、オブジェクトブラウザの意味」、がより読める・理解できるようになりますし・・・、であれば、それに伴って「自力で問題解決できる腕が上がる」ので、初級から中級にも上がりやすくなるからです。「プロパティ経由」で書くとは、「プロパティを入り口としてオブジェクト参照式を書く」、「プロパティを入り口としてオブジェクトを取得する」というようなイメージです。「コレクション経由」で書くとは、「コレクションを入り口としてオブジェクト参照式を書く」、「コレクションを入り口としてオブジェクトを取得する」というようなイメージです。「プロパティ経由」でオブジェクトの参照式(オブジェクト式)を書くときに、「コレクション経由」で書いているように見えることがあります。Excelの場合は「Worksheets(1)」とか「Worksheets("Sheet1”)」とかの書き方です。(「Workbooks(2)」なども同様です。)複数形の「s」がついているのでいかにも「コレクション経由」で書かれているかのように見えますが、どうやらこれらはプロパティ経由です。すみませんけど、「Application.Worksheetsプロパティ」とか、「Workbook.Worksheetsプロパティ」とかを経由してオブジェクトを取得しています。(「Workbooks(2)」ならApplication.Workbooksプロパティ。)ではなぜ、(1)とか(2)とか("Sheet1”)と「コレクションに見間違えるような」書き方ができるのでしょうか?ど素人の勝手な推測ですけど、ヘルプを読むとこれらのプロパティは・・・、『「Application.」とか「Workbook.」といった「オブジェクト修飾子」を省略すると、「グラフシートやらその他の種類のシート」を除外した「作業中のブックのすべてのワークシートのコレクションオブジェクト」を取得してくれるプロパティだ・・・・』、とヘルプには書かれています。(※「オブジェクトを取得できるプロパティ」のヘルプ等々に、「××を返します。」と書いてあったら、「××を取得できます」、という意味です。場合「××」は、単一オブジェクトかコレクションのことを言っていると思います。)なので、「コレクションを取得できる」ということは、コレクションと同じような書き方ができるように、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とかなり関係が深いのでご紹介させていただきました。「単一オブジェクト」となっているイメージだと思います。(あくまでもイメージです)そしてそれぞれにプロパティやメソッドがあります。一応簡易的なイメージ図にしてみると・・・・(あくまでもイメージ図です。プロパティやメソッド(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などは調べてませんのでご自分でも調べてみてください。ヘルプになんで、そんな風に異なるの?ということなんですが、あまり考えないほうがいいと思います。・「そうやってオブジェクトを取得できる」という事実です。逆に言うと、「そうやってでしか、オブジェクトを取得でき”ない”(特にプロパティ経由やメソッド経由)」「もとからそういう掟・仕様になってしまっている」「だからあれこれ考えても仕方がない」という事実です。コレクション)を取得できているのか?が明確にわかりされすればいい。』、という事実をあらかじめ知っていれば、ヘルプも、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(”A1”)」の「Range」は「Rangeオブジェクト」という意味ではなくて、「Rangeオブジェクトが保持するRangeプロパティ」の「Range」なのです。オブジェクトを返します(××を返します=××を取得できます)。