2015-01-22 2 views
0

사용자 지정 컬렉션 클래스가 포함 된 클래스를 만들었습니다. 컬렉션 클래스는 부모 클래스가 초기화 될 때 항목으로 채워집니다. 문제는 컬렉션의 항목을 반복 할 때 모든 항목에 마지막 항목의 속성이 추가된다는 것입니다. 항목은 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 

답변

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 

이 변경됨