2015-01-22 7 views
0

Я создал класс, который содержит пользовательский класс коллекции. Класс коллекции заполняется элементами, когда родительский класс инициализируется. Проблема в том, что когда я повторяю элементы коллекции, все элементы имеют свойства последнего добавленного элемента. Элементы должны быть связаны с ячейками в ActiveSheet, каждый элемент имеет свойства Name и Range. Имя - это значение ячейки, Range - это диапазон. Поэтому в ячейках A1: D1 у меня есть значения ID, Q1, Q2, Q3, и когда я создаю экземпляр родительского класса, я ожидаю, что члены коллекции будут иметь имена ID, Q1, Q2, Q3 и Range A1, B1, C1 , D1. Однако, когда я повторяю, на выходе отображаются Q3, Q3, Q3, Q3 и $ D $ 1, $ D $ 1, $ D $ 1, $ D $ 1.Excel VBA: пользовательские коллекции дублированных элементов

Где проблема?

Код ниже:

Sub test() 

    Dim Sample As Sample 
    Set Sample = New Sample 

    Dim fld As New Field 

    For Each fld In Sample.Fields 
     Debug.Print fld.Name; vbTab; fld.Range.Address 
    Next 

End Sub 

Класс поля:

Private pName As String 
Private pRange As Range 

Public Property Get Name() As String 
    Name = pName 
End Property 

Public Property Let Name(value As String) 
    pName = value 
End Property 

Public Property Set Range(rng As Range) 
    Set pRange = rng 
End Property 

Public Property Get Range() As Range 
    Set Range = pRange 
End Property 

Класс Fields (пользовательские коллекции):

Private pFields As Collection 

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

Private Sub Class_Terminate() 
    Set pFields = Nothing 
End Sub 

Public Function NewEnum() As IUnknown 
    Set NewEnum = pFields.[_NewEnum] 
End Function 

Public Sub Add(fld As Field) 
    pFields.Add fld 
End Sub 

Public Sub Remove(Index As Variant) 
    pFields.Remove Index 
End Sub 

Public Property Get Item(Index As Variant) As Field 
    Set Item = pFields.Item(Index) 
End Property 

Property Get Count() As Long 
    Count = pFields.Count 
End Property 

Public Sub Clear() 
    Set pFields = New Collection 
End Sub 

А класс Sample (содержащий поля сборный класс):

Private pFields As Fields 

Private Sub Class_Initialize() 
    Set pFields = New Fields 
    Initialize_Fields 
End Sub 

Private Sub Class_Terminate() 
    Set pFields = Nothing 
End Sub 

Public Property Get Fields() As Fields 
    Set Fields = pFields 
End Property 

Private Sub Initialize_Fields() 

    Dim rngHeaders As Range, rngCell As Range 
    Set rngHeaders = Range("A1").CurrentRegion.Rows(1) 

    For Each rngCell In rngHeaders.Cells 
     Dim NewField As New Field 
     NewField.Name = rngCell.Value2 
     Set NewField.Range = rngCell 

     pFields.Add NewField 
    Next rngCell 

End Sub 

ответ

0

Проблема решена.

Изменено это:

For Each rngCell In rngHeaders.Cells 
    Dim NewField As New Field 
    NewField.Name = rngCell.Value2 
    Set NewField.Range = rngCell 

    pFields.Add NewField 
Next rngCell 

Для этого:

Dim NewField As Field 

For Each rngCell In rngHeaders.Cells 
    Set NewField = New Field 

    NewField.Name = rngCell.Value2 
    Set NewField.Range = rngCell 

    pFields.Add NewField 
Next rngCell