我正在编写的 Excel/VBA 类中的一个属性返回一个范围。我使用http://www.cpearson.com/excel/DefaultMember.aspx中描述的技术将其设为该类的默认属性。我希望将 Range 类的所有内置属性和方法与我的类的对象一起使用,而无需明确指定属性。它不起作用。这里有几个更简单的类来说明。(这些清单是使用文本编辑器查看的导出源代码,因为 VBA 的编辑器隐藏了 Attribute 语句。)
' 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 用于实例化和测试类。评论表明当我单步执行时会发生什么:
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”,说“编译错误:未找到方法或数据成员”并停止,因此问题出在对象模型中 - 而不仅仅是在运行时搞砸了。难道我做错了什么?还是不可能有一个返回范围的默认属性?其他内置类呢?用户定义的类?