我正在编写的Excel / VBA类中的属性返回一个Range。我使用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”,说“编译错误:找不到方法或数据成员”并停止,因此问题出在对象模型中 - 而不仅仅是在运行时搞砸了。难道我做错了什么?或者是不是可以有一个返回Range的默认属性?其他内置类怎么样?用户定义的类?
答案 0 :(得分:5)
Debug.Print DefRange
这似乎是你要求它链接默认属性而它不会这样做。您只能从您提供的对象中提取默认属性。在这种情况下,您将返回一个范围对象,但无法打印。 VBA不会进入下一级别以查看默认属性是否返回对象以及该对象类型是否具有默认属性。我想如果确实如此,你可以创建一个无限循环 - 两个对象,每个对象都是另一个对象的默认属性的结果。
Debug.Print DefRange.Cells(1, 1)
没有默认属性会将自身插入到点链中。我假设这是因为如果DefRange确实有自己的Cells属性,它会使用哪个?我无法想到Excel模型中的任何行为都是这样的。你可以用这个
Debug.Print DefRange(1,1)
这似乎是链接默认属性的一个例子,我说它不会这样做。我想(1,1)
足以再次启动链条。 DefRange返回一个范围对象,(1,1)返回一个范围对象,并返回Value(默认)属性。
有趣的问题。我想知道默认属性功能是故意以这种方式构建的,还是它的工作方式。