Dim aCH(), aTT(), sArr(), aRow(), Res() As String, Res2()
Dim mSP$, Tong#
Dim sRow&, N&, N2&, k&, i&, r&, q&, j&
Sub Main()
Dim Dic As Object
Dim fRow&, eRow&, fRow2&, sCol&, ik&
Const rMax As String = 10000 'So dong ket qua toi da 10.000 dong
ReDim Res(1 To rMax, 1 To 3)
ReDim Res2(1 To rMax, 1 To 1)
Set Dic = CreateObject("scripting.dictionary")
ReDim aRow(1 To 1000, 1 To 4)
N = 0: N2 = 0: k = 0
Application.ScreenUpdating = False
With Sheets("THUA_THIEU")
eRow = .Range("A" & Rows.Count).End(xlUp).Row
sCol = .Cells(1, 16000).End(xlToLeft).Column
.Range("A4", .Cells(eRow, sCol)).Sort .[B4], 1, .[c4], , 1, Header:=xlNo
aCH = .Range("A4:C" & eRow).Value
For i = 4 To eRow
Dic.Add .Range("A" & i).Text, i - 3
If .Range("B" & i) <> .Range("B" & i - 1) Then
fRow = i - 3: N = N + 1
fRow2 = i - 3: N2 = N2 + 1
ElseIf .Range("C" & i) <> .Range("C" & i - 1) Then
fRow2 = i - 3: N2 = N2 + 1
End If
If .Range("B" & i) <> .Range("B" & i + 1) Then
aRow(N, 1) = fRow: aRow(N, 2) = i - 3
Dic.Add .Range("B" & i), N
aRow(N2, 3) = fRow2: aRow(N2, 4) = i - 3
Dic.Add .Range("B" & i) & .Range("C" & i), N2
ElseIf .Range("C" & i) <> .Range("C" & i + 1) Then
aRow(N2, 3) = fRow2: aRow(N2, 4) = i - 3
Dic.Add .Range("B" & i) & .Range("C" & i), N2
End If
Next i
sRow = UBound(aCH)
For j = 4 To sCol Step 2
mSP = .Cells(1, j).Value
aTT = .Cells(4, j).Resize(sRow, 2).Value
Tong = 0
Call KhuVuc_Cum
If Tong > 0 Then Call KhuVuc
If Tong > 0 Then Call TatCa
ReDim aTT(1 To sRow, 1 To 2)
For i = 1 To sRow
ik = Dic.Item(sArr(i, 1))
aTT(ik, 1) = sArr(i, 4)
aTT(ik, 2) = sArr(i, 5)
Next i
.Cells(4, j).Resize(sRow, 2) = aTT 'Gan ket qua
Next j
End With
With Sheets("DIEU_CHUYEN") 'Gan ket qua
.Range("F2").Resize(sRow, 5).Clear
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 1 Then .Range("A2:D" & eRow).ClearContents
If k Then
.Range("A2:C2").Resize(k) = Res
.Range("D2").Resize(k) = Res2
MsgBox ("Done!")
Else
MsgBox ("Khong co San Pham dieu chuyen!")
End If
End With
Application.ScreenUpdating = True
End Sub
Private Sub KhuVuc_Cum()
Dim fRow&, eRow&
With Sheets("DIEU_CHUYEN")
.Range("F2").Resize(sRow).NumberFormat = "@"
.Range("F2").Resize(sRow, 3) = aCH
.Range("I2").Resize(sRow, 2) = aTT
.Range("F2:J2").Resize(sRow).Sort .[I2], 2, .[J2], , 2, Header:=xlNo
.Range("F2:J2").Resize(sRow).Sort .[G2], 1, .[H2], , 1, Header:=xlNo
sArr = .Range("F2").Resize(sRow, 5).Value
End With
For q = 1 To N2
fRow = aRow(q, 3): eRow = aRow(q, 4)
Call Trung(fRow, eRow, True)
Call KhongTrung(fRow, eRow)
Next q
End Sub
Private Sub KhuVuc()
Dim fRow&, eRow&
With Sheets("DIEU_CHUYEN")
.Range("F2").Resize(sRow, 5) = sArr
.Range("F2:J2").Resize(sRow).Sort .[G2], 1, .[I2], , 2, .[J2], 2, Header:=xlNo
sArr = .Range("F2").Resize(sRow, 5).Value
End With
For q = 1 To N
fRow = aRow(q, 1): eRow = aRow(q, 2)
Call Trung(fRow, eRow, False)
Call KhongTrung(fRow, eRow)
Next q
End Sub
Private Sub TatCa()
Dim fRow&, eRow&
With Sheets("DIEU_CHUYEN")
.Range("F2").Resize(sRow, 5) = sArr
.Range("F2:J2").Resize(sRow).Sort .[I2], 2, .[J2], , 2, Header:=xlNo
sArr = .Range("F2").Resize(sRow, 5).Value
End With
For q = 1 To N
fRow = 1: eRow = sRow
Call Trung(fRow, eRow, False)
Call KhongTrung(fRow, eRow)
Next q
End Sub
Private Sub Trung(ByRef fRow, ByRef eRow, ByVal bTong As Boolean)
Dim fRow2&
fRow2 = fRow
For i = fRow To eRow
If bTong Then Tong = Tong + sArr(i, 5)
If sArr(i, 4) > 0 Then
For r = fRow2 To eRow
If sArr(r, 5) > 0 Then
If sArr(i, 4) = sArr(r, 5) Then
k = k + 1
Res(k, 1) = mSP: Res(k, 2) = sArr(i, 1)
Res(k, 3) = sArr(r, 1): Res2(k, 1) = sArr(i, 4)
sArr(i, 4) = 0: sArr(r, 5) = 0
If bTong Then Tong = Tong - sArr(r, 5)
fRow2 = r + 1
Exit For
End If
End If
Next r
End If
Next i
End Sub
Private Sub KhongTrung(ByRef fRow, ByRef eRow)
Dim fRow2&
fRow2 = fRow
For i = fRow To eRow
If sArr(i, 4) > 0 Then
For r = fRow2 To eRow
If sArr(r, 5) > 0 Then
k = k + 1
Res(k, 1) = mSP: Res(k, 2) = sArr(i, 1): Res(k, 3) = sArr(r, 1)
If sArr(i, 4) > sArr(r, 5) Then
Res2(k, 1) = sArr(r, 5)
sArr(i, 4) = sArr(i, 4) - sArr(r, 5)
Tong = Tong - sArr(r, 5)
sArr(r, 5) = 0
Else
Res2(k, 1) = sArr(i, 4)
sArr(r, 5) = sArr(r, 5) - sArr(i, 4)
Tong = Tong - sArr(i, 4)
sArr(i, 4) = 0
fRow2 = r: Exit For
End If
End If
Next r
End If
Next i
End Sub