● 用語~当サイトで言っている、『 オブジェクトが「階層構造を持つ」』とは?
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
当サイトでは「オブジェクト」がらみのお話において、「オブジェクトは階層構造を持つ」「オブジェクトは階層構造を保持・保有・内包する」という表現が何度も出てきます。
ただこれは、実はちょっとテキトーな表現になってしまっています。
便宜上、そう表現させてもらってるという・・・。
ほんとごめんなさい。
実は実際には「オブジェクト」は、「階層構造」の中に・・・、位置するものです。
「逆に、オブジェクトは階層構造に含まれるもの」とでも言いましょうか・・・。
ただ、「階層構造の中に位置するもの」すなわちオブジェクトのことですが、それは、次のような機能を有しています。
(詳細な説明はまたどこかで。今は、箇条書きで「やれること」のみを示します。)
(01)「Parentプロパティ」を使って、今現在扱っているオブジェクトの上位のオブジェクトにアクセスする
「Parentプロパティ」を同時にいくつも重ねて使うと、1つ上位だけでなく、更に、2つでも、3つでも上位のオブジェクトにアクセスできます。(「Parent」は「現在のオブジェクトの、1つ上/1つ親の階層のオブジェクト」という意味です。)
※例
例えば、「ActiveSheet」の1つ上の階層のオブジェクトは「Workbook」オブジェクトです。
そのとき、例えば「現在アクティブなブックの名前」を知りたいときに、「ActiveWorkbook.Name」と直接的に書くことが多いと思います。
でもその代わりに、「ActiveSheet.Parent.Name」と言わば間接的に書いてもまったく同じ意味になります。
つまり、「ActiveSheet.Parent」=「ActiveWorkbook」ということです。
逆に「ActiveWorkbook」=「ActiveSheet.Parent」と書いたほうがいいのかな・・・。
「アクティブなブックとは、アクティブなシートの1つ上(1つ親)のオブジェクトでもある」ということです。
※ActiveCellのように、「ActiveCell.Parent.Name」とやって「Sheet××」と出る・・・・、つまり、WorkSheetオブジェクトが「親」・・・と思いきや、実は違ってて、実は親は「ActiveWindow」だった・・・というケースもあり、「×××.Parent」とやった時のオブジェクトと、実際の親のオブジェクトが一致しない場合もあります。
なのでその意味で言うと「.Parent」は万能ではありません。
でも、多くのケースでは親のオブジェクトがわかりますので重宝します。
また、オブジェクトの上への自由往来ができることは変わりません。
(02)その他の「プロパティ」を使って、今現在扱っているオブジェクトの下位のオブジェクトにアクセスする
(03)上位/下位のオブジェクトに自由にアクセスできることで、上位や下位のオブジェクトの「プロパティ」や「メソッド」までもを、今居るオブジェクトから直接・流用(操作)できる。
前項の(01)での例にも「例外」として示しましたが・・・、
『例えば「ActiveSheet」というオブジェクトのNameプロパティに対しては、「Parent」を使うことによって、(階層は異なりますが) 例えば「ActiveCell」というオブジェクトからもアクセスできる。その場合は、ActiveCell.Parent.Nameと書き表す。』
・・・・という形になります。
プロパティだけでなく、メソッドにもアクセスできます。
「ActiveCell.Parent.PrintPreview」と書けば、「アクティブセルのParentのオブジェクト(=ワークシート=Worksheetオブジェクト)の印刷プレビューを表示して!」という意味になり、アクティブなセルを含むワークシートの印刷プレビューの画面が立ち上がります。(ActiveCellの場合、なぜか本当の上位のオブジェクトはWindowオブジェクトですが。)
このとき、「PrintPreview」は、Rangeオブジェクトの1つ上の階層のオブジェクトである、「Worksheet」オブジェクトのメソッドのひとつです。
同様に、セルの下位のオブジェクトのプロパティやメソッドにもアクセスし、それらのオブジェクトを動かすことができます。
(04)そのため、上位/下位のオブジェクトを操作するのに、その上位/下位のオブジェクト用の「新しいオブジェクト変数」を宣言・用意しなくても、今居るオブジェクトから直接・上位/下位のオブジェクトを操作できる。
(05)逆に言うと、今現在扱っているオブジェクトも、別のシーン・別のプログラムになれば「上位/下位のオブジェクトからの通信(ある意味問い合わせ?呼び出し?)に対し、自由に応答できる。」ということでもあります。
・・・というわけで、当サイトでは、とりあえずこれらの5つの機能をさして、「 ”階層構造” を保持・内包している」と表現してしまっています。
オブジェクトが保持する「階層構造がらみの機能全体」のことをさして、「 ”階層構造” を保持・内包している」と表現してしまっているわけです。
(5つだけじゃなくて、多分、もっと色んな機能があるのではないかと思います。すみませんが僕も勉強中なので、全部は知りません。)
もちろん、厳密には違うのかもしれませんが、でも、実際の動きとしては、そんな感じに見えますし、初心者のころは、始めはそう覚えてしまってもほとんど問題は無いと思います。
特に、「オブジェクト変数」のことを理解したい場合、このように考えることは、「オブジェクトが内包している他のもの」・・・、つまり、「プロパティ、メソッド、イベント、ユーザー入力値」などとの絡みも考慮に入れますと、意外と、効果があると思います。
(ある程度、整理して理解できるのではないかと思っています。僕だけかもしれませんが)
それに、この5つの機能のことを逐一、その都度、厳密に説明するのも骨が折れます。
なので、「便宜上」、「 ”階層構造” を保持・内包している」と、短い言葉で表現してしまっています。
もしかしたら、『 オブジェクトは「階層構造応答機能・自由に行き来機能・階層構造自由往来機能」を持つ・・・ 』、と表現するほうがイメージしてもらいやすいかもしれませんね。
でも、それも長ったらしいので、「階層構造を持つ」と表現してしまっています。
すみません。
ということで・・・
本サイトで言うところの、
『 オブジェクトは階層構造を保持・保有・内包する』
とは、
『 オブジェクトは「階層構造応答機能・自由に行き来機能」を持つ・・・ 』
『 オブジェクトは「上下階層からの呼び出しへの応答機能・『階層構造上下自由往来機能』」を保持・保有・内包している・・・ 』
という意味でお話させていただいていますので、そのようにご理解ください。
VBAの学習がかなり高度に進んでから、もっと、ちゃんとしたことを学習し直せば大丈夫だと思います。
(ただ、僕には説明できないので、有名なレジェンドの先生たちにちゃんとお金を払って習ってください。)