как прочитать коллекцию элементов Collections в vba?

#excel #vba

#excel #vba

Вопрос:

Я создал коллекцию с именем AllCollection и присвоил данные из диапазона на листе «Все». Теперь я пытаюсь сравнить значение в collection (i) и element (i, 1), однако я не могу определить правильный синтаксис. Я перепробовал бесчисленное количество форм, таких как AllCollection (i) (i, 1) или AllCollection (i (i, 1)), но безуспешно. Я не использую массивы, потому что я не знаю размеры OP3Collection и 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" amp; 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" amp; LastRowC   1).Value = NewCollection
LastRowC = OP3Collection.Count
Sheets("OldPop3").Range("A2:AL" amp; LastRowC   1).Value = OP3Collection
...
  

Комментарии:

1. Это будет то же самое, что вы обращаетесь к ним, чтобы поместить их, вы добавляете элемент collection, а не коллекцию, поэтому вы говорите, что сегмент 1 разделен на 2 сегмента. op3collection.add allcollection это была бы коллекция коллекций. Итак, вы бы сказали, NewCollection.Item(x) что

2. AllCollection. Добавьте листы («Все»). Диапазон («A2: AL» и lastRow). Строка значений добавляет что-то вроде AllCollection -> Items 1 (1) …. -> Элементы (1,1) …. Элементы (i, 1), где элементы 1 (1) равны строке в таблице, и я хочу получить доступ к первой ячейке этой строки,

Ответ №1:

Range("A2:AL" amp; LastRow).Value выдает вам двумерный массив со всеми значениями, которые у вас есть в ячейках диапазона.

Итак, когда вы пишете AllCollection.Add Sheets("All").Range("A2:AL" amp; LastRow).Value , вы добавляете новый элемент в коллекцию, содержащую двумерный массив.

Это остается верным, когда вы добавляете один из элементов из одной коллекции во вторую: NewCollection.Add AllCollection.Item(i) поместит d-мерный массив в? NewCollection — но будьте осторожны, это тот же массив, а не копия.

Вы получаете доступ к отдельным элементам массива с помощью AllCollection(1)(1,1) или (возможно, проще для чтения) AllCollection.item(1)(1,1)

Ответ №2:

Если кто-нибудь интересуется подобной проблемой, я написал другой код с массивами, это намного быстрее.

 NewArray = Sheets("All").Range("A2:AL" amp; LastRow).Value
OP3Array = Sheets("All").Range("A2:AL" amp; 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" amp; ArraySize   1).Value = NewArray
'Sorts and pushes empty rows to bottom
Sheets("New").Range("A2:AL" amp; 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" amp; ArraySize   1).Value = OP3Array
'Sorts and pushes empty rows to bottom
Sheets("OldPop3").Range("A2:AL" amp; ArraySize   1).Sort 
Key1:=Sheets("OldPop3").Range("B2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers