사용자 지정 컬렉션 클래스가 포함 된 클래스를 만들었습니다. 컬렉션 클래스는 부모 클래스가 초기화 될 때 항목으로 채워집니다. 문제는 컬렉션의 항목을 반복 할 때 모든 항목에 마지막 항목의 속성이 추가된다는 것입니다. 항목은 ActiveSheet의 셀과 연관되어야하며 각 항목에는 Name 및 Range 속성이 있습니다. Name은 셀의 값이고 Range는 범위입니다. 그래서 셀 A1 : D1에서 ID, Q1, Q2, Q3 값을 가지며 컬렉션의 멤버가 ID, Q1, Q2, Q3 및 범위 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
필드 클래스 (사용자 지정 컬렉션) :
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
그리고 필드를 포함하는 샘플 클래스 (수금 클래스) :
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