在VBA中创建包含集合的类

时间:2015-02-04 17:38:41

标签: vba excel-vba excel

我有一个代表一个人的课程

Person.cls

Option Explicit
'the person class
Public FirstName As String
Public LastName As String

和另一个持有人员列表的课程

PersonList.cls

Dim person_list As Collection

我有一个模块

testPersons.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

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

我尝试为PersonList创建子例程addPerson,但我无法弄清楚如何使其工作。


修改

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

Person.cls

Option Explicit
Public FirstName As String
Public LastName As String

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

testPersons.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

并且...... 它有效!

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

1 个答案:

答案 0 :(得分:4)

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

  

Dim p1 As new clsPerson

这是因为您的班级名为Person,而不是clsPerson。 删除前缀应修复编译器错误。

...

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

  

Dim person_list As Collection

私下声明人名单。您需要通过公开使用它来公开它。但是还有更多的东西。您还需要在类中添加Class_Initialize例程,以便实际拥有可以使用的集合对象。

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

我刚注意到你想保持该集合的私密性,所以除了类初始化程序之外,你还需要添加这个方法。

Public Sub Add(value As Person)
    person_list.Add value
End Sub