Добавить в коллекцию в цикле - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь добавить в коллекцию, которую в конечном итоге добавлю в список.

Случаи происходят из диапазона ячеек из двух столбцов в моей книге.

Я пыталсяиспользуя собственный объектный класс как непосредственно из my для каждого цикла, идентифицируя интересующие ячейки (закомментированные разделы), так и добавляя их в массив и проходя по ним, добавляя их в мою коллекцию.В обоих случаях мои предыдущие добавления перезаписываются следующими.

Private Sub formulas_Change()
    Dim i As Integer
    Dim cl As Range
    Dim mr As Worksheet
    Dim itemID As colClass
    Set itemID = New colClass
    Dim formArr(2, 2) As Variant

    Set mr = Worksheets("Monomer Ref")

    If cols.Count <> 0 Then
        For i = 1 To cols.Count
            cols.Remove i
        Next i
    End If

    monCount = 0
    ListBox1.Clear
    i = 0

    For Each cl In Range("MonomerList")
        Select Case cl
            Case "2-Ethylhexyl acrylate"
                formArr(i, 0) = cl
                formArr(i, 1) = cl.Offset(0, 1)
                i = i + 1

'                With itemID
'                    .name = cl
'                    .tGlass = cl.Offset(0, 1)
'                End With
'                monCount = monCount + 1
'                pushCollection itemID

            Case "Methacrylic acid"
                formArr(i, 0) = cl
                formArr(i, 1) = cl.Offset(0, 1)
                i = i + 1

'                With itemID
'                    .name = cl
'                    .tGlass = cl.Offset(0, 1)
'                End With
'                monCount = monCount + 1
'                pushCollection itemID

            Case "Styrene, atactic"
                formArr(i, 0) = cl
                formArr(i, 1) = cl.Offset(0, 1)
                i = i + 1

'                With itemID
'                    .name = cl
'                    .tGlass = cl.Offset(0, 1)
'                End With
'                monCount = monCount + 1
'                pushCollection itemID

'                For Each itemID In cols
'                    MsgBox itemID.quants
'                Next itemID
        End Select
    Next cl

    For i = 0 To 2
        MsgBox i & " " & formArr(i, 0)
        With itemID
            .name = formArr(i, 0)
            .tGlass = formArr(i, 1)
        End With
        monCount = monCount + 1
        pushCollection itemID
    Next i

    Select Case formulas
        Case "-7"
            i = 0
            For Each itemID In cols
                ListBox1.AddItem
                ListBox1.List(i, 0) = itemID.name
                ListBox1.List(i, 1) = itemID.tGlass
                ListBox1.List(i, 1) = 23
                i = i + 1
            Next itemID
    End Select

End Sub


Private Sub pushCollection(itemID As colClass)
    cols.Add itemID
End Sub

Когда код запускается, моя коллекция содержит три объекта, все "Стирол, атактический".

Я знаю, что предыдущие объекты были добавлены, и .Count увеличивается на один в каждомдело.Например, «2-этилгексилакрилат» является единственным объектом, тогда есть два объекта, которые являются «метакриловой кислотой», а затем три, которые являются стиролом, о котором я упоминал ранее.

Я вполне уверен, что могу добавитьвсе они напрямую вместо использования класса объекта и подпрограммы, вызываемой для добавления, но я хочу понять, почему это происходит для дальнейшего использования.

1 Ответ

0 голосов
/ 10 мая 2019

Мне немного трудно точно понять, что ты делаешь.Но если я хочу иметь группу коллекций, каждая из которых связана с определенным ключом, я обычно буду использовать объект Dictionary для его хранения.

Во-первых, для скорости и простоты я бы прочитал диапазон для обработкив массив VBA:

myDataArr = theRangeToProcess

И пример кода будет выглядеть примерно так:

Set D = New Dictionary
For i = 1 to ubound(myDataArr,1)
    myKey = myDataArr(i,1)
    If Not D.Exists(myKey) then
        set COL = new Collection
        COL.Add myDataArr(i,2)
        D.Add key:=mykey, item:=COL
    Else
        D(myKey).Add myDataArr(i,2)
    End If
Next I

Тогда вы можете вывести результаты, однако.

...