我试图添加到一个集合中,最终将其放入列表框。这些案例来自我工作簿中的两列单元格范围。
我尝试使用自定义对象类直接从我的每个循环中添加这些对象,以标识感兴趣的单元格(注释部分),并通过将它们添加到数组并循环遍历以将它们添加到我的集合中。在这两种情况下,我以前的添加内容都会被下一个覆盖。
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
当以下代码作为三个对象运行我的集合时,所有对象均为“ Styrene,atactic”。我知道之前的对象已添加,并且.Count在每种情况下都增加一个。就像“丙烯酸2-乙基己酯”是唯一的对象,然后有两个对象是“甲基丙烯酸”,然后有三个对象是我前面提到的苯乙烯。我可以肯定地说,可以直接添加它们,而不用使用对象类和实际添加的子例程,但是我想了解为什么会发生这种情况以供将来参考。这是我的第一个问题。我希望我不会因为我的无知而从根本上破坏协议。
答案 0 :(得分:0)
我很难知道您在做什么。但是,如果我想要一组集合,每个集合都与一个特定的键相关联,我通常将使用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
然后您可以输出结果。