Sub XYZ()
Dim sArr(), Arr(), aSize(), tArr(), Res(), Dic As Object, iKey$
Dim sRow&, sCol&, scolSize&, maxSize&
Dim fR&, i&, j&, iR&, n&, k&
Dim tmp, tDH$, soDH$, iCode$, TT#, TT2#
Set Dic = CreateObject("scripting.dictionary")
With Sheets("PKL")
For j = 10 To 100
If .Cells(7, j) = "PRS" Then sCol = j: Exit For
Next j
sArr = .Range("A7", .Cells(.Range("D" & Rows.Count).End(xlUp).Row, sCol)).Value
End With
sRow = UBound(sArr)
scolSize = sCol - 3 'So cot mang Size
ReDim aSize(1 To 1, 6 To scolSize)
ReDim tArr(1 To 4)
ReDim Arr(1 To 100, 1 To 2)
Arr = Array(Arr, Arr, tArr, aSize)
For i = 2 To sRow
tmp = sArr(i, 1)
If InStr(1, tmp, ")/") > 0 Then
soDH = Trim(Split(Split(tmp, "(")(1), ")")(0))
iCode = Trim(Split(tmp, ":")(1))
If Dic.exists(soDH) = False Then
k = k + 1
Dic.Add soDH, k
ReDim Preserve Res(1 To k)
Res(k) = Arr
Res(k)(2)(3) = soDH '(3) So Don Hang
For j = 6 To scolSize
Res(k)(3)(1, j) = sArr(i - 1, j)
If sArr(i - 1, j) <> Empty Then
If maxSize < j - 5 Then maxSize = j - 5
End If
Next j
End If
ElseIf tmp <> Empty And IsNumeric(tmp) Then
n = Dic.Item(soDH)
iKey = soDH & "|" & iCode & "|" & sArr(i, 4)
If Dic.exists(iKey) = False Then
iR = Res(n)(2)(4) + 1 '(4) So dong ket qua
Res(n)(2)(4) = iR
Dic.Add iKey, iR
Res(n)(0)(iR, 1) = iCode: Res(n)(0)(iR, 2) = sArr(i, 4)
End If
iR = Dic.Item(iKey)
Res(n)(1)(iR, 1) = Res(n)(1)(iR, 1) + sArr(i, 28) 'so Doi
Res(n)(1)(iR, 2) = Res(n)(1)(iR, 2) + sArr(i, 27) 'so Thung
Res(n)(2)(1) = Res(n)(2)(1) + sArr(i, 28) 'Tong so Doi
Res(n)(2)(2) = Res(n)(2)(1) + sArr(i, 27) 'Tong so Thung
TT = TT + sArr(i, 28): TT2 = TT2 + sArr(i, 27)
End If
Next i
Application.ScreenUpdating = False
fR = 1
With Sheets("BienBan")
i = .Range("A" & Rows.Count).End(xlUp).Row
If i > 1 Then .Range("A2:Z" & i).Clear
If maxSize < 11 Then maxSize = 11
For n = 1 To k
sRow = Res(n)(2)(4)
.Range("I1:J1").Copy .Range("I" & fR) 'Tieu de va So Don Hang"
.Range("J" & fR) = Res(n)(2)(3) 'so Don Hang
.Range("A" & fR + 1) = "STYLECODE"
.Range("B" & fR + 1) = "COLOR"
.Range("A" & fR + 1).Offset(, maxSize + 2) = "PRS"
.Range("B" & fR + 1).Offset(, maxSize + 2) = "Carton"
.Range("C" & fR + 1).Resize(, maxSize) = Res(n)(3)
.Range("A" & fR + 2).Resize(sRow, 2) = Res(n)(0)
.Range("A" & fR + 2).Offset(, maxSize + 2).Resize(sRow, 2) = Res(n)(1)
.Range("A" & fR + sRow + 2) = "Total"
.Range("A" & fR + sRow + 2).Offset(, maxSize + 2) = Res(n)(2)(1)
.Range("B" & fR + sRow + 2).Offset(, maxSize + 2) = Res(n)(2)(2)
.Range("A" & fR + sRow + 2).Resize(, maxSize + 2).Merge
.Range("A" & fR + sRow + 2).Resize(, maxSize + 2).HorizontalAlignment = xlCenter
.Range("A" & fR + 1).Resize(sRow + 2, maxSize + 4).Borders.LineStyle = 1
fR = fR + sRow + 3
Next n
.Range("A" & fR) = "Grand Total"
.Range("A" & fR).Offset(, maxSize + 2) = TT
.Range("B" & fR).Offset(, maxSize + 2) = TT2
.Range("A" & fR).Resize(, maxSize + 2).Merge
.Range("A" & fR).Resize(, maxSize + 2).HorizontalAlignment = xlCenter
.Range("A" & fR).Resize(, maxSize + 4).Borders.LineStyle = 1
End With
Application.ScreenUpdating = True
End Sub