Sub MXZ5_Mark17()
Dim arr()
Dim dic As Object
Dim arrItog()
Dim iKey, arrTmp, iTmp
Dim I&, J&, N&, U&, lRow&
Dim Ses$
On Error Resume Next
Application.ScreenUpdating = False
With ActiveSheet 'если нужные данные на каком-то конкретном листе, а не на Активном,
'то замените на такую строку:
'With Worksheets("Имя_нужного_листа")
arr = .Range("A2:F" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
For I = LBound(arr) To UBound(arr)
iKey = arr(I, 1)
If arr(I, 2) >= 80000 And arr(I, 2) <= 190000 Then
Ses = "Дневная": N = 2
Else
Ses = "Вечерняя": N = 8
End If
If dic.Exists(iKey) Then
arrTmp = dic(iKey)
If N = 2 Then
U = UBound(arrTmp, 2) + 1
ReDim Preserve arrTmp(1 To 13, 1 To U)
Else
If U = UBound(arrTmp, 2) Then U = 0
U = U + 1
End If
arrTmp(N, U) = Ses
For J = 2 To 6
N = N + 1
arrTmp(N, U) = arr(I, J)
Next
dic(iKey) = arrTmp
Else
ReDim arrTmp(1 To 13, 1 To 1)
arrTmp(1, 1) = arr(I, 1)
arrTmp(N, 1) = Ses
For J = 2 To 6
N = N + 1
arrTmp(N, 1) = arr(I, J)
Next
dic.Add iKey, arrTmp
End If
Next
ReDim arrItog(1 To dic.Count, 1 To 15): I = 0: N = 0: J = 0
For Each iKey In dic.keys
I = I + 1
iTmp = ArrResize(dic(iKey), 1)(0)
arrItog(I, 1) = CDate(Format(iTmp, "@@@@/@@/@@")) 'Дата
'-----------------------------------------------------------------------------------------------------
arrItog(I, 2) = arrTmp(2, 1) 'Сессия 'Дневная'
iTmp = Application.Min(ArrResize(dic(iKey), 3))
If iTmp <> 0 Then
arrItog(I, 3) = CDate(Format(iTmp, IIf(iTmp < 100000, "@:@@:@@", "@@:@@:@@"))) 'Время открытия сессии
End If
iTmp = Application.Max(ArrResize(dic(iKey), 3))
If iTmp <> 0 Then
arrItog(I, 4) = CDate(Format(iTmp, IIf(iTmp < 100000, "@:@@:@@", "@@:@@:@@"))) 'Время закрытия сессии
End If
arrItog(I, 5) = ArrResize(dic(iKey), 4)(0) 'Открытие
arrItog(I, 6) = Application.Max(ArrResize(dic(iKey), 5)) 'Максимальное <HIGH>
arrItog(I, 7) = Application.Min(ArrResize(dic(iKey), 6)) 'Минимальное <LOW>
iTmp = ArrResize(dic(iKey), 7)
arrItog(I, 8) = iTmp(UBound(iTmp)) 'Закрытие
'-----------------------------------------------------------------------------------------------------
arrItog(I, 9) = arrTmp(8, 1) 'Сессия 'Вечерняя'
iTmp = Application.Min(ArrResize(dic(iKey), 9))
If iTmp <> 0 Then
arrItog(I, 10) = CDate(Format(iTmp, IIf(iTmp < 100000, "@:@@:@@", "@@:@@:@@"))) 'Время открытия сессии
End If
iTmp = Application.Max(ArrResize(dic(iKey), 9))
If iTmp <> 0 Then
arrItog(I, 11) = CDate(Format(iTmp, IIf(iTmp < 100000, "@:@@:@@", "@@:@@:@@"))) 'Время закрытия сессии
End If
arrItog(I, 12) = ArrResize(dic(iKey), 10)(0) 'Открытие
arrItog(I, 13) = Application.Max(ArrResize(dic(iKey), 11)) 'Максимальное <HIGH>
arrItog(I, 14) = Application.Min(ArrResize(dic(iKey), 12)) 'Минимальное <LOW>
iTmp = ArrResize(dic(iKey), 13)
arrItog(I, 15) = iTmp(UBound(iTmp)) 'Закрытие
Next
With Worksheets("Макрос") ''Макрос' - это имя листа, куда выгружаются итоговые данные
lRow = .Cells(.Rows.Count, "A").End(xlUp).Row
lRow = IIf(lRow < 2, 2, lRow)
.Range("A2:O" & lRow).ClearContents
.Range("A2").Resize(I, 15) = arrItog 'выгружаем результат в ячейку 'A2'
.Activate
End With
ActiveWindow.DisplayZeros = False
Application.ScreenUpdating = True
MsgBox "Done!"
End Sub
Private Function ArrResize(iArr, U&)
Dim I&, N&
Dim outArr()
ReDim outArr(0)
For I = LBound(iArr, 2) To UBound(iArr, 2)
If Not IsEmpty(iArr(U, I)) Then
ReDim Preserve outArr(N)
outArr(N) = iArr(U, I)
N = N + 1
End If
Next
ArrResize = outArr
End Function
|