Sub XYZ()
Dim dic As Object, sh As Worksheet, aInve(), aScan(), res()
Dim srI&, srD&, i&, k&, Q#, dau&
Const kho$ = "*KHO_004*"
Set sh = ThisWorkbook.ActiveSheet
aInve = sh.Range("A3:E6").Value
aScan = sh.Range("G3:O29").Value
srI = UBound(aInve, 1): srD = UBound(aScan, 1)
ReDim res(1 To srI + srD * 2, 1 To 8)
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To srI
If aInve(i, 2) Like kho Then
Call AddRes(dic, res, k, Array(aInve(i, 1), aInve(i, 3), aInve(i, 2)), aInve(i, 4), 5, 1, 1)
End If
Next i
For i = 1 To srD
If aScan(i, 4) Like kho Then
If aScan(i, 1) = "OUT" Then
Call AddRes(dic, res, k, Array(aScan(i, 2), aScan(i, 7), aScan(i, 4)), aScan(i, 8), 7, 1, -1)
ElseIf aScan(i, 1) = "IN" Then
Call AddRes(dic, res, k, Array(aScan(i, 2), aScan(i, 7), aScan(i, 4)), aScan(i, 8), 6, 1, 1)
Else
Call AddRes(dic, res, k, Array(aScan(i, 2), aScan(i, 7), aScan(i, 4)), aScan(i, 8), 6, 0, -1)
Call AddRes(dic, res, k, Array(aScan(i, 2), aScan(i, 7), aScan(i, 4)), aScan(i, 8), 7, 1, 0)
End If
ElseIf aScan(i, 3) Like kho Then
Call AddRes(dic, res, k, Array(aScan(i, 2), aScan(i, 7), aScan(i, 3)), aScan(i, 8), 6, 1, 1)
End If
Next i
sh.Range("P13:W1000").Resize(k, 8).ClearContents
sh.Range("P13").Resize(k, 8) = res
End Sub
Private Sub AddRes(dic, res, k, ByVal arr, ByVal Q#, ByVal c&, ByVal dau&, ByVal DauTong&)
Dim key$, ik&
key = Join(arr, "|")
If dic.exists(key) = False Then
k = k + 1
dic.Add key, k
res(k, 1) = k
res(k, 2) = arr(0)
res(k, 3) = arr(1)
res(k, 4) = arr(2)
End If
ik = dic(key)
res(ik, c) = res(ik, c) + Q * dau
res(ik, 8) = res(ik, 8) + Q * DauTong
End Sub