如何创建此VBA结构?

时间:2016-09-05 21:19:23

标签: vba excel-vba excel

我在过去几个月里一直在学习如何在VBA中使用课程,但是在找出将多个课程项目分组在一起的正确方法时遇到了问题,因此我可以对它们进行迭代。

例如,我有一个名为clsPersons的类,其中包含Name,Gender,DOB和Age(Today - DOB)等属性。如果我只想添加一个人,我会做以下事情:

    Dim Person As New clsPersons

    Person.Name = "Phillip"
    Person.Gener = "Male"
    Person.DOB = "#1/1/2000"
    ' Person.Age would be automatically set by adding Person.DOB

但是,如果我有一个包含所有人的电子表格,并决定创建一个报告,每个人的名字都以字母“#34; P"”开头,那么我首先需要某种对象来使用(集合,字典等)和类似的东西来填充它:

    Dim Person As New clsPersons
    Dim lastRow As Long
    lastRow = Sheet1.Cells(Rows.Count, 1).Row(xlUp).End

    For i = 1 To lastRow
        If Worksheet.Function.Left(Sheet1.Cells(i, 1), 1) = "P" Then
            Person.Name = Sheet1.Cells(i, 1)
            Person.Gener = Sheet1.Cells(i, 2)
            Person.DOB = Sheet1.Cells(i, 3)
        End If
    Next i

填充之后,我希望能够遍历它以将项目拉出来,所以像这样:

    For Each Person In objPeople
        Sheet2.Cells(i, 1) = Person.Name
        Sheet2.Cells(i, 1) = Person.Gender
        Sheet2.Cells(i, 1) = Person.Age
    Next Person

希望我所概述的内容有道理。简单地说,我只是在寻找将人们组合成一个对象的正确方法,我可以在以后的程序中重复这个对象。

1 个答案:

答案 0 :(得分:6)

将您的类的多个实例放入Collection中就可以了。

我可能会命名你的班级clsPerson,因为每个实例只代表一个人。

Dim col As New Collection
Dim lastRow As Long
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To lastRow
    With Sheet1.Rows(i)
        If Left(.Cells(1), 1) = "P" Then
            col.Add Person(.Cells(1), .Cells(2), .Cells(3))
        End If
    End with
Next i

人员职能:

Function Person(nm, gender, dob) as clsPerson
    Dim p As New clsPerson
    With p
        .Name = nm
        .Gender = gender
        .DOB = dob
    End With
    Set Person = p
End Function