Public Sub Baocaobang2()
Dim Dic As Object, sArr(), TypeArr(), dArr(), ResA(), ResH()
Dim Key As String, TypeStr As String
Dim i As Long, ik As Long, k1 As Long, k2 As Long, sRow As Long, Col As Byte
Const strA = "A"
Const strH = "H"
Const strO = "Other"
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Data")
sRow = .Range("A" & Rows.Count).End(xlUp).Row ' dòng cuoi
If sRow < 3 Then MsgBox ("Khong co du lieu"): Exit Sub 'kiem tra du lieu
sArr = .Range("B4:E" & sRow).Value 'mang du lieu nguon
End With
sRow = UBound(sArr, 1)
ReDim ResA(1 To sRow, 1 To 5)
ReDim ResH(1 To sRow, 1 To 5)
For i = 1 To sRow
'set Type A
Key = sArr(i, 1) & "#" & strA
If Not Dic.exists(Key) Then
k1 = k1 + 1 'dong ket qua
If k1 = 1 Then
ResA(1, 2) = strA: ResA(1, 3) = strA
ResA(1, 4) = strO: ResA(1, 5) = strO
k1 = k1 + 1 'dong ket qua
End If
Dic.Add Key, k1
ResA(k1, 1) = sArr(i, 1)
End If
ik = Dic.Item(Key) 'dong ket qua
If UCase(sArr(i, 3)) = strA Then Col = 2 Else Col = 4 'tinh cot
ResA(ik, Col) = ResA(ik, Col) + 1 'Count
ResA(ik, Col + 1) = ResA(ik, Col + 1) + sArr(i, 4) 'Sum
ResA(sRow, Col) = ResA(sRow, Col) + 1 'Tong Count
ResA(sRow, Col + 1) = ResA(sRow, Col + 1) + sArr(i, 4) 'Tong Sum
'set Type H
Key = sArr(i, 1) & "#" & strH
If Not Dic.exists(Key) Then
k2 = k2 + 1 'dong ket qua
If k2 = 1 Then
ResH(1, 2) = strH: ResH(1, 3) = strH
ResH(1, 4) = strO: ResH(1, 5) = strO
k2 = k2 + 1 'dong ket qua
End If
Dic.Add Key, k2
ResH(k2, 1) = sArr(i, 1)
End If
ik = Dic.Item(Key) 'dong ket qua
If UCase(sArr(i, 3)) = strH Then Col = 2 Else Col = 4 'tinh cot
ResH(ik, Col) = ResH(ik, Col) + 1 'Count
ResH(ik, Col + 1) = ResH(ik, Col + 1) + sArr(i, 4) 'Sum
ResH(sRow, Col) = ResH(sRow, Col) + 1 'Tong Count
ResH(sRow, Col + 1) = ResH(sRow, Col + 1) + sArr(i, 4) 'Tong Sum
Next i
k1 = k1 + 1: ResA(k1, 1) = "Tong cong" 'dòng Tong cong Type A
k2 = k2 + 1: ResH(k2, 1) = "Tong cong" 'dòng Tong cong Type H
For Col = 2 To 5
If ResA(sRow, Col) > 0 Then ResA(k1, Col) = ResA(sRow, Col) 'dòng Tong cong Type A
If ResH(sRow, Col) > 0 Then ResH(k2, Col) = ResH(sRow, Col) 'dòng Tong cong Type A
Next Col
With Sheets("BC")
sRow = .Range("A" & Rows.Count).End(xlUp).Row ' dòng cuoi
If sRow > 13 Then .Range("A14:E" & sRow).Clear 'Xoa ket qua truoc
.Range("A14:E14").Resize(k1) = ResA
sRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 ' dòng sau dong cuoi
.Range("A" & sRow).Resize(k2, 5) = ResH
sRow = .Range("A" & Rows.Count).End(xlUp).Row ' dòng cuoi
.Range("A14:E" & sRow).Borders.LineStyle = 1
End With
Set Dic = Nothing
End Sub