Sheetオブジェクトを変数にぶち込むと自作Propertyにアクセスできない?

Sheetオブジェクトの自作Propertyが呼び出せない?

Sheetオブジェクトをぶち込んだ変数からアクセスできない

前回の

akashi-keirin.hatenablog.com

で作成したPropertyに、Sheetオブジェクトをぶち込んだ変数からアクセスしようとしたらできなかった。

リスト1 標準モジュール
Public Sub testSheetProperty()
  Debug.Print Sheet3.LastRowNumber(4)    '……(1)'
  Dim Sh As Worksheet    '……(2)'
  Set Sh = Sheet3
  Debug.Print Sh.LastRowNumber(4)
End Sub

(1)の

Debug.Print Sheet3.LastRowNumber(4)

および(2)からの3行

Dim Sh As Worksheet
Set Sh = Sheet3
Debug.Print Sh.LastRowNumber(4)

ともに、Sheet3オブジェクトの自作Propertyを参照して、返り値をイミディエイトに表示しようとしている。

ところが、(2)の方、すなわち、Sheet3を変数Shにぶち込むやり方の場合、そもそもコード入力の時点で、

f:id:akashi_keirin:20180714213639j:plain

このように、Intellisenseが働かない。

で、実行すると、

f:id:akashi_keirin:20180714213648j:plain

このようににべもなくエラーになる。

(2)の部分をコメントアウトして実行すると、

f:id:akashi_keirin:20180714213657j:plain

このように意図どおりの結果が出る。当たり前だけれど。

おわりに

なんで変数にぶち込んだらPropertyにアクセスできないんだろう???

追記

id:imihitoさん、thom (id:t-hom)さんからコメントをいただいて、ある程度意味が分かってきました。

Sheet3オブジェクトは、Worksheetクラスを継承した子クラス、ないしはWorksheetインターフェイスを実装したクラス、と考えたら良いっぽい。

Worksheetクラスの子クラスの場合

今回のLastRowNumberプロパティは、あくまで子クラスSheet3クラスのプロパティなので、親クラスWorksheet型の変数からは呼び出せないことになる。

Worksheetインターフェイスを実装したクラスの場合

同じく、Worksheetインターフェイスには存在しないプロパティなので、Worksheetインターフェイス型の変数からは呼び出せない。

コードの修正

したがって、上記のリスト1を次のように修正する。

スト2 標準モジュール
Public Sub testSheetProperty()
  Debug.Print Sheet3.LastRowNumber(4)
  Dim Sh As Sheet3    '……(*)'
  Set Sh = Sheet3
  Debug.Print Sh.LastRowNumber(4)
End Sub

変えたのは(*)のところのみ。変数ShSheet3型にした。

確かに、

f:id:akashi_keirin:20180715103829j:plain

こんな風に、入力候補にSheet1Sheet2……というのが出てくる。

実行してみると、

f:id:akashi_keirin:20180715103846j:plain

今度は、意図どおりの結果となった。

っていうか、これ、基本的には

akashi-keirin.hatenablog.com

これと同じことなんだよなあ。なんで気づかなかったんだろう。