【问题标题】:Better way to iterate over custom-object class Excel VBA迭代自定义对象类 Excel VBA 的更好方法
【发布时间】:2014-06-26 06:32:32
【问题描述】:

我正在尝试找出一种方法来迭代(字典)其他自定义对象中包含的自定义对象,而不必每次都使用“设置”。

我的目标是能够直接写:

For Each Person In Family.GetMembers
    test= Person.Age
Next Person

但上面给了我一个object required 错误。但是,我想避免类似

for each name in family.keys
   set Person = Family.GetMember(name) 
   test= Person.Age
next name

类对象 cperson

Option Explicit
Private pName As String
Private pAge As Integer
Public Property Let name(name As String):
    pName = name
End Property
Public Property Get name() As String
    name = pName
End Property
Public Property Let Age(Age As Integer):
    pAge = Age
End Property
Public Property Get Age() As Integer
    Age = pAge
End Property

类对象cfamily

Option Explicit
Private pFamily As Object
Private pName As String
Private Sub Class_Initialize()
    Set pFamily = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
    Set pFamily = Nothing
End Sub
Public Sub Add(Person As CPerson)
    If pFamily.exists(Person.name) Then
        pFamily.Remove Person.name
        pFamily.Add Person.name, Person
    Else
        pFamily.Add Person.name, Person
    End If
End Sub
Public Property Get GetMember(name As Variant) As CPerson:
    Set GetMember = pFamily(name)
End Property
Public Property Let name(name As String):
    pName = name
End Property
Public Property Get name() As String
    name = pName
End Property
Public Property Get GetMembers() As Variant
    Dim tmpArray() As Variant, Person As CPerson, i As Integer, name As Variant
    ReDim tmpArray(pFamily.Count)
    i = 1
    For Each name In pFamily.keys
        Set Person = pFamily(name)
        Set tmpArray(i) = Person
        i=i+1
    Next name
    GetMembers = tmpArray
End Property

【问题讨论】:

    标签: object excel iterator iteration vba


    【解决方案1】:

    我稍微修改了您的代码(cFamily 类的Property Get GetMembers()):

    Public Property Get GetMembers() As cPerson()
        Dim tmpArray() As cPerson, i As Integer
        ReDim tmpArray(pFamily.Count - 1)
    
        For i = 0 To pFamily.Count - 1
            Set tmpArray(i) = pFamily.Items()(i)
        Next
        GetMembers = tmpArray
    End Property
    

    现在你可以像下面这样使用它了:

    Sub Test()
        Dim family As New cFamily
    
        Dim p1 As New cPerson
        Dim p2 As New cPerson
        Dim p3 As New cPerson
    
        Dim p as Variant
    
        p1.name = "name1"
        p2.name = "name2"
        p3.name = "name3"
    
        family.Add p1
        family.Add p2
        family.Add p3
    
        For Each p In family.GetMembers
            MsgBox p.name
        Next
    End Sub
    


    您的Property Get GetMembers() 错了,因为:

    1) 您定义了错误的数组维度:ReDim tmpArray(pFamily.Count) 表示 tmpArray 具有维度 0 To pFamily.Count。您需要使用即ReDim tmpArray(1 To pFamily.Count)

    2) 你没有增加 i - 它总是等于 1。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2014-03-07
    • 2020-04-21
    相关资源
    最近更新 更多