Chạy thử file đính kèm.À em đã hiểu, như vậy đây là phương pháp dàn đều cho tất cả các ngày, như vậy nó lẻ là đúng rồi, một ý tưởng cũng khá hay, cũng có lúc em sẽ cần đến phương án dàn kiểu này.
Nếu dàn đều thì bác có theo phương án chặn theo max không, nếu chặn được max hoặc min nữa thì cũng sẽ hay đấy.
Max đã kiểm tra theo tiêu chuẩn, min có lẽ bạn chủ động kiểm tra xem sao
Mã:
Option Explicit
Sub abc_()
Dim Nguon
Dim canTren, ct
Dim Tong0, Tong1
Dim Spb, Sodu
Dim Kq
Dim rws, cls
Dim Dic As Object
Dim i, j, k
With Sheet3
rws = .Range("C" & Rows.Count).End(xlUp).Row
Nguon = .Range("A3:W" & rws)
rws = UBound(Nguon)
cls = UBound(Nguon, 2)
End With
canTren = Sheet2.Range("B3", Sheet2.Range("C3").End(xlDown))
ReDim Kq(1 To rws, 1 To cls - 6)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(canTren)
Dic(canTren(i, 1)) = canTren(i, 2)
Next i
For i = 1 To rws - 1 Step 2
ct = Dic(Nguon(i, 2))
Tong0 = Nguon(i, 5)
Tong1 = Tong0 + Nguon(i, 6)
Sodu = 0
For j = 7 To cls
Kq(i, j - 6) = Nguon(i, j)
Spb = Nguon(i, j) * Tong1 \ Tong0
If Spb > ct Then
Kq(i + 1, j - 6) = ct
Else
Kq(i + 1, j - 6) = Spb
End If
Sodu = Sodu + Kq(i + 1, j - 6)
Next j
Sodu = Tong1 - Sodu
k = 0
Do While Sodu > 0
j = k Mod UBound(Kq, 2) + 1
k = k + 1
If Kq(i + 1, j) + 1 < ct Then
Kq(i + 1, j) = Kq(i + 1, j) + 1
Sodu = Sodu - 1
End If
Loop
Next i
Sheet3.Range("G3").Resize(UBound(Kq), UBound(Kq, 2)) = Kq
Set Dic = Nothing
End Sub