Sheetオブジェクトの自作Propertyが呼び出せない?
Sheetオブジェクトをぶち込んだ変数からアクセスできない
前回の
で作成した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
にぶち込むやり方の場合、そもそもコード入力の時点で、
このように、Intellisenseが働かない。
で、実行すると、
このようににべもなくエラーになる。
(2)の部分をコメントアウトして実行すると、
このように意図どおりの結果が出る。当たり前だけれど。
おわりに
なんで変数にぶち込んだら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
変えたのは(*)のところのみ。変数Sh
をSheet3
型にした。
確かに、
こんな風に、入力候補にSheet1
、Sheet2
……というのが出てくる。
実行してみると、
今度は、意図どおりの結果となった。
っていうか、これ、基本的には
これと同じことなんだよなあ。なんで気づかなかったんだろう。