如何在vba中读取Collections of Collections元素?

时间:2019-03-13 08:55:15

标签: excel vba

我制作了一个名为AllCollection的集合,并从工作表“ All”中的范围分配了数据。现在,我试图比较集合(i)和元素(i,1)中的值,但是我无法弄清楚正确的语法。我尝试了无数形式,例如AllCollection(i)(i,1)或AllCollection(i(i,1)),但是没有运气。我不使用数组,因为我不知道OP3​​Collection和NewCollection的大小。

Dim OP3Collection As New Collection
Dim NewCollection As New Collection
Dim AllCollection As New Collection
...
some other code
...
AllCollection.Add Sheets("All").Range("A2:AL" & LastRow).Value
LastRowC = 0
For i = 1 To LastRow - 1
    If AllCollection.Item1(i).Items1(i, 1) = "*" Then
        NewCollection.Add AllCollection.Item(i)
    ElseIf AllCollection.Item1(i).Items1(i, 1) = 3 Then
        OP3Collection.Add AllCollection.Item(i)
    End If
    Str = "Split: Copying data from sheet /All/ to sheets /New/,/OldPop3/ "
    Call ProgressOfCode(i, LastRow - 1, Str)
    Str = ""
Next
LastRowC = NewCollection.Count
Sheets("New").Range("A2:AL" & LastRowC + 1).Value = NewCollection
LastRowC = OP3Collection.Count
Sheets("OldPop3").Range("A2:AL" & LastRowC + 1).Value = OP3Collection
...

2 个答案:

答案 0 :(得分:0)

Range("A2:AL" & LastRow).Value为您提供一个二维数组,其中包含该范围的单元格中所有的值。

因此,当您编写AllCollection.Add Sheets("All").Range("A2:AL" & LastRow).Value时,您将向其中添加一个包含二维数组的新项。

当您将一个集合中的一个项添加到第二个集合时,情况仍然如此:NewCollection.Add AllCollection.Item(i)将把d维数组放入? NewCollection-但请注意,它是相同的数组,而不是副本。

您可以使用以下命令访问数组的单个项目 AllCollection(1)(1,1)或(也许更容易阅读)AllCollection.item(1)(1,1)

答案 1 :(得分:0)

如果有人想知道类似的问题,那么我用数组编写了不同的代码,那会更快。

NewArray = Sheets("All").Range("A2:AL" & LastRow).Value
OP3Array = Sheets("All").Range("A2:AL" & LastRow).Value
For i = 1 To LastRow - 1
    If NewArray(i, 1) <> "*" Then
        For j = 1 To 38
            NewArray(i, j) = Empty
        Next
    End If
    If OP3Array(i, 1) <> 3 Then
        For j = 1 To 38
            OP3Array(i, j) = Empty
        Next
    End If
    Str = "Split: Copying data from sheet /All/ to sheets /New/,/OldPop3/ "
    Call ProgressOfCode(i, LastRow - 1, Str)
    Str = ""
Next

ArraySize = UBound(NewArray)
Sheets("New").Range("A2:AL" & ArraySize + 1).Value = NewArray
'Sorts and pushes empty rows to bottom
Sheets("New").Range("A2:AL" & ArraySize + 1).Sort 
Key1:=Sheets("New").Range("B2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers

ArraySize = UBound(OP3Array)
Sheets("OldPop3").Range("A2:AL" & ArraySize + 1).Value = OP3Array
'Sorts and pushes empty rows to bottom
Sheets("OldPop3").Range("A2:AL" & ArraySize + 1).Sort 
Key1:=Sheets("OldPop3").Range("B2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers