プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

Excel VBA オブジェクト階層図のウソ

 今までなんとかVBAを使った開発を逃げてきたのだが、今回ばかりはどうしてもExcel VBAでの開発になってしまった。Excel VBAを触ったことがないわけではないのだが、まともにやるのは今回が初。そこで文法とかAPIとかオブジェクトとか適当に勉強していたのだが、よくわからなかったのが、この「オブジェクト階層図」。これは、こんな風になっているのだが、

┌──────┐
|Application |
└──────┘
 ┃┌──────┐
 ┗|Workbook(s) |
  └──────┘
   ┃┌──────┐
   ┗|Worksheet(s)|
    └──────┘
     ┃┌──────┐
     ┗|Range       |
      └──────┘

これは、どう見ても RangeはApplicationのサブクラス、に見えるのだが…。しかし、どう考えてもRangeがApplicationであるはずがない。そこで3分でできる!Excel VBA、という本をよく見てみたら、ApllicatonはWorkbook(s)オブジェクトを持っている、とか書いてあるし。つまりExcel VBAのオブジェクト階層図は、すべてhas-a関係を表している、ということだ。だからApplicationがもっているメソッドやらプロパティやらはRangeに継承される、ということはないのである。
 こんなことは、VBAを使っている人には当然なのだろうが…。クラスの継承と同じ表記にするなと。上にあるクラスを「親クラス」と呼ぶなと。見た目がMFCとそっくりというのが、なんともMSらしい書き方です。