Sub nhaplieu()
Dim tenhang, tenkhang, NL, TH As Variant, mahang, makhang As Range, d_th, d_kh As Object, k, r, i As Long
With Sheet1
Set mahang = .Range(.[b7], .[b600000].End(3))
tenhang = mahang.Resize(, 3).Value
Set makhang = .Range(.[f6], .[f600000].End(3))
tenkhang = makhang.Resize(, 2).Value
End With
With Sheet2
NL = .[a8].Resize(.[a600000].End(3).Row - 7, 9)
End With
With Sheet3
.[a8:g500].ClearContents
.[a8].Resize(UBound(tenhang), 3) = tenhang
.[f8].Resize(UBound(tenhang)).Value = .[c8].Resize(UBound(tenhang)).Value
TH = .[a8].Resize(UBound(tenhang), 6)
End With
Set d_th = CreateObject("Scripting.Dictionary")
Set d_kh = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(NL)
If Not d_kh.EXISTS(NL(i, 3)) Then
r = Application.Match(NL(i, 3), makhang, 0)
If TypeName(r) <> "Error" Then
d_kh.Add (NL(i, 3)), r
NL(i, 4) = tenkhang(r, 2)
End If
Else
NL(i, 4) = tenkhang(d_kh.Item(NL(i, 3)), 2)
End If
If Not d_th.EXISTS(NL(i, 5)) Then
r = Application.Match(NL(i, 5), mahang, 0)
If TypeName(r) <> "Error" Then
d_th.Add (NL(i, 5)), r
NL(i, 6) = tenhang(r, 2)
TH(r, 4) = NL(i, 7)
TH(r, 5) = NL(i, 8)
TH(r, 6) = TH(r, 3) + TH(r, 4) - TH(r, 5)
End If
Else
k = d_th.Item(NL(i, 5))
NL(i, 6) = tenhang(k, 2)
TH(k, 4) = TH(k, 4) + NL(i, 7)
TH(k, 5) = TH(k, 5) + NL(i, 8)
TH(k, 6) = TH(k, 3) + TH(k, 4) - TH(k, 5)
End If
Next
With Sheet2
.[a8].Resize(.[a600000].End(3).Row - 7, 9) = NL
End With
With Sheet3
.[a8].Resize(UBound(TH), 6) = TH
End With
Set d_th = Nothing
Set d_kh = Nothing
End Sub