In this post在VBA中有“子类”用法的描述。我正在寻找它的下一步:添加第一个子项目后,我想使用它,但不知道如何使用。
当我写baseItem(1).itemName
时不起作用。
我认为这仅仅是因为baseItem不是集合或数组,但我不知道其他任何方式。
答案 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。