vba - 为什么返回 Range 的 Excel/VBA 用户定义的默认属性的行为与 Range 不同?

标签 vba excel

我正在编写的 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 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 - 为什么返回 Range 的 Excel/VBA 用户定义的默认属性的行为与 Range 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13898010/

相关文章:

vba - 从过滤范围中获取最后一行

excel - 将图片从一张纸复制并粘贴到另一张纸上

vba - Excel UDF 参数返回单元格引用而不是值

excel - 每个循环的 VBA 包含 64K+ ListRows(内存不足)

python - 如何从 R 中的 xlsx 文件中检测 "strikethrough"样式

VBA-隐藏的工作簿中现有工作表的超链接

excel - 需要将用户选择的工作表名称分配给变量

excel - 使用 Excel/VB 根据父产品列表创建产品变体列表

excel - 获取第二个工作表中列值等于行/列值的单元格值

vba - 使用 VBA 在 Outlook 2003 中循环 PST