В данном случае в словаре уникальные ключи (как всегда) и к каждому ключу одно значение - индекс массива (номер строки).
Ну а массив можем делать "в ширину" сколько хватит памяти. Хотя в данном случае использую тот же исходный массив - это должно здорово сэкономить память в случае миллиона строк :)
Но значением в словаре может быть почти что угодно - число, строка, массив, коллекция, другой словарь, объект... Не знаю, вероятно есть что-то, что не может быть значением - но не знаю что :)
По задаче - если заказы не нужны, тогда код будет такой:
Код |
---|
Option Explicit
Sub tt()
Dim a(), t$, tt&, x&, i&, ii&
a = [a1].CurrentRegion.Value 'массив данных
ii = 1: a(1, 2) = a(1, 3): a(1, 3) = a(1, 4) 'чуть двигаем шапку - один столбец не нужен
With CreateObject("Scripting.Dictionary"): .comparemode = 1
For i = 2 To UBound(a) 'шапку не анализируем
t = Trim(a(i, 1)) 'ключ
If .exists(t) Then 'если есть ключ
tt = .Item(t) 'извлекаем индекс
a(tt, 2) = a(tt, 2) + a(i, 3) 'дополняем массив
a(tt, 3) = a(tt, 3) + a(i, 4)
Else 'если ключа нет
ii = ii + 1: .Item(t) = ii 'увеличиваем/запоминаем индекс
a(ii, 1) = a(i, 1) 'заполняем массив исходными данными
For x = 2 To 3: a(ii, x) = a(i, x + 1): Next
End If
Next
End With
[h1].Resize(ii, 3) = a 'выгружаем результат
End Sub |
А вот это:
Dim a(), t$, tt&, x&, i&, ii&
просто переменные - один массив, строка-ключ и счётчики строк/столбцов.
P.S. Причём tt или x можно сократить - можно использовать одну переменную, да и в общем от x и так толку уже мало :)