Option Explicit
Sub GroupData()
Dim arr As Variant
arr = Range("A1").CurrentRegion.Value
Dim x As Long, key As Variant, dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim dictName As Object, dictYear As Object
For x = LBound(arr, 1) + 1 To UBound(arr, 1)
key = arr(x, 1)
If Not dict.Exists(key) Then dict.Add key, CreateObject("Scripting.Dictionary")
Set dictName = dict(key)
key = arr(x, 2)
If Not dictName.Exists(key) Then dictName.Add key, CreateObject("Scripting.Dictionary")
Set dictYear = dictName(key)
key = arr(x, 6)
If Not dictYear.Exists(key) Then
dictYear.Add key, New Collection
Dim coll As Collection
Set coll = dictYear(key)
coll.Add arr(x, 3), "start"
coll.Add arr(x, 4), "end"
coll.Add arr(x, 5), "duration"
Else
Dim item As Double
item = WorksheetFunction.Min(coll("start"), arr(x, 3))
coll.Remove "start"
coll.Add item, "start"
item = WorksheetFunction.Max(coll("end"), arr(x, 4))
coll.Remove "end"
coll.Add item, "end"
item = WorksheetFunction.Sum(coll("duration"), arr(x, 5))
coll.Remove "duration"
coll.Add item, "duration"
End If
Next x
Dim cell As Range
Set cell = Range("I1") 'ячека, куда выгружать данные
cell.CurrentRegion.ClearContents
cell.Resize(, UBound(arr, 2)) = Array(arr(1, 1), arr(1, 2), arr(1, 3), _
arr(1, 4), arr(1, 5), arr(1, 6))
Set cell = cell.Offset(1)
For Each key In dict.Keys
Dim keyName As Variant
For Each keyName In dict(key)
Dim keyYear As Variant
For Each keyYear In dict(key)(keyName)
cell.Value = key
cell.Offset(, 1).Value = keyName
cell.Offset(, 5).Value = keyYear
Set coll = dict(key)(keyName)(keyYear)
cell.Offset(, 2).Value = coll("start")
cell.Offset(, 3).Value = coll("end")
cell.Offset(, 4).Value = coll("duration")
Set cell = cell.Offset(1)
Next keyYear
Next keyName
Next key
End Sub
|