在 VBA 中使用集合创建类

aba*_*ter 3 excel vba

我有一个代表一个人的类

人.cls

Option Explicit
'the person class
Public FirstName As String
Public LastName As String
Run Code Online (Sandbox Code Playgroud)

和另一个类来保存人员列表

PersonList.cls

Dim person_list As Collection
Run Code Online (Sandbox Code Playgroud)

我有一个模块

测试人员.bas

Public Sub testPersons()
    Dim p1 As New clsPerson
    p1.FirstName = "Rita"
    p1.LastName = "Smith"

    Dim persons2 As New PersonList
    persons2.person_list.Add p1
End Sub
Run Code Online (Sandbox Code Playgroud)

当我运行该模块时,出现编译错误:“找不到方法或数据成员。”

我尝试addPerson为 PersonList创建一个子例程,但我不知道如何使其工作。


编辑:

好的,这是我现在所拥有的:

人.cls

Option Explicit
Public FirstName As String
Public LastName As String
Run Code Online (Sandbox Code Playgroud)

PersonList.cls

Public person_list As Collection

Private Sub Class_Initialize()
    Set person_list = New Collection
End Sub

Public Sub addPerson(this_person As Person)
    person_list.Add this_person
End Sub
Run Code Online (Sandbox Code Playgroud)

测试人员.bas

Public Sub testPersons()
    Dim p1 As New Person
    p1.FirstName = "Rita"
    p1.LastName = "Smith"

    Dim persons_list As New PersonList
    persons_list.addPerson p1
End Sub
Run Code Online (Sandbox Code Playgroud)

而且……它有效!

但是,persons_list.addPerson(p1)给出“ Run-time error: 438: Object doesn't support this property or method.”,我想我不了解调用方法的 VBA 语法。

Rub*_*uck 5

我用你给我们的名字重新创建了你的项目。得到编译器错误的行就在这里。

将 p1 调暗为新 clsPerson

这是因为您的类是命名的Person而不是clsPerson. 删除前缀应该可以修复编译器错误。

但是……

你很快就会遇到下一个问题。

Dim person_list 作为集合

这将私下声明人员列表。您需要通过公开它来公开它以使用它。但还有更多的东西。您还需要向Class_Initialize您的类添加一个例程,以便您实际上拥有一个可以使用的集合对象。

Private Sub Class_Initialize()
    Set person_list = New Collection
End Sub
Run Code Online (Sandbox Code Playgroud)

我刚刚注意到您希望将该集合保持为私有,因此除了类初始值设定项之外,您还需要添加此方法。

Public Sub Add(value As Person)
    person_list.Add value
End Sub
Run Code Online (Sandbox Code Playgroud)