我正在编写的Excel/VBA类中的属性返回一个Range。我使用http://www.cpearson.com/excel/DefaultMember.aspx中描述的技术将其设置为类的默认属性。我希望将所有Range类的内置属性和方法与我的类的对象一起使用,而无需显式指定该属性。它不起作用。这里有几个更简单的类来说明。 (这些 list 是使用文本编辑器查看的导出源,因为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的默认属性?其他内置类怎么样?用户定义的类?
最佳答案
Debug.Print DefRange
似乎您是在要求它链接默认属性,但它不会这样做。您只能从提供的对象中提取默认属性。在这种情况下,您将返回一个范围对象,该对象将无法打印。 VBA不会进入下一级别,以查看默认属性是否返回对象,以及该对象类型是否具有默认属性。我想如果这样做的话,您可以创建一个无限循环-两个对象,每个对象都是另一个对象的默认属性的结果。
Debug.Print DefRange.Cells(1, 1)
没有默认属性会将其自身插入点链。我认为这是因为,如果DefRange确实拥有自己的Cells属性,它将使用哪个属性?我无法想到Excel模型中的任何对象都具有这种行为。你可以用这个
Debug.Print DefRange(1,1)
这似乎是链接默认属性的一个示例,我说过不会这样做。我猜
(1,1)
足以再次启动链。 DefRange返回范围对象,(1,1)返回范围对象,并返回Value(默认)属性。有趣的问题。我想知道默认属性功能是故意用这种方式构建的,还是它是通过这种方式构建的。
关于vba - 为什么返回范围的Excel/VBA用户定义的默认属性的行为不像范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13898010/