オブジェクトモデルの構造からすると、(01)が自然なんだけど、Excelでは(02)がメッチャ多い。オブジェクトの取得を「プロパティ経由で書く」・・・ということの実際とその意味のもう少し詳しい説明?掘り下げ?(「ヘルプ」に書いてあること。結局、プロパティやメソッドには2種類のそれらがあることになります。※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。本記事は、VBA初心者の方への記事です。以下の記事をお読みなって、「オブジェクトって何?、オブジェクト変数って何?、コレクションって何?」、ということをなんとなくでイメージしてもらえると、本記事もなんとなくわかっていただけるかもしれません。し詳しく、でもそこそこまとめた記事です。『Access2000VBA・Excel2000VBA独学~「オブジェクトの取得の方法」について(最低、コレクション経由、プロパティ経由、メソッド経由の3系統の取得方法があります。Excelはプロパティ経由、Accessはコレクション経由、が多いです。『Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?~その2(詳細版:巷では意外と分類・整理・説明されていないこと)』うまく説明できていないですけど、よろしくお願いいたします。「オブジェクトの取得」とは?VBAプログラミングでは、「オブジェクト」に「プロパティ」を与え、「メソッド」で動かす、という処理をすることが多いです。その「オブジェクト」についてですが・・・、ExcelでもWordでもAccessでも、VBAにてオブジェクトに「プロパティ」を与え、「メソッド」で動かすという「操作」「処理」をするためには、まず、なにはともあれ、「オブジェクトの取得」という作業をしなければなりません。「オブジェクト」に対する操作(命令)は、「オブジェクトの取得」があってはじめて、できることでありまして、逆に言いますと、それができなければ何も操作ができませんので・・・。・「操作対象のオブジェクトを1つに特定する。・「操作対象としたい、何らかの1つのオブジェクトを、選択する。・「操作対象としたい、何らかの1つのオブジェクトが、”選択された”、という状態にする。」という意味の作業でもあります。ヘルプを読んでいるときは、その文脈等を考えて、一番しっくりくる訳をあてはめればいいと思います。・「オブジェクト式を書く」という作業をします。(以降、ちょっと短くして「オブジェクト参照式とか、適当に書いてしまいます。ヘルプに書いてあるとおり「オブジェクト式」という言葉を使います。)つまり、「オブジェクトを取得する」とは、プログラム記述的には、「オブジェクト参照式を書く」という意味になります。(※ヘルプでは「オブジェクト式」と書かれています。「オブジェクト式=特定のオブジェクトを指定する式。」とも書かれています。)「オブジェクト参照式が正しく書けた」時点で、「オブジェクトの取得が完了した」ということになります。(上記の箇条書きの状態が完了した、ということにもなります。当サイトでは「オブジェクト参照式」「オブジェクト式」のほかに、便宜上、「部分オブジェクト式」という言葉も使っています。「今選択しているオブジェクトの階層構造を省略しないオブジェクト式を書くため」に、その説明に便利なのでそうしています。そのことについては→こちら)で、そのあとは、ケースバイケースですが、そのままその参照式を使うことが多いです。(特に初心者の方の場合は多いです。)中級者になると、その取得したオブジェクト(正しく書いたオブジェクト参照式)を、「オブジェクト変数」というものに代入することができるようになってるいるので、そういう処理が増えてきます。「取得したオブジェクトはオブジェクト変数とかいうものに丸っと代入できるんだな」ということの、2つのことを思い浮かべてください。オブジェクトの取得=参照式を書く、という場合の複数の方法(複数の系統)ExcelVBAに限らず、WordもAccess・その他を含めたVBAプログラミングでは、この「オブジェクトの取得をする」、すなわち、「オブジェクト参照式を正しく書く」時に、少なくとも3系統の書き方(入り口)があります。(01)の「コレクション経由」で書くとは、「コレクションを入り口としてオブジェクト参照式を書く」、「コレクションを入り口としてオブジェクトを取得する」というようなイメージです。(02)の「プロパティ経由」で書くとは、「コレクション経由ではなくてプロパティを入り口としてオブジェクト参照式を書く」、「プロパティを入り口としてオブジェクトを取得する」というようなイメージです。(03)の「メソッド経由」で書く、ということなら、「コレクション経由やプロパティ経由ではなくてメソッドを入り口としてオブジェクト参照式を書く」、「メソッドを入り口としてオブジェクトを取得する」というようなイメージです。※このとき、単一オブジェクトを取得する場合は、コレクション経由・プロパティ経由・メソッド経由、すべてにおいて「引数」と呼ばれるものが必要になることが多いようです。カッコを使ってその中に引数(設定値)を記述する場合が多いようです。「Range("A1")」とか「Worksheets(1)」、「Worksheets("Sheet1")」とか、そういう「×××(引数)」みたいな形の、カッコと引数(設定値)がくっついたパターンです。単一オブジェクトではなく、コレクションオブジェクトを取得する場合もあります。そのときは、プロパティ経由・メソッド経由が多いのですが、その場合は、カッコや引数が何も必要なく、プロパティ名やメソッド名を書くだけでコレクションオブジェクトを取得できる場合が多いようです。「Workbooks」とか「Axes」とか、そういう感じのカッコなどが無いパターンです。(逆に言うと、プロパティ名やメソッド名だけだとコレクションが取得されてしまうので注意します。他の場所でエラーにならないようにするために。)※「オブジェクト」には大きく分けて、2種類があります。「単一のオブジェクト」と「同種・あるいは異種の”単一のオブジェクト”たちを複数束ねた、コレクションオブジェクト(=略してコレクション)」との2種類です。※コレクションの中身がすべて同種のオブジェクトとは限りません。Sheetsコレクションなどがいい例です。Sheetsコレクションはワークシートやグラフシート、その他シートの集合体です。プロパティ」は、引数を何も書かないとコレクションを取得できますが、それはWorksheetsコレクションではなく、Sheetsコレクションを取得します。(そういうややこしい仕様にすることはできればエンドユーザーとしては嫌なんですが・・・。なんでこんな仕様にしたんでしょうか?大変紛らわしいです。)※コレクションにはどんながものあるか?を知りたいときは、オブジェクトブラウザで「Item」で「完全に一致する単語だけを検索」、で検索するとずらっと出てきます。ヘルプによると、多くのコレクションの既定のプロパティが「Itemプロパティ」だそうなのでそういう動きになるんだと思います。(実際にはExcelのライブラリじゃなくてOfficeのライブラリのItemプロパティが”既定”みたいですけど・・・)さらに言うと・・・(01)「コレクション経由」で書く・・・とは、Accessに多いのですが、たとえば、Forms(0)とかForms("フォーム名")と書いて、フォームをオブジェクトとして取得する方法です。このとき、「Forms」は「Formsコレクション」そのものです。「コレクション」とは、「単一オブジェクトを複数束ねたもの」ですから、複数あるものの中から、単一のどれかをチョイスする」といった感じになるので「自然」です。Excelの場合は、「ユーザーフォーム」や、その上に配置するコマンドボタンやリストボックス、コンボボックスなどを取得する場合が「コレクション経由」(コレクション直)で書く場合が多いです。取得してしまう・呼び出してしまう方法です。ExcelやWordに多いのですが、例えばExcelなら、「Range.Rangeプロパティ」です。「Range.Rangeプロパティ」は「RangeオブジェクトのRangeプロパティ」という感じの意味ですが、このプロパティの場合、「Range.Rangeプロパティ」の設定値を記述しただけで、「Range.」というオブジェクトを連鎖取得したとみなします!・・・みたいな感じです。「Range("A1")」みたいに書きます。Rangeは選択範囲を意味するオブジェクトですが、選択範囲はもともと決まったサイズのものが複数あるわけでもなく、「どっからどこまでとどっからどこまで」みたいに複数の選択範囲を一度に処理したい場合もあります。いまやっと思えたですけど、「選択範囲」は結構「ぐっちゃぐちゃで不規則な形」になるので、「コレクションから整然とどれかをチョイスする」、なんてことははなから無理っぽいです。(Accessの「選択」は列と行の指定だけとか、SQLとかでやるので、かっちりしてて、不規則な形にはなりにくいです。)なので、かどうかは知りませんが、まあ、たしかに「Range.Rangeプロパティ」で選択範囲を指定することで、『(選択範囲起点で=Rangeプロパティ起点で)オブジェクトを自動連鎖取得する・・・』、というのは面倒が無くて便利といえば便利かもしれません。プロパティなども同様)でもまあ、それでも僕なんかは「Range.Select」みたいなプロパティを作ってもらって『「Range.」(オブジェクト名)は省略可能です』みたいにしてくれたほうがわかりやすくていいのにな、なんて思ってしまいます。「Worksheetオブジェクト」なんて、「プロパティじゃなくてコレクションから選ぶ形でいいのに・・・」、なんて思ってしまいます。(03)の、「メソッド経由」も『(02)「プロパティ経由」で書く・・・』と同様な感じです。オブジェクトモデルの構造からすると、(01)が自然なんだけど、Excelでは(02)がメッチャ多い。「単一オブジェクト」となっていると思います。それぞれにプロパティやメソッドがあります。一応簡易的なイメージ図にしてみると・・・・(あくまでもイメージ図です。プロパティやメソッド(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などは調べてませんのでご自分でも調べてみてください。ヘルプになんで、そんな風に異なるの?ということなんですが、あまり考えないほうがいいと思います。・「そうやってオブジェクトを取得できる」という事実です。逆に言うと、「そうやってでしか、オブジェクトを取得でき”ない”(特にプロパティ経由やメソッド経由)」「もとからそういう掟・仕様になってしまっている」「だからあれこれ考えても仕方がない」という事実です。コレクション)を取得できているのか?が明確にわかりされすればいい。』、という事実をあらかじめ知っていれば、ヘルプも、VBAのWeb記事も、書籍も、全部理解度が上がるからです。ヘルプやWeb情報が自力で読めるようになれば、当然、記述ミスやトラブル解決の腕も上がると思います。「▽▽オブジェクトを取得するには、××××プロパティを使用します。」=「▽▽オブジェクトを取得するにはコレクション経由などではなく、××××プロパティ経由で取得してください。いうか、××××プロパティを使えば自動的に▽▽オブジェクトを取得できます。言うと、××××プロパティ経由じゃないと▽▽オブジェクトを取得できない仕組みにしてあります。いう名前のコレクション。▽▽コレクションに属します、含まれます、など。「××コレクションを取得するには、▽▽プロパティを使用します。」=「▽▽コレクションを取得するにはコレクション経由などではなく、××××プロパティ経由で取得してください。いうか、××××プロパティを使えば自動的に▽▽コレクションを取得できます。言うと、××××プロパティ経由じゃないと▽▽コレクションを取得できない仕組みにしてあります。プロパティを使用します。ワークシートのインデックス番号または名前を指定します。オブジェクトを取得できます。」(××はオブジェクトかコレクション)=「××を取得できます。ショートカットとなります。シートから範囲を取得します。シートがワークシートでない場合、このプロパティは失敗します。」となる・・・と書いてあります。オブジェクトの取得を「プロパティ経由で書く」・・・ということの実際とその意味のもう少し詳しい説明?掘り下げ?(「ヘルプ」に書いてあること。)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オブジェクト」や「Worksheetオブジェクト」が出てくるからです。この一覧のオブジェクトが、「Rangeオブジェクト」の1つ上位の単一オブジェクトたちです。ほかにも出てきますが、その2つが今の話に一番関係するっぽいのでその2つを選びました。プロパティを使用します。オブジェクトを返します。(返します=取得できます。)』と書いてあるわけです。「Range(”A1”)」の「Range」という単語は、「Rangeオブジェクト」という意味ではなくて、「Rangeオブジェクトが保持=保有=内包するRangeプロパティ」の「Range」なのです。「Range」という1単語だけで見ると確かに「プロパティ名」なんですが、繰り返しになりますが、「Range」という単語だけはなく、「("A1")」もくっつけた「Range("A1")」全体で見てみると、この「Range(”A1”)」全体は、「オブジェクト(Rangeオブジェクト)」としてとらえることができます。「Range("A1")」全体で見ると「オブジェクト」・・・となります。この場合、「オブジェクト名」ではなく、「オブジェクト」となります。その他すべての機能を保持した「オブジェクト」となります。「Range("A1")」とカッコやセルのアドレスも含めるとそれは、『オブジェクトを表現している「オブジェクト式」』である・・・、とも言えます。オブジェクトを返します(××を返します=××を取得できます)。