【问题标题】:VBA subclass referenceVBA 子类参考
【发布时间】:2018-08-10 14:06:34
【问题描述】:

In this post VBA 中有“子类”用法的描述。我正在寻找它的下一步:当我添加了第一个子项目时,我想使用它但不知道如何。

当我写 baseItem(1).itemName 时它不起作用。

我认为这只是因为那个 baseItem 不是集合或数组,但我不知道任何其他方式。

【问题讨论】:

    标签: excel vba class subclass


    【解决方案1】:

    欢迎来到 SO!

    在 vba 中,与许多其他语言一样,它是一个属性。您直接调用它们而不是数字,但是您需要编写 GET/LET 方法,除非该类是公共的(这并不是真正的封装以简单地直接访问)。

    baseItem.itemName 是你的电话。

    但是...正如我之前所说,最好将访问器作为方法写入类。

    这是一个为 VBA 中的 OOP 定下基调的人(对我而言): https://stackoverflow.com/a/45570268/8716187

    他是 Rubberduck 项目的司机。

    我会问你自己是否真的需要一个类,我会经常使用 4-10 个包含数组的键的字典。我可以把它们包在一个班级里,但为什么要麻烦呢?我需要的是一个可搜索和可编辑的(“数组”——数组字典)。

    我写的类模块很少,好像不用它也能操作很多次。

    -WWC

    【讨论】:

    • 搜索他的答案 (Mathieu Guidon) 并寻找 Vitaya,还有其他的,可能太多了,在这里无法命名,但他们积极引导您如何将 VBA 的部分翻译成更多的“ C 语言”或 OOP 结构。
    • "这是一个为 VBA 中的 OOP 定下基调的人" - ~blush~
    【解决方案2】:

    我认为这只是因为那个 baseItem 不是一个集合或一个 数组...

    baseItem 本身既不是集合也不是数组。它只是一个BaseClass 类型的对象。但是这个对象baseItem 包装了一个集合,所以我们也许可以说它几乎是一个集合。

    这个对象的问题是,正如它现在在the answer you mentioned 中定义的那样,它没有提供客户端如何访问这个集合的方法。类BaseClass 需要修改,以便为此类的客户端提供对这个inner 集合的访问。使用 access 例如一些public 函数意味着将从这个集合中返回一些东西。

    BaseClass 中添加这样的内容:

    Public Function getSubItem(index As Variant) As SubClass
        Set getSubItem = subClassCollection.Item(index)
    End Function
    

    现在将在运行时基于此类定义创建的对象将通过此函数getSubItem 提供对 inner 集合的访问。将使用此函数的代码将如下所示。所以现在几乎就是你想要达到的目标。

    Dim name As String
    name = baseItem.getSubItem(1).itemName
    Debug.Print name ' Prints "Something" in output window
    

    但它甚至可以完全符合您想要实现的目标。当导出BaseClass.cls的文件并将Attribute Value.VB_UserMemId = 0添加到函数getSubItem的最开始并再次将其导入到项目中时。

    Public Function getSubItem(index As Variant) As SubClass
        Attribute Value.VB_UserMemId = 0
        Set getSubItem = subClassCollection.Item(index)
    End Function
    

    现在您可以真正按照您想要的方式编写代码。高温

    Dim name As String
    name = baseItem(1).itemName
    Debug.Print name ' Prints "Something" in output window
    

    有关Creating A Default Member In VBA 的更多信息,请查看例如here.

    【讨论】:

    • 太棒了!它有效,我还不知道为什么,但我一直在阅读并寻找启示;)
    • @WojciechWiśniewski 我很高兴它有帮助!
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多