★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0005:挫折しないための「オブジェクト」とは?その2
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0005
タイトル:挫折しないための「オブジェクト」とは? その2
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
早速ですみませんが、前号での記述ミスを訂正させてください。
************
それに対して、「コレクションを持たない単一オブジェクト」は
そもそもコレクションオブジェクトが存在しないため、
オブジェクト式として書くと・・・
たとえば、
Worksheet.Range
Range.Font
Range.Interior
Range.Style
と言った感じで書き表すことができ、「Item」は存在しなく、
それぞれの「単一オブジェクト」のみで、1階層分、
となります。
************
の部分は、以下のようになります。
************
それに対して、「コレクションを持たない単一オブジェクト」は
そもそもコレクションオブジェクトが存在しないため、
オブジェクト式として書くと・・・
たとえば、
~Item("××").Range("××")
Range("××").Font
Range("××").Interior
Range("××").Style
といった感じで書き表すことができ、「Item」は存在しなく、
それぞれの「単一オブジェクト」のみで、1階層分、
となります。
(ここではドット以降の部分に着目してください。それのことを言っています。)
************
大変ご迷惑をおかけして申し訳ございませんでした。
※追記
さらにこの修正も間違ってました。↑
Rangeは「Item」ありますね。ごめんなさい。
普通に「Debug.Print ActiveSheet.Range.Item(1, 1).Address」みたいに使うとエラーになりますが、ヘルプ見ると「UNION」使ったときなどに(同じ使い方でも)エラー無く使えるみたいですね。
「~Item("××").Range("××")」は一応?、間違い?です。それ以下の3行だけ、見て下さい。
ただ、Rangeは「コレクションでもあり、単一オブジェクトでもある」、みたいな2つの側面があるし「_Defaultプロパティ」のことなども含めて色々とあるので、ちょっと特殊です。(ほかにもそういう例外があるかもしれませんが、未調査です。参考→ https://officek.net/excelvba/v-range/vr-range/vrr-default/)
今回は、前回が色々ゴチャゴチャ書きすぎてしまたので、もうすこし、整理して・・・・
・・・と思ったのですが、またもやごちゃごちゃになってしまいました。
でも、少し違う感じでまた読んで頂いて、ヒントにして頂ければと思います。
では、以降、本文です。
==================
●オブジェクトとは? その2
オブジェクトとは、「細かい機能の集合体」のことです。
機能が3つとか4つとか少なくても、100個越えでも、どちらも「オブジェクト」です。
ユニット、パーツ、Excelという工場で働く「ミニミニロボット」、
と捉えても良いと思います。
文字データ(2D)とは異なり、
3D的な、
「かたちあるもの」、
「立体的なもの」、
「立体的な装置・機械・メカ」、
というイメージです。
シートなら「シート装置」とか「シートユニット」、
セルなら「セル装置」とか「セルユニット」、
塗りつぶし機能なら「塗りつぶし装置」「塗りつぶしユニット」
フィルタ機能なら「フィルタ装置」「フィルタユニット」などという感じで、
それぞれのパーツや機能に「装置」とか「ユニット」といった語句をくっつけると、イメージしやすいと思います。
(※後述しますが、塗りつぶし機能やフィルタ機能も実は「オブジェクト」です。オブジェクトは目に見える単体の「モノ」だけではありません。)
そして、オブジェクトには
大きいモノ、
小さいモノ、
目に見えるモノ、
目に見えないモノ、
が、あります。
(中くらいのモノも。見えにくいモノも。)
逆に言うと、大きくても、小さくても、目に見えても、目に見えなくても、
「細かい機能の集合体」であるなら、それは「オブジェクト」です。
そしてそれはすべて、
・プロパティ、
・メソッド、
・イベント、
・階層構造上下自由往来機能(=上下階層オブジェクトの機能を流用できる機能)、
・文字データの保持、
といった、
例えば5つの機能のうち、
そのどれかを、内部に保有している(内包している)、
そういう「細かい機能の集合体」、「装置」、「ユニット」でもあります。
※ただし、オブジェクトの中には、メソッド・あるいは・イベントを保持していないものもあります。
(単一・コレクション、ともに)
イベントなどは、保持していないオブジェクトのほうが多いと思います。
でも、プロパティは、すべてのオブジェクト(単一・コレクション、ともに)が、
保持・保有・内包しています。
また、「階層構造上下自由往来機能(=上下階層オブジェクトの機能を流用できる機能)」も多分、
ほほすべてのオブジェクトが、保持・保有・内包していると思います。
(これも単一・コレクション、ともに。
調べてないのでもしかしたら例外があるかもしれませんが。)
そしてさらには、プロパティの中にも、メソッドの中にも、
「さらに細かい機能(=ある意味 命令)」が
「びっしり」と含まれています。
私が「オブジェクト」は「細かい機能の集合体だ」と定義している理由はそこにあります。
なお、実生活で言うと、銀行のATM、家も部屋も、その中に在るテレビやエアコン、パソコン、スマホ、電子レンジ、床暖房、備え付けのクローゼット、などなど、みんなオブジェクトです。
工具、なども小さな機能しかありませんが、オブジェクト、です。
テレビやパソコン、スマホ、などの中に在るスピーカーもオブジェクトです。
この場合は「目に見えない・見えにくい」オブジェクト、となります。
銀行のATMでいえば、その内部に在る、
お札を保管しておくユニット、硬貨などを数えるユニットなどが「目に見えない・見えにくい」オブジェクト、となります。
●プロパティ、メソッドとオブジェクトの関係について
プロパティもメソッドも、
「特定の単一オブジェクトやコレクションオブジェクトに紐付けされた」
「でも、関数・自作関数みたいなもの」
あるいは、
「特定の単一オブジェクトやコレクションオブジェクトに内包された」
「命令・機能みたいなもの」
と捉えるほうが、ヘルプとオブジェクトブラウザが使いやすくなると思います。
関数は関数でも、
「特定の単一オブジェクトやコレクションオブジェクトに紐付けされた」
「特定の単一オブジェクトやコレクションオブジェクトでないと動かない」
「そういう・関数」
それが
「プロパティやメソッド」
ということです。
で、
「プロパティ」は「主に設定系(読む・書き換え)の命令(≒関数)」でオブジェクトを返すものもあります。
(オブジェクトを返すものについては、ChartObject.Chartプロパティのように単一のオブジェクトを返すだけの命令もあれば、Range.Offsetプロパティのように、「指定した行数と列数だけ移動させたセル範囲」をゲット・返す命令もあります。)
「メソッド」は「主に動作系の命令(≒関数)」で、これも、オブジェクトを返すものもあります。
(メソッドは色んな動きをしますが、そのうち、オブジェクトを返すものについては、Worksheet.PivotTablesメソッドのように単一オブジェクトを返す「だけ」の命令もあれば、~.Addや ~.Openのように何らかの動きをしながら、同時に・ついでに、その動きでゲットしたオブジェクトを返してくれる命令もあります。)
オブジェクトは「装置」、プロパティとメソッドはその中に含まれる「機能・命令」ととらえるといいと思います。
例えば「sheetsコレクション」の「addメソッド」なら
「Sheets装置のAdd機能・・・」とか、
「sheetsコレクション」の「Itemプロパティ」なら、
「Sheets装置のItem単品特定機能・・・」みたいな。
(※★・・・Itemは省略されることがほとんどで、それがVBAやオブジェクト式が理解できない、ドツボにハメられる箇所かと思います。)
●「単一オブジェクト」と「コレクションオブジェクト」の存在、理解し分け、について
ちなみにですが、
オブジェクトは、
大別すると、
単一オブジェクト(通称「オブジェクト」)
と、
コレクションオブジェクト(通称「コレクション」)
の「2つしか」ありません。
ヘルプでは「単一オブジェクト」のことは「単一の・・・」と書かれているのですが、巷の書籍ではほとんど書かれておらず、「単一オブジェクトとコレクションオブジェクトの境もあいまい」「いいかげん」「テキトー」「ごった煮」、あるいは逆に「コレクションオブジェクト」をオブジェクトではないかのような誤解を誘う本もあります。
なので、これが「挫折」を「早める」原因の一つでもあります。
単一オブジェクトと単一オブジェクトとの境は「階層の境」ともとれるため、
「単一か、コレクションか」や
「コレクションの位置関係(コレクションは単一の上位ではない)」が、
ご自分の中で明確になると、ヘルプとオブジェクトブラウザが読みやすくなるので、上達が早まります。
●オブジェクトの「大・中・小」の探り方
オブジェクトブラウザで、「クラスのペイン」を「↑」や「↓」の矢印キーなどで上下し、
右側のメンバーのペインに、スクロールバーのスライドボタンが、すごく小さいのが出てきたら「大きい」と思って良いと思います。
実際、プロパティやメソッドの項目数も100個以上、メッチャたくさんあると思います。
縦に少し長めのスライドボタンなら「中くらい」のオブジェクト、と理解していいと思います。
(プロパティやメソッドの項目数も10~50・60個前後)
スライドボタン無しか、だいぶ長い、なら「小さい」オブジェクト、と理解していいと思います。
(プロパティやメソッドの項目数が10個以下)
※オブジェクトブラウザはVBE(VisualBasicEditor)を開いた画面でF2キーを押すと出てきます。
VBEはExcelを開いたら、Alt+F11で出てきます。
●「見える・見えない・大きい(中くらい)・小さい」の具体例
※以降のカッコ内はオブジェクトの名前です。
(一応「単一オブジェクト名」だけを選んでみました。)
※「…」は「オブジェクト」のことだと思ってください。
※分類は私の勝手な主観です。でもみなさんも「いやこれはこっちでしょう!」と
やって下さると、多少なりとも理解が進むのではないかと思います。
(01)「細かい機能の集合体」のうち、大きくて目に見えるモノ
アプリケーション(=ガワ的なモノ=Applicationオブジェクト)、
ブック(Workbookオブジェクト)、
シート(Worksheetオブジェクト)、
ウィンドウ(Windowオブジェクト)、
単一セル・セル範囲(Rangeオブジェクト)、
グラフシート(Chart…)、
テーブル(ListObject…)、
ピボットテーブル(PivotTable…)、
クエリテーブル(QueryTable…)、など。
※パワークエリなどの結果は、テーブル(ListObject…)に出力されます。
※「Microsoft Query」の結果は、2007以降はテーブル(ListObject…)に埋め込まれた
クエリテーブル(QueryTable…)に出力されます。
2003以前は、クエリテーブル(QueryTable…)に直接、出力されます。
(02)「細かい機能の集合体」のうち、大きくても目に見えないモノ
これは厳密に言うと無いのかも?
※「ライブラリ」という単位でなら、Ecelから独立しているモノではありますが、
ADO、DAO、などの「ミドルウェア」と呼ばれるものがあります。
Excel、Access、ではよく使います。
ADO、DAO、なども「オブジェクト」の形式をとっていて、それ全体としては、
そこそこ大きなオブジェクトです。
そしてそのなかに小さなオブジェクトがたくさんあります。
(03)「細かい機能の集合体」のうち、中くらいの大きさで、目に見えないもの
ピボットキャッシュ(PivotCache)、
セルへのCSS似な一括スタイル設定機能(Style)、
OLEDBでの外部データ接続機能(OLEDBConnection)
(04)「細かい機能の集合体」のうち、小さくても目に見えるモノで、ある意味「絵」のかたちになっているもの(アイコンやボタンのように「単体」の「絵」のかたちになっているもの。)
オートシェイプ、(Shapeオブジェクト)
図(画像ファイルなど)(Shapeオブジェクト)、
グラフの軸(Axisオブジェクト)、
グラフのデータ系列(Series…)、
グラフエリア(ChartArea…)、
グラフのデータラベル(DataLabel…)、
Excelの組み込みダイアログボックス(Dialog…)、など。
※大きなオブジェクトや中くらいのオブジェクトの中の、
「サブ機能」的・「さらにちいさな部品」的なものも少なくないです。
(05)「細かい機能の集合体」のうち、小さくても目に見えるモノで、でも、「絵のかたち」「ひとつの部品・カタマリとしての絵」になっている感じがしなくて、「単なる機能の集まり・設定の集まり・とだけに目に映る」もの
(※こちらも、大きなオブジェクトや中くらいのオブジェクトの「サブ機能」的なものも少なくないです。)
並べ替え機能(Sortオブジェクト)、※旧のSortメソッドとは異なりますので注意します。
フィルタ(Filter…)、※オートフィルタのAutoFilterメソッドなどとは異なりますので注意します。
セルの内側書式設定機能(Interior…)、
罫線設定機能(Border…)、
埋込グラフ用の”ガワ”(ChartObject…)、
フリガナ機能(Phonetic…)、
ページレイアウトの設定機能(PageSetup…)、
オートコレクト機能(AutoCorrect…)、
アドイン機能(AddIn…)、
ピボットのフィールド(PivotField…)、など。
(これらの機能は、「大きめな画面」のように
「明確な」「パーツとしての絵の形」「カタマリとしての絵」
になってなくてボタンだったり、設定欄だったりなので、
「オブジェクト」ととらえにくいかもしれませんが、でも全部、「細かい機能の集合体」なので、
「オブジェクト」です。)
(06)「細かい機能の集合体」のうち、小さくて目に見えないもの
エラー管理機能(Errオブジェクト)、
ほとんどの「コレクション(=コレクションオブジェクト)」※「Item」という名前のプロパティかメソッドを持つものなど
Connectionsオブジェクト、
ColorStopオブジェクト、
Watchオブジェクト、
●なぜ市販書籍では、オブジェクトの事を「対象」と呼ぶのか?
詳しくはわかりませんし、単なる憶測ですみませんが、Excel2003までの「VBAのヘルプ」に、「オブジェクト」のことが「対象」として扱われていたからのような気がしないでもないです。
Excel2003までの「VBAのヘルプ」には、すべてのプロパティやメソッドのヘルプページの一番上に、「対象」という文言のHTMLリンクがあるのですが、それを押すと、その名前のプロパティやメソッドを保持しているオブジェクト(単一・あるいはコレクション)の名前がリストアップされます。
だから、ではないかと推測しています。
ヘルプに「対象」とあったので「そうだ!操作対象だ!」とだれかが思いついたのではないでしょうか?
でなかったら英語の文献にそう書いてあったとか・・・。
それ以前は、ほとんどの本で「モノ」と表現されていました。
「文字データ」の対義語的なニュアンスで「モノ」・・・、という風に。
ただ、それもわかりにくいですけど・・・。
いずれにしましても、「対象」というイメージのままだと、「オブジェクトブラウザ」が、多分ですけど、読めないと思います。
ヘルプも読みにくいです。
「ヘルプなんか読まないから」「オブジェクトブラウザなんか読まないから」という段階の方は、「対象」のまま覚えても問題ないかもしれません。間違いではないので・・・。
ただ、やはり、「ゆくゆくはヘルプとオブジェクトブラウザが読めて 、どこかで ”爆発的に”上達する目的」を考慮に入れますと、原則「細かい機能の集合体」と考え、派生して、「3Dなもの」、ユニット、パーツ、Excelという工場で働く「ミニミニロボット」、メカ、装置、機械」というイメージのほうがわかりやすく学べるのではないかなーと思います。
プロパティもメソッドも、オブジェクトの中に含まれる、内包される、保持される、「機能・命令」なので・・・。
オブジェクトとは、
・プロパティ、
・メソッド、
・イベント、
・階層構造上下自由往来機能(=上下階層オブジェクトの機能を流用できる機能)、
・文字データの保持、
といった、
最低5つの機能を内包している、「装置」です。
●プロパティやメソッドは「親に位置するオブジェクト」も明示して表現するのが基本
他所でも述べましたが、プロパティやメソッドには、
「同名だけれども親となる単一オブジェクトが異なる」もの、
が存在します。
例えば、
Worksheet.Range
Range.Range
Hyperlink.Range
ListObject.Range
AutoFilter.Range
など。
どれも「だいたいの動きはなんとなく似てはいる」のですが、
意味や細かい動きが全く異なる場合も少なくありません。
たとえば、
Worksheet.Rangeプロパティでゲットできるセル範囲は「絶対的セル番地」なセル範囲ですが
Range.Rangeプロパティでゲットできるセル範囲は「相対的セル番地」なセル範囲、になります。
プログラムを作って何かの目的を達成するなかで、絶対的なセル指定の方がうまく動くのなら
「Worksheet.Rangeプロパティ」を使い、相対して相対的なセル指定の方がうまく動くのなら
「Range.Rangeプロパティ」を使う、という風に使い分けます。
(※Range.Rangeプロパティは、Worksheet.Range.Range みたいな階層構造として扱うことが
少なくないと思います。)
なので、ヘルプでプロパティやメソッドを検索するときは、必ず、
「Worksheet.Range」とか
「Range.Range」などと、
親となるオブジェクト名もくっつけて、検索します。
もしくは、親が分からなくて検索した時に、そのヒットしたページにて
親が何かを必ずチェックします。
(ドットの前の語句が親に位置するオブジェクトのオブジェクト名です。)
でないと、「親オブジェクトが間違ったヘルプページ」がヒットしてしまい、
チンプンカンプンになってしまいます。
また、Excel自身も
「Range って書いただけじゃわかんないよ。どのRange ?親も書いて!」となってしまい、
エラーを吐いたり、誤作動を起こすこともしばしばです。
ちなみにですが、
「Range("A1")」とだけ書いた場合は、
「ActiveWorkbook.Activesheet.Range("A1") の省略形」という
暗黙の了解となっていますので、
この場合は、
暗黙に
Range.Range を指定したわけではなく、
暗黙に
Worksheet.Range を指定した、
という意味になります。
なお、今自分がシート上で選択しているモノの親となるオブジェクトを調べるには、
イミディエイトウィンドウで
? TypeName(Selection.Parent)
と書いてEnterすると出てきます。
それが親となるオブジェクトの名前です。
例えば何らかのセルを選択している時、
? TypeName(Selection.Parent)
とやると
Worksheet
と返ってきます。
次に、「? TypeName(Selection.Parent) 」の「Parent」を消して、
? TypeName(Selection)
とやると、
Range
と返ってきます。
なので、
今自分が選択しているモノは、
Worksheet.Range
というオブジェクトなんだなーと分かります。
それをヘルプでの検索語句にします。
(この場合の「Worksheet.Range」の「Range」は単一オブジェクト名であり、プロパティ名ではありませんが、単一オブジェクト名とプロパティ名、あるいは、コレクションオブジェクト名とプロパティ名は同じ綴りであることが多いため、一般的に良く使われるものなら、そのまま綴りを書き換えることなくで調べられます。そして実際に、間違えずに検索にヒットします。
例外的にダメなことがあるかもしれないので、それは、Q&Aサイトで聞くなり、Web検索するなり、先生につくなりして調べます。)
オートシェイプはイミディエイトでもローカルウィンドウでも「Shape」と出ずに「Oval」などと出てしまい、ちょっとわかりにくいですが、でも親のオブジェクトはちゃんと出ます。
わからなかったら、Web検索したらもしかしたらわかるかもしれません。
そのような感じで、ヘルプで検索するときは、「親のオブジェクトの名前も一緒に」くっつけて、調べます。
● Worksheet.RangeプロパティとRange.Worksheetプロパティの違い
Worksheet.Rangeプロパティ は、シート上のセル範囲(単一、広範囲)をゲットするモノです。
Range.Worksheetプロパティ は、指定したセル範囲が存在するシート(指定したセル範囲を保有・所持しているシート)をゲットするモノです。
あるいは、「××××.Parentプロパティ」以外の方法で親オブジェクトを調べたいときに使います。
その意味では「××××.Applicationプロパティ」も同じです。
例えば何かの条件分岐で「Application」オブジェクトをゲットしたいとき、「Parent」を複数重ねて書かないといけなくなるので、面倒くさいのですが、「××××.Applicationプロパティ」を使うと一気に一発で、「Application」オブジェクトがゲットできます。
でも、どっちかっていうと、WorksheetやWorkbookが一発ゲットできた方が便利な気がするのですが、なぜかそういう仕様になっていません・・・。
意味がわかりません。
●オブジェクト変数に代入する「生のオブジェクト=オブジェクト式」に関する基本事項
(01)VBAのすべてのはじまりは「階層構造(=オブジェクトモデル)」の一覧表から。
これがないと「ムダ学習」「騙され」が急増します。
Excel2000~2003のヘルプに付属している「階層構造(=オブジェクトモデル)」の一覧表が
とても便利です。
以下の図も参考にしてください。
これはExcel2000~2003のヘルプに付属している「階層構造」の一覧表から、
ワークシート部分のへんだけを抜き出して、少し補足を加えて書き直したものです。
参考図↓
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
↑超小さいので、Ctrlキーを押しながらマウスホイールを回して拡大してください。
この一覧表があると無いとでは天と地ほどの差が出ます。
例えば、ヘルプとオブジェクトブラウザが読めるようになるには、この図が無いと読めません。
なぜならヘルプもオブジェクトブラウザも、「この図ありき」で書かれているからです。
また、この図はマイクロソフトが勝手に決めた、でも、「動かせない」「そういう図」です。
何か疑問が生じても、「図ではこうなっちゃってるんだから・・・」と
「あきらめさせてくれる」ものでもあります。それも意外とVBAを早くマスターするのに
役立ちます。
結果、この図と、ヘルプとオブジェクトブラウザが読めるようになり、
どの命令がどの型のデータを返すのか?(文字列系の値か?オブジェクトか?)が
分かるようになれば、「自力でのエラーの解決」がすこしでも短い期間でできるようになります。
エラーが出ることが挫折の一番大きな理由のひとつなので、それが少しでも減れば、
結果、上達が早まることになります。
逆に、この図が無ければ、ヘルプもオブジェクトブラウザも読めず、
「なんだかよくわからない」という状態が長くなり、
すべてのことに「確信」が持てず、「かなり高い活率で」「遅かれ早かれ」
「挫折する」と思います。
ExcelVBAが上達しないもっとも大きな原因は、
「多くの書籍やWebサイトが、この図のことを詳しく説明しないから」、です。
(02)オブジェクトは大別すると「単一オブジェクト」と「コレクションオブジェクト」の2つしかない。
そのうち「より」「基本」となるのは「単一オブジェクト」です。
「単一オブジェクトを中心に」考えます。
★また、このように、「単一」と「コレクション」を分けて考えることが超重要です。
※市販書籍では「オブジェクト」と書かれていたら、単一オブジェクトの場合がほとんど。
コレクションと書かれていたら、コレクションオブジェクトの場合がほとんど。
ただし、コレクションオブジェクトの位置関係、階層構造とのからみ、などは
まず説明されないので、結果、ヘルプもオブジェクトブラウザも読めず・活用できず、
それも挫折の早道となってしまっています。
注意が必要です。
(03)単一オブジェクトにはコレクションオブジェクトを持つものと持たないものがある
「持つ」という表現は適切ではないかもしれませんが、
「複数の単一オブジェクトを作ることが可能」な単一オブジェクトについては
その左側にコレクションブジェクトが存在します。
(Workbook、Worksheet
「常識的に考えて」「何かと1対1でしか紐付け不可能な単一オブジェクト」には、
コレクションブジェクトは 存在しません。
(例えば Font、Interior、Style、など)
例えば「グラフ」には「グラフシート」と「ワークシートへの埋め込みグラフ」の
2形態があります。
どちらのグラフも「Chart」という名前の単一オブジェクトですが、
「グラフシート」の「Chart単一オブジェクト」の場合は、複数作ることができるので、
その左側に「Charts」という複数形の名前のコレクションオブジェクトが存在します。
一方、「ワークシートへの埋め込みグラフ」のほうは
「ChartObject単一オブジェクト」という「言わばガワ・掘りごたつ的なくぼみ(コンテナ)」
の中に、埋め込まれます。
その場合、「ChartObject単一オブジェクト(ガワ)」の中には「1つのグラフしか」
「存在できません」。
つまり、「もともと複数作りたくても作れない・・・1対1で紐付きあう事しかできない」、
ということなのです。
なので、埋込グラフの場合の「Chart単一オブジェクト」の左側には、
コレクションオブジェクトは存在しません。
ただそ、1階層上の、「ChartObject単一オブジェクト」という「言わばガワ」については、
ワークシート内に複数作れるので、その左側に、「ChartObjects」という名前の
コレクションオブジェクトが存在します。
他の単一オブジェクトでも同じような感じで
(上の階層の単一オブジェクトと1対1で存在し合うことしかできないことが理由で)、
コレクションオブジェクトがその左側に居ないものがあります。
参考図↓
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
↑超小さいので、Ctrlキーを押しながらマウスホイールを回して拡大してください。
(04)「コレクションオブジェクトの位置は?
単一オブジェクトと同じ階層に・・・、その左側に居る・・・と思ってください。
参考図↓
https://euc-access-excel-db.com/00000WPPDF/get-object-basic01.pdf
https://euc-access-excel-db.com/00000WPPDF/get-object-basic02-disc-cut.pdf
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
↑超小さいので、Ctrlキーを押しながらマウスホイールを回して拡大してください。
(05)Rangeオブジェクトは少し特殊。単一オブジェクトなのにコレクション的な性格も併せ持つ。
Rangeオブジェクトは単一のセルも複数のセルも同時に扱えてしまいます。
そのせいかどうかわかりませんが、
本来は「配列とコレクションオブジェクト」にしか使えない「For Each」という
命令(ステートメント)が使えます。
(05)省略のないオブジェクト式を書くには?
「階層構造(=オブジェクトモデル)」
参考図↓
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
の一覧表どおりに、
最上階(Application)から、
「Item」などを省略せずに、書くだけ。 です。
※「Item」は、
(同じ名前なんですけど)「プロパティ」の場合と「メソッド」の場合があります。
どちらも単一のオブジェクトをゲットしてくれるものなので、
怖がらず、「動きは大体同じなんだ」と考え、
ヘルプの解説を読んで微妙な差異が無いかだけ確認しつつ、使ってみます。
なぜ同じ名前なのに「プロパティ」の場合と「コレクション」の場合があるのか?は、
習い始めも上達してからも、それほど深く考えなくても大丈夫です。
どうしても必要になったら頑張って深く学んでみてください。
(僕もわかりません。)
※また、「Item」は、コレクションを持たない単一オブジェクトには使うことはありません。
(06)オブジェクト式における「ドット」は何か?
オブジェクトの切れ目。です。
単一オブジェクトやコレクションオブジェクトとの境目を示します。
(07)オブジェクト式における「階層の切れ目」はどこなのか?
単一オブジェクトです。
階層は、単一オブジェクトごとに「1階層」です。
もしかしたら間違っているかもしれませんが、ブック、シート、セル、グラフ、など
良く使うオブジェクトについては、最初のうちはそう考えて差し支えないです。
もしあとで間違いだと、深く理解できるようになれば、そのとき正せば大丈夫です。
参考図↓
https://euc-access-excel-db.com/00000WPPDF/object-model01.pdf
↑超小さいので、Ctrlキーを押しながらマウスホイールを回して拡大してください。
↑この図の、1行分、が「1階層」と考えてくださって差し支えないです。
※マイクロソフトのサイトの一覧図は、コレクションが「上位」のごとく、
コレクションだけで1行分を使って描かれています。
でもその場合でも、階層の切れ目は、「単一オブジェクトごとなんだ」と理解して、ください。
(08)オブジェクトには「5つの機能」のどれかが内包されています。
以下の5つのどれかです。
(a)プロパティ
(b)メソッド
(c)イベント
(d)「上位・下位のオブジェクトの機能の流用」機能(=上下自由往来機能)
(e)文字データを保管する機能(Excelの場合は「Value」とか。Wordの場合は文章とか。)
このうち、
(a)プロパティと、
(d)「上位・下位のオブジェクトの機能の流用」機能 は、
すべてのオブジェクトが内包しています。
それ以外は、内包していないオブジェクトもあります。
以上は、単一もコレクションも両方とも、について言えます。
参考図
オブジェクトとプロパティなどの関係のイメージ図
https://euc-access-excel-db.com/00000WPIMG/2018-09-30---19-52-02.jpg
※図の中の「階層構造」は、「上位・下位のオブジェクトの機能の流用 機能」のこと
と思ってください。
※実際に代入されるのは、オブジェクトへの参照・・・つまり、オブジェクトへ対しての
ショートカットアイコンのようなもの・・・というイメージです。
(09)生のオブジェクト=オブジェクト式を、オブジェクト変数に代入すると、前項の「5つの機能」のすべてもイモずる式に代入される。
参考図
オブジェクト変数にオブジェクトが代入された状態のイメージ図
https://euc-access-excel-db.com/00000WPIMG/2018-09-30---19-44-13.jpg
※図の中の「階層構造」は、「上位・下位のオブジェクトの機能の流用 機能」のこと
と思ってください。
※実際に代入されるのは、オブジェクトへの参照・・・つまり、オブジェクトへ対しての
ショートカットアイコンのようなもの・・・というイメージです。
(11)オブジェクト操作のおおまかな操作イメージとは?
オブジェクトの中に含まれる「前項の5つの機能」たちを「内側から」引き出しつつ
主に、ステートメント、列挙(Enum)、定数、にて、「外側から」動かす・・・・、
そういうイメージの操作方法です。
※「列挙(Enum)」とは、各種設定項目のことで
「定数」は、その設定項目に含まれる、具体的な細かい「設定値」のことです。
つまり、「定数」は「列挙(Enum)」の中に含まれます。
オブジェクトブラウザでも確認できます。
なお、「列挙はオブジェクトの中には含まれていない」、ということも
オブジェクトブラウザでも確認できます。
オブジェクトの右側のペイン、「メンバ」のペインには「列挙」は出てこず、
オブジェクトと同じくくりの「クラス」のくくりに縦に並んでいるからです。
●「省略しないオブジェクト式が長い!」「めんどくさい!イヤだ!!」とお嘆きの方に・・・
あと、少し補足ですが・・・・
省略のないオブジェクト式の書き方で・・・、
Excel.Application. _
Workbooks.Item("ブック名"). _
Worksheets.Item("シート名"). _
Range("セル範囲")
・・・・なんて長ったらしく書くなんて、「耐えられない!めんどくさ~い!!!」
と思われるかもしれませんが、
そのような場合は・・・、
例えば以下のようなプログラミング用のひな型を作っておき、それをコピペして使います。
=============
Dim o_SrcWs01 As Worksheet 'Src→情報元、の意味です。
Dim o_TrgWs01 As Worksheet 'Trg→処理先(転記先、コピペ先、など)、の意味です。
'情報元シートの設定
Set o_SrcWs01 = Excel.Application. _
Workbooks.Item("ブック名"). _
Worksheets.Item("シート名"). _
Range("セル範囲")
'処理先シートの設定
Set o_TrgWs01 = Excel.Application. _
Workbooks.Item("ブック名"). _
Worksheets.Item("シート名"). _
Range("セル範囲")
※VBE上では、ダブルクリックすると単語が自動選択できるので
例えば「" "」の間もダブルクリックすると、どれだけ長くても
文字種が同じなら一発選択できます。
なので、それでドラッグしなくても簡単に「ブック名」とか
「シート名」とかいった部分は消せます。
=============
このようにすれば、名前の部分を必要に応じて変えたり、不要な階層があればそれを丸ごとを消したりするだけなので、特に面倒でもないと思います。
「Workbooks.Item("ブック名") 」の代わりに「ThisWorkbook」や「ActiveWorkbook」を使いたかったらそれに書き換えるだけですし。
「Worksheets.Item("シート名")」を「Activesheet」に書き換えたいときも同様です。
常に、「なんでいちいちこんな面倒くさい形で書くんだろう?どんな意味が?」と疑問を持ちながら作業して、で、答えが見つかった方は、間違いなく上達が早いと思います。
「ブック名」とか「シート名」のところを変数にしてしまえば、関数化(汎用化・部品化)もしやすいですし。
プログラミングを習い始めたころは、
「きれいに書く、短く書く」とか、
「1行でも短く!どんどん削る!」とか、
「トリッキーなアルゴリズムも使っちゃったりして」とか、
「美しく・カッコよく」とか、
よりも
「冗長でもいいので、システマティックに書いて・あとで意味がわかりやすいようにする」
「決まった書き方をできるだけ使って、エラーを見つけやすくする」
「関数化しやすい形で」
「見た目」「形」でも覚える。プログラムの文字の並びを「絵」として頭の中や目に焼き付ける。
「短く書けても、階層構造やヘルプやオブジェクトブラウザが読めないならそれは”ゴミ”と考える」
ほうが学びが進みやすいと思います。
特にExcelやAccessのVBAの「ビジネス定型処理用のプログラム(特に表の操作など)」なんて、そもそもアルゴリズムなんてものは要りませんから。
IFとForとSQLだけ知っていれば大抵のことはできちゃうので・・・。
僕もそんなの使ったことないし。
もちろん、凝ったシュミレーションやガントチャート、シェイプをクラスオブジェクト化する必要があるような場合は必要だと思いますけど・・・。定型集計や定型リストアップには不要なことのほうが多いです。
そんな風に考えてみてください。
==============================
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------