Я создал класс, который содержит пользовательский класс коллекции. Класс коллекции заполняется элементами, когда родительский класс инициализируется. Проблема в том, что когда я повторяю элементы коллекции, все элементы имеют свойства последнего добавленного элемента. Элементы должны быть связаны с ячейками в 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