VBA子类引用

时间:2018-08-10 14:06:34

标签: excel vba class subclass

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

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

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

2 个答案:

答案 0 :(得分:2)

欢迎您!

在vba中,就像许多其他语言一样,它是一个Property。您可以直接调用它们,而不是用数字调用它们,但是除非类是公共类,否则您需要编写GET / LET方法(实际上不是直接直接访问的封装)。

baseItem.itemName将是您的电话。

但是……正如我之前所说,最好将访问器作为方法编写到类中。

这是一个在VBA中为OOP设置基调的人(对我来说): https://stackoverflow.com/a/45570268/8716187

他是Rubberduck项目的司机。

我会问你自己是否真的需要一个类,我经常会使用4-10个字典来保存数组。我可以将它们包装在课堂上,但是为什么要打扰呢?我需要的是可搜索和可编辑的(“数组”-数组字典)。

我编写的类模块很少,看来一个模块可以多次运行。

-WWC

答案 1 :(得分:0)

  

我认为这仅仅是因为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

现在,您可以完全按照所需的方式编写代码。 HTH

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

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