★Access2000VBA・Excel2000VBA独学~今・選択されてる or 指定したオブジェクトの省略の無い階層構造をさっと調べる自作関数 ~イミディエイトウィンドウで使う自作関数 ★ ~Current無省略オブジェクト式記述02~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  
  
  
※関連記事
● Access2000VBA・Excel2000VBA独学~イミディエイトウィンドウで使う自作関数 ★ ~Current無省略オブジェクト式記述~
  
  

★ (01)指定したオブジェクトの親のオブジェクトたちを、1段階ずつ上に上がって調べていく自作関数

  
このプログラムは、適当なセルを選択してから、イミディエイトウィンドウにて、

? ObjTypeChk01(Application.Selection)

と書いてEnterすると、次のように表示されます。

Worksheet
Workbook
Application

階層が、逆順で出てきます。
  

そのほか、例えば棒グラフを作って、例えばそのグラフの棒の部分を2回クリックしたのち、同じく

? ObjTypeChk01(Application.Selection)

とやると、

Series
ChartGroup
Chart
ChartObject
Worksheet
Workbook
Application

と、出てきます。
これも、階層が逆順で出てきます。

この関数だけだと、一番モト(起点・出発点)となる、「Application.Selection」のオブジェクトの種類がわからないのと、もちろん、逆さまに出てきてしまうので少々不便です。

それを以降の(02)と(03)のプログラムで解決したいと思います。
  
  
============================
  

★ (02)指定したオブジェクトの親のオブジェクトたちを、1段階ずつ上に上がって調べていき、グローバル変数(配列)に書き込んでいく自作関数

この自作関数は、動きとしては前項のものとまったく変わりません。

ただ、イミディエイトウィンドウに表示するのではなく、グローバル変数(配列の変数)に、オブジェクトの種類の名前を書き込んでいきます。そこが異なります。

また、配列のグルーバル変数に書き込むので、このプログラムが完了したあとも、グローバル変数と書きこまれた名前はメモリ上に残っています。
なので、それを、他のプログラムにて、また引き続き使えます。
  

  
  
============================
  

★ (03)上記の関数を利用して、①起点(=出発点)となるオブジェクトの名前もゲットし、②階層構造を逆さまではなくて正しい順序で書き出す自作関数

選択したオブジェクトを起点として階層構造を正順に書き出します。

  
(01)にて、棒グラフの棒の部分をクリックしたのち、

? ObjTypeChk01(Application.Selection)

とやると、以下のように出てくる、と書きました。

Series
ChartGroup
Chart
ChartObject
Worksheet
Workbook
Application

このプログラムでは、同じことをすると、
(? SelectionObject_ObjModelKaisouCheck01 でEnterすると)

Application
Workbook
Worksheet
ChartObject
Chart
ChartGroup
Series
Point

と表示されます。

「グラフの棒」は、どうやら「Point」というオブジェクトであり、そしてその階層まで、上記のような階層構造をたどってくる・・・、ということが分かります。
(※「Point」は、「棒」という意味ではなくて、値を描画(=点=Point)で表現しているモノ?という感じの意味のようです。折れ線グラフの場合は、「Point」は、値を示す場所にできる各「点」のことっぽいです。その点は、1個1個、そこだけを選択できるので、そのように選択すると「Point」としてイミディエイトに表示されます。折れ線だけを選択するとすべての「点(Point)」が同時選択され、「Point」の1つ上位の「Series」がイミディエイトに「起点」のオブジェクトとして表示されます。詳しくはヘルプと実際の動きを見てみてください。
棒グラフでも、同じ色の棒が複数選択された状態だと「Series」が、いっぽう、1つだけが選択された状態だと「Point」が、選択されたとみなされるっぽいです。)
  
============================
  

★ (04)前項の(03)を、選択したオブジェクトではなくて、「オブジェクト式で指定したオブジェクト」を使って、それによって階層構造を調べられるように少し改変したもの。

Range.Font オブジェクトとか、Range.Interior オブジェクト などは、「マウスで選択」することが「できない」「オブジェクト」なので、オブジェクト式を手動で指定してからでないと、その階層構造が調べられません。
このプログラムはそういう場合について、対応させてみました。
内容はほとんど同じです。

また、「Range(×××)」という書き方のように、「(例えば上位の)階層が省略されたオブジェクト式の書き方」の場合、その「Range(×××)」などをそのまま引数に指定していただくと、その上位に何が(どの階層が)省略されているか?もわかると思います。

  
例えば、イミディエイトで、

? DesignateObj_ObjectModelKaisouCheck01(Range("A1").Font)

とやることで、

Application
Workbook
Worksheet
Range
Font

といった階層構造が得られます。

ただ、この自作関数は、関数の引数にオブジェクト式を指定する時に、結局、オブジェクトの階層構造を指定して書くので、正直この自作関数は、「無意味・無駄」な自作関数かもしれません。

それに、場合によっては正しく単一オブジェクトを指定しているのに、エラーになったりもします。
また、FontやStyle、のように、1つだけではなくて色んなオブジェクトの下位に居るオブジェクトに付いては意図せず、すごく上の階層に居るかのごとく、表示されてしまうこともあります。

なので、何かを調べるときのヒントくらいにしかならないかもしれません。

でも、まあ、プログラムの「汎用化」「部品化」の練習にもなるし、もしかしたら何か「使い道」があるかもしれませんので、もしよかったら動きを見てみてください。

  

※参考
? DesignateObj_ObjectModelKaisouCheck01(Range("A1").Border)
でEnterすると、正しいと思いきや、エラーになってしまいます。

? DesignateObj_ObjectModelKaisouCheck01(Range("A1").Borders)
と、コレクションを指定してEnterすると、以下のように、正しく階層構造が表示されます。

Application
Workbook
Worksheet
Range
Borders

作ったプログラムが悪いのかもしれませんが、それを修正しようと何か探ってみると、また別の新しいことが分かるかもしれません。
  
============================