Public Sub GPE()
Application.ScreenUpdating = False
Dim TenKH As Object, TenHH As Object, sArr(), dArr(), i As Long, k As Long, t As Variant
Dim TemKH As String, TemHH As String, Cll As Range, Ngay1 As Long, Ngay2 As Long, C As Long
Set TenKH = CreateObject("Scripting.Dictionary")
Set TenHH = CreateObject("Scripting.Dictionary")
On Error Resume Next
t = Timer
With Sheets("data")
sArr = .Range(.[A3], .[A65000].End(xlUp)).Resize(, 9).Value
End With
With Sheets("TK THEO NGAY")
C = .[IV5].End(xlToLeft).Column
Ngay1 = .[H2].Value: Ngay2 = .[J2].Value
ReDim dArr(1 To UBound(sArr, 1), 1 To C - 1)
For Each Cll In .[C5].Resize(, C)
If Not TenHH.Exists(UCase(Cll.Value)) Then TenHH.Add UCase(Cll.Value), Cll.Column - 1
Next
For i = 1 To UBound(sArr, 1)
If sArr(i, 1) >= Ngay1 And sArr(i, 1) <= Ngay2 Then
TemKH = UCase(sArr(i, 5)): TemHH = UCase(sArr(i, 6))
If Not TenKH.Exists(TemKH) Then
k = k + 1
TenKH.Add TemKH, k
dArr(k, 1) = sArr(i, 5)
If TenHH.Exists(TemHH) Then dArr(k, TenHH.Item(TemHH)) = sArr(i, 9)
Else
If TenHH.Exists(TemHH) Then dArr(TenKH.Item(TemKH), TenHH.Item(TemHH)) = dArr(TenKH.Item(TemKH), TenHH.Item(TemHH)) + sArr(i, 9)
End If
End If
Next i
.[B6:B65000].Resize(, C).ClearContents
.[B6].Resize(k, C - 1).Value = dArr
.[B6].Resize(k, C - 1).Sort Key1:=.[B6]
End With
Set TenKH = Nothing
Set TenHH = Nothing
Application.ScreenUpdating = True
MsgBox Timer - t
End Sub