★★★ Access2000VBA・Excel2000VBA独学~「オブジェクトを取得する」とは?01 ~「オブジェクトモデルの階層構造図」について~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
『★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~★超重要!!機能面から見た場合のプロパティとメソッドの違い~』
『★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~★超重要!!オブジェクトブラウザの使用目的・使用意義~』
『★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~★超重要!!ExcelVBA・初心者向けおススメ書籍~』
『★★★★★★★★★★★★★★★★Access2000VBA・Excel2000VBA独学~必読!!ExcelVBAが上達するかどうかの最初の分かれ道!オブジェクトとオブジェクト式について~』
『用語:「オブジェクト変数」とは?(ついでに「コレクション」についても少し・・・)』
結論から先に言いますと・・・
「オブジェクトの取得」とは・・・
オブジェクトを選択する、
あるいは、
操作対象のオブジェクトを1つに決める、
というような意味です。
ただし、「プログラムを書く」という場面に限って言うと、少し違った見方になります。
つまり、
オブジェクトを選択する・・・・、
あるいは、
操作対象のオブジェクトを1つに決める・・・・・、
そう考えるよりももっと大事なことがある・・・、
ということです。
それは何かと言いますと、次のようなことです。
「プログラムを書く」という場面に限った、「オブジェクトの取得」について、
一番大事なことは・・・・
「オブジェクトの取得」=「オブジェクト変数に代入できる」
・・・と、そういう意味だ・・・、ということです。
もう少し詳しく言いますと・・・
取得できます。=オブジェクト変数に代入もできます。
取得できます。=オブジェクト変数に代入して短い名前で扱いやすくできます。
取得できます。=ラクができるよ!そこからその他の色んな「ラク」にも通じるよ!
・・・・ということです
なので、例えばヘルプやWeb記事などに、「~取得するには、~~~。」、「取得できます。」、「取得。」、そう書いてあったら・・・・、
『あ、このやり方・書き方で、そのままこれを「Set = 」の構文の右辺に書けば、オブジェクト変数に代入できるんだな?!ラクできるんだな?!と感じてもらえばいい・・・』、
・・・・ということになります。
ではこれ以降で、なぜそうなるかを理解するための前段階の知識、「オブジェクトとは?」などについて少しお話します。
VBAプログラミングにおける「オブジェクト」とは、「目に見える・見えない・大きい・小さい」にかかわらず、「ユニット、パーツ、部品、機能の集合体、複合機能体」あるいは「ミニミニロボット」のことだと思って頂ければよいです。
文字列、数値、日付データ、論理値(True/Falseの2値など)、といった、「文字ベース」の一般データの「対義語」のようなニュアンスもあります。
一般データは文字通り、「文字ベース」なのですが、「オブジェクト」は、「ユニット、パーツ、部品、機能の集合体、複合機能体」あるいは「ミニミニロボット」という感じなので、「立体的・3D的」な「モノ」、「かたちあるもの」というイメージです。
(ですので、文字ベースのデータには「機能」という概念はありません。しかし、オブジェクトには必ず「機能」があります。オブジェクトの中には「色んな機能が内包されています」。
大分類的な言い方で言うと、「プロパティ、メソッド、イベント、上下階層自由往来機能、上下階層機能流用機能」、などです。それらが内包されています。
ちなみにですが、例えばで言いますと、「今時の電子レンジ(特にオーブンレンジ)」を「オブジェクト」に例えますと、「スチームする」「あたためる」「(パンなどを)焼く」といった、動詞系の動き・言葉で、何かを ” 動作 ” させる機能・命令が「メソッド」で、「焼いたりあたためたりするための時間や食品の素材設定、その他の各種設定をする」といった、何らかの ” 値の設定 ” をおこなう機能・命令が「プロパティ」です。 あと、「タイマーで自動的に焼いたりあたためたりする」といった感じで、「タイマー機能」のような「何らかのタイミングで自動実行させる機能」が「イベント」という感じです。全部、「(電子レンジという)オブジェクトに内包されている機能たち」です。「オブジェクトに内包されている機能」とか、「オブジェクトに機能が内包されている」とは、こんな感じの意味です。なんとなくでもイメージできますでしょうか?
さらにちなみにですが、オブジェクトモデルの階層構造についても少し言いますと、「電子レンジ」というオブジェクトは「家」というオブジェクトの下位に存在します。イコール、「電子レンジ」というオブジェクトは「家」というオブジェクトの内部に存在します。逆に言うと、「家」というオブジェクトが「電子レンジ」の内部に存在することはありえませんし、ということは、上位になることもありません。「電子レンジ」というオブジェクトは必ず「家」というオブジェクトの内部・下位に存在し、階層構造をなしています。
ついでに言うと、「オブジェクト変数」とは、「一般データを一般変数で動かして終わりじゃ不便なんで、オブジェクトたち(シートやセルその他)にも ” 短い仮名 ” を付けてラクに動かせるようにしちゃいましょ~!」という用途の変数だとイメージしてくださっても良いと思います(もちろんそれがすべてではなく、もっと便利なことができるのですが・・・)。
オブジェクト変数にオブジェクトを代入すれば、代入したオブジェクトに内包されるプロパティ、メソッド、イベント、階層構造系機能、も「芋ずる式」に代入されることになるので、それらの機能もそのまま(短い仮名をつけたまま)使えます。それらの機能を内側から引き出して使いながら、外側から、ステートメントや列挙・定数などでさらに動かす/制御する・・・、という格好になります。
なお、一般変数に代入する「生データ」には「数値、文字列、日付、2値(論理値)」といったものがありますが、オブジェクト変数の場合でその「生データ」に相当するものは、「オブジェクト式」となります。
初心者のうちは、面倒でも(「急がばまわれ」で)、階層構造をトップ(Application)からしっかりと書いた省略の無いオブジェクト式」を使うと上達が早まると思います。
安易に「With」でくくりまくってそれだけで済ませ、「オブジェクト変数」と本記事のテーマの「階層構造」から逃げると、いつまでたっても上達できません。
オブジェクト変数が使えないと「値やオブジェクトを返す自作関数」も作り分けできないし、「結局それがわからないと特にExcelVBAは何も分からないし上達できない」ので・・・。)
※イメージ図↓
↓これを外側から、ステートメントや列挙・定数などで動かします。
(内側からプロパティやメソッドなどでも動かしながら。)
ちなみにですが、「コレクション」も、その「オブジェクト」の「一種」です。
「コレクションオブジェクト」と呼んだりもします。
基本、同じ(または似たような)種類の単一のオブジェクトたちを一括操作・個別操作する機能を有しています。複数のワークシートを一括操作・個別操作するための「WorkSheetsコレクション」や、複数のブックを同様に扱うための「WorkBooksコレクション」、グラフを同様に扱う「Chartsコレクション」などがあります。
※なお、Rangeオブジェクトは「単一のセル」が集まった「コレクション的なもの」とも考えて良いかもしれません。配列やコレクションにしか使えないFor Each文が使えますし、もしかしたら違うかもしれませんが、一応、「Item」プロパティも持っていますので・・・。(コレクションは大抵、「Item」という名前のプロパティかメソッドを内包しています。逆に、単一オブジェクトにはそれはありません。・・・自信ないけど・・・。(^^) 僕もまだ初心者で勉強中なのでお許しを・・・。)
参考『用語:ExcelVBA~「コレクション(=コレクションオブジェクト)」とは?~』
『~用語:ExcelVBA~「Rangeオブジェクト」とは?~』
『用語:「オブジェクト変数」とは?
(ついでに「コレクション」についても少し・・・)』
『「実際の機能や画面等々」と「VBAオブジェクト」との対応の図など』
(本当は「オブジェクトとは?」というのを書かないといけなかったのですが
書いてなかったので以上の3つで代用です。ごめんなさい・・・。)
いきなり脱線してすみません・・・
以下にも少し詳しく、でもそこそこまとめたので、絶対にこちらも読んでおいてください!! ↓↓↓
★★★★★★★★★★★★★★★★ 超重要!!必読!!ExcelVBAが上達するかどうかの最初の分かれ道!オブジェクトとオブジェクト式について~★★★★★★★★★★★★★★★★
オブジェクトには大きく分けて「単一のオブジェクト」と、この「コレクションオブジェクト」の2種類があります。(といいますか、この2つしかありません。)
そして、今回ここに冒頭で挙げています図は、Excelの「オブジェクトモデルの階層構造の一覧図」です。(Excel2000~2003のVBAのヘルプに載っています。)
これは、
・色んな単一オブジェクト(俗称:オブジェクト)たちと、
・色んなコレクションオブジェクト(俗称:コレクション)たち、
・その2種類が、上から順番に、
・「階層構造になっている」・・・・、
・「階層構造に組み込まれていますよ~!!」・・・・
という図です。
トップの階層からボトムの階層まで、よく使うオブジェクトが階層構造としてのつながりで描かれています。
(※注:「よく使われるオブジェクト」だけの一覧図なので、つまり、「完全網羅」ではありません。例えば、Sheetsコレクションとか、描かれていませんので・・・。)
「オブジェクト式」を書くときは、基本、この階層のとおりに、上から順番に式を書きます。省略せずに。「基本」としては。
例えば「Rangeオブジェクト」なら、TOPの「Application」から順番に、
Excel.Application.WorkBooks.Item("Book1.xlsx").WorkSheets.Item("Sheet1").Range("A1")
という感じで、すべての階層を省略せずに書きます。
(ここではItemも省略せずに書きました。)
※意味
Excel. →「Excelの」
Application. →「アプリケーションウィンドウの中の、の意味。
(いわば「ガワ」。リボンやスクロールバー、
ステータスバー、等々「だけ」の部分。)」
WorkBooks.Item("Book1.xlsx"). →「WorkBooks」コレクションオブジェクトの中の
「 "Book1.xlsx" という名前のブックの中の」
WorkSheets.Item("Sheet1"). →「WorkSheets」コレクションオブジェクトの中の
「 "Sheet1" という名前のシートの中の」
Range("A1"). →「 "A1"セル」
参考:『「実際の機能や画面等々」と「VBAオブジェクト」との対応の図など』
注意・・・「.(ドット)」は「 ” の ” と訳す」とよく言われますが、僕は「の中の」と訳すほうが「階層構造」をより理解できる気がして、自分はそうしています。
「階層構造」をイメージできるなら、どちらの訳し方でもいいです。
逆に、「階層構造」「親子関係・主従関係・的なもの」を頭の中イメージできないなら、どんな訳し方でも「意味が無い」・・・、と言えなくもないと思います。
いずれにしましても、お好きな方で・・・。
※100回でも200回でも、何度でも繰り返しますが、この「トップレベルからの階層構造を省略しないオブジェクト式の書き方」を知らないうちは、ExcelVBAは100%上達しません。ヘルプもオブジェクトブラウザも読めないし、最重要項目のひとつである「値やオブジェクトを返す自作関数の作成」や「その作り分け」もできないからです。
そして、それを最初に教えずに、但し書きもせず、「Range("A1")」という省略しまくったオブジェクト式の書き方ばっかりを教えられてしまうことが多いです。
「こんなにたくさん!見るのもいやだ!」とお感じになるかもしれませんが、でも、この中で現実によく使われるのは、そうメッチャ多いわけでもありません。
実際には、
「Application」、「Workbooks(Workbook)」、「WorkSheets(WorkSheet)」、「Range」、「Charts(Chart)」、「Windows(Window)」、「Shapes(Shape)」、「AutoFilter」、「ListObjects(ListObject)」、「PivotTables(PivotTable)」、「QueryTables(QueryTable)」、「Font」、「Borders(Border)」、「Interior」、「ChartObjects(ChartObject)」、
あたりがよく使われるところだと思いますので、まずはそれらのオブジェクトたちだけを覚えていき、少しずつ、増やしていけばいいと思います。
(特に、私らのようなビジネスパーソンは丸暗記する必要はないので・・・。SEみたいなのになりたいなら、当然、すでに丸暗記できてるでしょうし。)
それらのオブジェクトが、この図の中のどの場所にあるかを探し、そこだけを丸囲みして、で、「階層構造を省略しないオブジェクト式」を書くときに、一番上のApplicationからたどりながら、順番に書いていけばいいのです。
そのようにして、「階層構造を省略しないオブジェクト式記述」、に役立てればよいのです。
(※図をjpg画像として保存してペイントなどで丸囲みするなどして、目立つようにすればOKですよね。「TypeName関数+Parentの多段化」を使って、イミディエイトウィンドウで調べてもいいですけど、最初はこちらの図を使った方が色々よくわかります。
他のオブジェクトも描いてあるので「位置関係」がわかりやすくなるからです。
「TypeName関数+Parentの多段化」での調査も、この図があると「より理解が深まります」し「おぼろげな理解」も「確信」に変わります。「どこまで意訳して解釈してしまってもいいか?さほど問題にはならないか?もわかるようになります。)
この図は「ExcelVBA、特にオブジェクト操作においては一番最初に生徒さんに見せなければならない」「一番重要なもの」で、かつ、「これよりも重要なもの・テキストは他にはないというくらい重要なもの」です。
その理由は次の通りです。
・ヘルプもオブジェクトブラウザも、基本的にはこの階層構造をベースに、すべてが
書かれているため。
基本VBAは、ExcelでもWordでもAccessでも、この「階層構造図」・「ありき」
となっていて、「この階層構造こそがすべての出発点・スタートライン」なため。
中でも特にExcelとWordはそう。
ヘルプもオブジェクトブラウザも、この階層構造を理解していないと読めない
ですし、扱えません。
(オブジェクトブラウザを読む・扱うにはもうひとつ、値やオブジェクトを返す
自作関数が作れる必要があります。)
・階層構造の中には、また、「オブジェクト」には、
「コレクションオブジェクト(俗称:コレクション)」と
「単一のオブジェクト(俗称:オブジェクト)」がある、
ということを学ばないと、VBAでは何もできないため。
もちろん、ヘルプとオブジェクトブラウザが読んだり扱えたりもできない。
・そしてヘルプとオブジェクトブラウザが読んだり扱えたりできなければ、
いつまでたっても「自力でのエラーなんて夢のまた夢で、何時間も、
下手をしたら何日も悩むことになってしまい、
Q&Aサイトで質問しても回答者の回答の意味すら理解できない。」ため。
そんな状況では「挫折するに決まってる」ため。
・Webの情報も、ヘルプとオブジェクトブラウザの焼き直しであることも多く、
少し上達すると、ヘルプも同時に読み比べながらWeb情報を読んだ方が、
早くトラブル解決できるから。
あるいは、ヘルプを「先に」読んだ方が早くトラブル解決できるから。
・多くの人は、使うオブジェクトが(前述の赤い太文字で書いたように)、
「最初のうちはほぼ決まっている」ので、結果、読むヘルプのページも
限られてきます。 そんなだから、
例えばもしヘルプも何度も繰り返し読めば、また、「用語」のことや
「値やオブジェクトを返す関数」とオブジェクトブラウザの関係、などを
習えば(Webに情報があれば)、大抵の人は理解できますし、
ヘルプを先に読んだほうが早く問題解決できることも少なくないです。
・ADO、DAO、Word、Access、などの、
Excelと関連の深い「外部の」「重要度の高いソフト」も「同様」に、
このような「オブジェクトの階層構造がすべての出発点。」となっているため。
参考:『DAOやADOのオブジェクトモデル一覧図(部分的なもの)と、
2000系ヘルプ・2007系ヘルプのそれぞれの良さ』
・階層構造を省略しない「オブジェクト式」の書き方と「変数」のことを
理解することこそが、本来起こるはずのない「無駄なエラーを激減させる」
ための、「最初のステップ」だから。
また、「作り変えや作り足し・メンテ・チームでの作業」をスムーズに
行えるようになるための基本でもあるため。
・階層構造の理解ができなければ、「いつまでたっても初級者から抜け出せない」ため。
中級に上がるなんて夢のまた夢になってしまいます。
ちなみにですが、多くの場合、いきなり「Range("A1") という一番エラーが多く出る記述」「ばっかり」を教えられて、「階層が省略されるとトラブルのもと」ということを教えてもらえません。
ExcelVBAのオブジェクトを学ぶには、「実は、こういう一覧図があって、とっても便利」、ということすら教えてもらえません。
知っててわざと教えないのか知らないのか知りませんが、「難しいから」と逃げて説明されないことが多いです。(※「一般変数」や「オブジェクト変数」、「値やオブジェクトを返す自作関数」「少数計算注意」も詳しく教えてもらえません。)
この階層一覧図は、そういう無責任な「教え方」から「初心者」「独学者」を守ってくれるものでもあります。大げさかもしれませんが、学びが進めば進むほど、そう実感できると思います。
そして「この図が含まれたヘルプを持っている」Excelの2000~2003の中古、あるいは、それが付属したXPマシンのジャンクを買うことも、実は、100倍、役に立ち、VBAの腕も少なくとも5倍は早く上がります。(後述しましたが、この図は、2000~2003のヘルプの中ではURLリンクになっていて、それぞれのオブジェクトのページにジャンプできます。)
ExcelVBAが上達できない人のほとんどが、この「階層構造そのもの」「オブジェクトモデル」「階層構造を省略しないオブジェクト式の書き方」を教えてもらえていません。これはある意味「被害者」です。
※オブジェクト式と階層記述省略によるエラーに関する参考記事
『★★★ Access2000VBA・Excel2000VBA独学~初心者の方や独学者の方へ:「パソコンは普通に小数計算をミスする」ということの重要性。そしてそんな大事なことを「最初に」教えてもらえない事(ひどさ)の重要性。~』
プログラミングとは、多分多くのプログラミング言語において・・・、
『 「変数」を動かすことで自動化を実現する作業 』
・・・だと思います。
そして、VBAの場合、その変数には大きく分けて2つがあります。
(といいますか、大きく分けると2つしかありません。)
それは、「一般変数」と、「オブジェクト変数」、です。
一般変数には、「生データ」として「一般データ=文字ベースのデータ」を代入します。
例えば、文字列、数値、日付データ、論理値(True/Falseなどの2値)、といった「文字で表現された」データたちです。
オブジェクト変数には、(一般変数の場合と同じ感じで)「生データに相当するもの」として、「オブジェクト式」を代入します。
「オブジェクト式」とは、例えば、以下のような式です。
(階層構造・その他をあまり省略せずに書いてみました。)
【セルの場合】
Excel.Application.WorkBooks.Item("Book1.xlsx").WorkSheets.Item("Sheet1").Range("A1")
Excel.Application.WorkBooks("Book1.xlsx").WorkSheets("Sheet1").Range("A1")
Excel.Application.ActiveWorkbook.ActiveSheet.Range("B2:F10")
Excel.Application.ActiveWorkbook.ActiveSheet.Cells(1,1)
Excel.Application.ActiveWorkbook.ActiveSheet.Cells.Item(1)
【シート上の1つ目の図形の場合】
Excel.Application.Workbooks("Book1.xlsx").ActiveSheet.Shapes(1)
【シート上の1つ目のピボットテーブルの場合】
Excel.Application.Workbooks("Book1.xlsx").WorkSheets(1).PivotTables(1)
【シート上の1つ目の埋め込みグラフの場合】
Excel.Application.ActiveWorkbook.ActiveSheet.ChartObjects(1).Chart
※それぞれ、もっと別の書き方があります。
※「オブジェクト式」とは、式の形にはなっていますが「オブジェクトそのもの」です。
また、オブジェクト変数に代入されるのは、その「オブジェクトそのもの」の「コピーではなく」、「オブジェクトへのリンク情報」(=オブジェクトへの参照)だそうです。
多分ですが、メモリ上に読み込まれたブック(Workbookオブジェクト)やシート(Worksheetオブジェクト)に対する「ショートカットアイコン的なもの」と思えばいいと思います。
オブジェクト変数に代入されるのはそれらのメモリ上に読み込まれたブック(Workbookオブジェクト)やシート(Worksheetオブジェクト)のコピーではなく、それら「そのもの」へ「直接アクセス」をするためのリンク情報・・・、ということなんだと思います。
ただ、「オブジェクト式」のことを、「オブジェクトそのもの」とか「ユニット・機能の集合体・ミニミニロボット」ととらえてもさほど問題ないと思います。
また、「オブジェクト式で書き表されたオブジェクトそのもの」は、文字ベースの生データたち(一般データたち)とは違い「機能」を持っています。
そしてなんとなく「3D的なもの」「かたちあるもの」です。
オブジェクト(例えばGUI画面など)はキャラクタ(文字)ベースの「対義語」的なイメージとしても使われますので、「オブジェクト=文字じゃないもの・かつ・複数の機能を持ったユニット/ミニミニロボット」と考えても良いと思います。
文字ベースの生データたち(一般データたち)は、当然ですが、「機能」なんていう概念は持っていません。
ふと思ったんですが、もしかしたらとっても大事な「イメージ・概念」かもしれませんが、Excelファイルが開かれると冒頭の図のようなものが「丸ごと」「まるっと」、「そのまんまの構造のまま」「その構造を維持しつつ」「バコッっと」「メモリに読み込まれる」、ということなのかもしれません。
なのでもしかしたらあの図は、階層構造を示しているのはもちろんのこと、「ファイルが開かれたらメモリにはこの形態・構造のままそのまま読み込まれるよ?」という図でもあるのかもしれません。
そう考えると、「オブジェクト変数に代入されるのはオブジェクトへの参照」の意味とか、その他のことも理解しやすくなる気がしますし、なんとなくヘルプも読みやすくなれるような気がします。
あと、プラス、もしかしたらですが、ヘルプによく出てくる「オブジェクトの取得」という表現は、「メモリに読み込まれたオブジェクトへの ” 接続 ” 」(メモリに読み込まれたオブジェクトたちと通信可能な状態にすること。)と理解・解釈してもいいのかもしれません。
なんか、そう考えるほうが「自然」な気がしてきました。
そうすれば、例えば「プロパティやメソッド」はもともとオブジェクトに内包される「機能たち」なわけなんだから、それを引き出して使うだけ・・・というイメージも「より ”自然” に感じられる」気がします。
その意味では「取得」を「GETする」と訳したほうが(読み替えたほうが)、「逆に・色んな意味にとれて便利かも?」しれません。(「Connectする」とか?)
そして「生データ」(文字ベースのデータやオブジェクト式)を代入された変数は・・・、
一般変数の場合は、その外側から、「主には、VBA関数や演算子、ステートメントなど」といった命令語句たちを使って動かします。
オブジェクト変数の場合は、その中に内包される「プロパティやメソッド、イベント」といった機能たちを、「ある意味・命令語句であるかのように」内側から引き出しつつ使い、外側からは、「主には、列挙(Enum)や組込定数、一部の関数(CreateObjectやGetObjectなどの)、同じくステートメントなど」といった命令語句たちを使って動かします。
今回の冒頭の図は(実は一般変数のほうは話には関係はありませんが)、そのような「オブジェクト式」を「書くため」に「非常に助けとなる」図です。
特に「初心者」「独学者」にとっては、最初のうちはとっつきにくいかもしれませんが、でも、「初級の上」以上の腕前に短期間でなるために、非常に助けとなる「VBAの学習においてはどの市販書籍やWeb記事よりも重要」です。
バージョン2007以降から?VBAのヘルプには載らなくなってしまいましたが、また、一覧図だからといってすべてのオブジェクトが載っているわけではありませんが、でも主要どころは載っていますし、階層構造がよくわかり、これを見れば何が省略されているかやローカルウィンドウとの連携も一目瞭然です。
本当に、「初心者」「独学者」にとっての助けとなります。
ですので、ぜひ、冒頭の図をもとに、ExcelVBAのオブジェクトやオブジェクト変数、オブジェクトを返す自作関数、などを扱う際の「羅針盤」「ヒント」としてみてください。
あと、「質の高い、頼りがいのあるVBAの先生・講師」の見つけ方ですが、それを見つけるのは簡単です。
30秒でわかります。
質の高い、頼りがいのあるVBAの先生とは、「初心者ができるだけ短期間に、自力でエラー処理できたり、自作関数利用やクラスモジュール利用・API利用・SQL利用・オートメーション操作ができたり、Web記事や市販書籍がスラスラ読めるようになる、そんな風になれる生徒さんが、習っている人のほぼ100%」という先生のことです。
そういう定義です。
質の高い、頼りがいのあるVBAの先生・講師を見つけるには、次の質問を先生にしてみてください。
「私のようなド素人にでも、ヘルプとオブジェクトブラウザの使い方をわかりやすく教えてもらえますか?」と聞くだけです。
「もちろん!いますぐやる?それこそが本当の基本なの!言ってくれて・わかってくれてうれしい!きっと早く上達しますよ!」と、最低限何を、何から理解しないといけないか、全体像・目次だけでもすぐに語ってくれる先生なら絶対にいい先生だと思います。
そして特に、冒頭に挙げた「Excel2000のオブジェクトモデルの階層構造一覧図」をさっと出してくれる先生ならマジで「当たり」だと思います。
そして、「まかせて!こんな本やWebの書き方じゃあ全然だめだよね?僕が(私が)もっとわかりやすく教えてあげる。同時に初心者のひとでも半年でちゃんとヘルプとオブジェクトブラウザがわかるようにね!解決策もいっしょにね!でも安くはないよ?うふふ(^^)」と言ってくれる先生ならマジでOKかと思います。
また「ChartとSQLとQueryTableとPivotTableとADOの使い方もわかりやすく教えてもらえますか?」とも聞いてみてください。無駄なVBAプログラムを最初から書かない方法を色々と教えてもらえると思います。
そういう先生なら、長い目で見た時は、結果として安上がりになる確率が低くありません。
(自分も、お金がもらえる立場に、思ったよりも短期間になれるため。)
いつもどおり話がそれてしまってすみませんが、でも、冒頭に挙げた図は、そのようなこと(VBA学習の負の面)にも非常に深く関連する本当に重要な図です。
是非、この機会に、「これを叩き台にして習った方がすくなくとも5倍は理解が早くなる(また、かけた費用が回収しやすくなる)」ということを是非、覚えておいてください。
ちなみにですが、Excel2000~2003のヘルプでは、冒頭の図をヘルプ内でクリックすると目的のページにジャンプできるので便利です。
例えば「Worksheets (Worksheet)」をクリックすると、「Worksheetsコレクション」のヘルプページにジャンプします。そして、その中のまた「Worksheets (Worksheet)」をクリックすると、今度は単一オブジェクトのほうのヘルプページにジャンプします。
コレクションのヘルプページの「Worksheets (Worksheet)」の上をクリックすれば、1階層上の単一オブジェクトのほうのページにジャンプできますし、同じく「Worksheets (Worksheet)」の下をクックすれば、単一のWorksheetオブジェクトの下位の単一オブジェクトたちのヘルプページを色々と選べます。
それと、各プロパティページでは、「対象」のところに「親オブジェクト」のリストが表示され、その単一オブジェクトのヘルプページにジャンプできます。(下図参照)
ヘルプは2000~2003、2007~2010のヘルプがあると、すごく学習しやすいです。
いずれも良さがあります。2000~2003は冒頭の図があってリンクがすごく便利なので、オブジェクトの階層構造を理解しやすいし、2007~2010のヘルプはメンバ一覧があったり、検索語句で検索した時のヒット結果が正確で、細かい内容や動きなどを調べやすくてすごくいいです。
Excel2000~2010をお持ちで使ってない知人・友人がいらっしゃったら、是非譲ってもらうことをおススメします。中古で買っても数千円なので「ヘルプを買う」と思ってもおつりがくるくらいの値段だと思います。ものすごく買う価値が高いと思います。Excel2000や2003などがオマケでついてたジャンクのXPとかのPCなんかも買いですね。
「教科書」を名乗るような「程度の低いVBA本」を買うくらいなら、これを買って、VMWareなどの仮想マシンで動かすほう100倍、学習が進みます。
また、仮想マシンを使うと、エラーがでても・機種特有のエラーか文法ミスかなども判断しやすい場合もありますしので、学習にはとてもプラスになります。
それに対して、2013や2016(2019もかも?)のヘルプは大変残念ながら、退化してしまったような気がしないでもないです。(まだ良さが分かってないだけかもしれませんが・・・)
なお、「Excel2000のオブジェクトモデルの階層構造図」には、もうひとつ、マイクロソフトのサイトにも存在します。(下図とその下のリンク。)
Microsoft Office 2000 Developer オブジェクト モデル ガイド
しかしこの図は、少々見づらいですし、初心者のうちは「オブジェクト式を書くときに少し混乱してしまう」ので、必ず冒頭の「2000~2003のヘルプの一覧図」を使用するようにしてください。
混乱してしまう理由は、各「コレクション(コレクションオブジェクト)が、「1階層分」を占有してしまっていて、「オブジェクト式の実態=ドットからドットまでが1階層分というルール」から逸脱してしまっているからです。
もしかしたら、ヘルプの階層構造図よりもこちらのほうが正しいのかもしれませんが、初心者のうちは VBA・・・特にオブジェクトとオブジェクト式の理解の妨げになってしまうので、こちらの図はできるだけ使わないほうがいいです。
もちろん、VBAオブジェクトのポイントや「ハマるところ」が既にわかっている人が利用するのは一向に構いません。逆に、色々なことがわかるかもしれませんし。
「初心者のうちは見ないほうがいい」ということです。
※参考
『★★★ Access2000VBA・Excel2000VBA独学~用語:ExcelVBA~「コレクション(=コレクションオブジェクト)」とは?~』
VBAプログラミングにおける「オブジェクト」とは、「目に見える・見えない・大きい・小さい」にかかわらず、「ユニット、パーツ、部品、機能の集合体、複合機能体」あるいは「ミニミニロボット」のことだと思って頂ければよいです。
文字列、数値、日付データ、論理値(True/Falseの2値など)、といった、「文字ベース」の一般データの「対義語」のようなニュアンスもあります。
一般データは文字通り、「文字ベース」なのですが、「オブジェクト」は、「ユニット、パーツ、部品、機能の集合体、複合機能体」あるいは「ミニミニロボット」という感じなので、「立体的・3D的」な「モノ」、「かたちあるもの」というイメージです。(ですので、文字ベースのデータには「機能」という概念はありません。しかし、オブジェクトには必ず「機能」があります。オブジェクトの中には「色んな機能が内包されています」。大分類的な言い方で言うと、プロパティ、メソッド、イベント、上下階層自由往来機能、上下階層機能流用機能、などです。)
そして「コレクション」も、その「オブジェクト」の「一種」です。
「コレクションオブジェクト」と呼んだりもします。
オブジェクトには大きく分けて「単一のオブジェクト」と、この「コレクションオブジェクト」の2種類があります。
「コレクションオブジェクト」は単一のオブジェクトたちを複数集めたものです。
また、別の言い方をすると、『 単一オブジェクトたちは「コレクションオブジェクト」に含まれています 』。
(=多くの単一オブジェクトたちは 何らかの「コレクションオブジェクト」に含まれています。ヘルプにも・・・、特に各単一オブジェクトのページに「単一オブジェクトたちはコレクションのメンバです」、みたいに書いてあります。)
そしてコレクションも、「機能の集合体」「複合機能体」です。
コレクションには各種の色んなものがありますが、また、それぞれが色んな「機能」を保持・内包していますが、でも、どれも基本的には、「単一のオブジェクトたちを管理したり、全て一括でゴソっと動かしたりする機能」を有しています。 コレクションは、そういう「ミニミニロボット」です。
なお、セルやシートといった各オブジェクトやその中に内包される機能(メソッドやプロパティ等)や、列挙(Enum)、定数などは、以下の図のように、ソフトウェアの画面上に見えてくるものもありますが、コレクションはどちらかというと(原則的には)、このように目に見えてくるオブジェクトではなく、「目に見えない、内部的なオブジェクト」だと考えていいと思います。
(「目に見えない、裏方で仕事する、内部的なミニミニロボット・・・」みたいな感じです。もしかしたら多少は「目に見える」ものがあるかもしれませんが、多くは目に見えないと思います。)
参考:『~用語:”目に見える”「メソッド・プロパティ・列挙(=Enum)・定数(=Const)」と右クリックメニューの画面の関係について~』
また、「オブジェクト」には、(前述しましたが)色んな「機能」が含まれています。
例えば単一のオブジェクトの場合、大分類的な言い方で言うと、プロパティ、メソッド、イベント、上下階層自由往来機能、上下階層機能流用機能、などです。
その中に、さらに、(例えば・・・・)
・色や大きさなどの属性(性質=性格)の設定機能、
・コピー・貼り付け・削除・新規作成、などの機能、
・データや数式の入力+保持機能
・プログラム自動実行機能
・表示/非表示の機能
・上下階層自由往来機能
・上下階層機能流用機能
など、があります。
以上は単一のオブジェクトの場合です。
コレクション(=コレクションオブジェクト)も、「オブジェクト」の仲間なので同様にそのような「機能」を持っています。
が、コレクションの場合は単一のオブジェクトよりも「限定的」です。
まず、イベントは持っておらず、しかし、プロパティ、メソッド、を持っています。
ただ、その量は、単一のオブジェクトたちと比べるとだいぶ少ないです。