9

私が書いているExcel/VBAクラスのプロパティは、範囲を返します。http://www.cpearson.com/excel/DefaultMember.aspxで説明されている手法を使用して、これをクラスのデフォルトプロパティにしました。プロパティを明示的に指定せずに、Rangeクラスのすべての組み込みプロパティとメソッドをクラスのオブジェクトで使用することを期待していました。動作しません。ここに、説明するためのはるかに単純なクラスがいくつかあります。(これらのリストは、VBAのエディターが属性ステートメントを非表示にするため、テキストエディターで表示されるエクスポートされたソースです。)

' clsDefLong:    This class just verifies that default properties work as I expected.
Public Property Get DefProp() As Long
Attribute DefProp.VB_UserMemId = 0
    DefProp = 125
End Property

' clsDefRange:  This class is identical except the default property returns a Range.
Public Property Get DefProp() As Range
Attribute DefProp.VB_UserMemId = 0
    Set DefProp = ActiveCell
End Property

これは、クラスをインスタンス化してテストするための通常のモジュールのSubです。コメントは、私がそれを1ステップ実行したときに何が起こるかを示しています。

Sub DefTest()
    Dim DefRange As New clsDefRange, DefLong As New clsDefLong
    Debug.Print DefLong.DefProp         '(1) Displays 125. Verifies the class behaves as intended.
    Debug.Print DefLong                 '(2) Same as (1). Verifies VBA uses the DefProp property as the default.
    Debug.Print DefRange.DefProp.Value  '(3) Displays the ActiveCell content. Verifies that this class works as intended.
    Debug.Print DefRange.DefProp        '(4) Same as (3). Verifies VBA knows DefProp returns a Range without further prompting.
    Debug.Print DefRange                '(5) Aborts with the messge "Run-time error '13': Type mismatch"
 End Sub

ステートメント(5)のDefRangeがステートメント(4)のDefRange.DefPropと同じように動作しないのはなぜですか?

ステートメント(5)を次のように変更した場合:

Debug.Print DefRange.Cells(1, 1) 

コンパイラは「.Cells」を選択し、「コンパイルエラー:メソッドまたはデータメンバーが見つかりません」と言って停止するため、問題はオブジェクトモデルにあります。実行時に何かが台無しになるだけではありません。私は何か間違ったことをしていますか?または、範囲を返すデフォルトのプロパティを持つことはできませんか?他の組み込みクラスはどうですか?ユーザー定義のクラス?

4

1 に答える 1

5
Debug.Print DefRange

これは、デフォルトのプロパティをチェーンするように要求しているようですが、実行されません。提供するオブジェクトからのみデフォルトのプロパティをプルできます。この場合、範囲オブジェクトを返しているので、それを印刷することはできません。VBAは、デフォルトプロパティがオブジェクトを返すかどうか、およびそのオブジェクトタイプにデフォルトプロパティがあるかどうかを確認するために、次のレベルに進みません。もしそうなら、無限ループを作成できると思います。2つのオブジェクトは、それぞれもう一方のデフォルトプロパティの結果です。

Debug.Print DefRange.Cells(1, 1) 

デフォルトのプロパティは、それ自体をドットチェーンに挿入しません。これは、DefRangeに独自のCellsプロパティがある場合、どちらを使用するのでしょうか。このように動作するExcelのモデル内のオブジェクトは考えられません。あなたはこれを使うことができます

Debug.Print DefRange(1,1)

これは、デフォルトのプロパティを連鎖させる例のようですが、そうはならないと私は言いました。(1,1)チェーンを再開するには、これで十分だと思います。DefRangeは範囲オブジェクトを返し、(1,1)は範囲オブジェクトを返し、Value(デフォルト)プロパティが返されます。

興味深い質問です。デフォルトのプロパティ機能が意図的にこのように構築されたのか、それともそれがうまくいったのか疑問に思います。

于 2012-12-17T15:51:14.743 に答える