Nhờ giúp đỡ code phân bổ số lượng theo không vượt quá con số cho trước?

Liên hệ QC
À 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.
Chạy thử file đính kèm.
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
 

File đính kèm

  • PhanBo_nhieu (1).xlsm
    263.4 KB · Đọc: 5
Em hiểu chỗ này vậy sếp đừng format là được , cứ để nguyên bản lẻ.. khi cần dùng số em có thể balance rồi làm tròn cũng được sếp ạ, đoạn này gần bờ nên sếp cứ để em tự bơi.
Bạn phân bổ dàn đều theo thủ tục dưới đây! Đảm bảo chuẩn kèo!

PHP:
Option Explicit

Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
    
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
    
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
    
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
    
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
    
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
    
    For r = 1 To lngRow Step 2
        
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
            
            dblThayDoi = dblTemp + arrDuLieu(r, c)
            
            If dblThayDoi > dblSoMax Then
                arrDuLieu(r + 1, c) = dblSoMax
                dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
            
            Cols = lngCol - c
            Select Case Cols
            Case 1 To 6
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case 7
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
    
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
 

File đính kèm

  • PhanBo_Nhieu_DanDeu-HTN.xlsm
    142.5 KB · Đọc: 5
Bạn phân bổ dàn đều theo thủ tục dưới đây! Đảm bảo chuẩn kèo!

PHP:
Option Explicit

Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
 
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
 
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
 
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
 
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
 
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
 
    For r = 1 To lngRow Step 2
    
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
        
            dblThayDoi = dblTemp + arrDuLieu(r, c)
        
            If dblThayDoi > dblSoMax Then
                arrDuLieu(r + 1, c) = dblSoMax
                dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
        
            Cols = lngCol - c
            Select Case Cols
            Case 1 To 6
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case 7
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
 
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
Sếp ơi, chuẩn 90% , còn 10% số dư chưa phân bổ hết phải cộng hết vào cuối nữa sếp:
1630308043453.png

Chạy thử file đính kèm.
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
Cảm ơn bác tương tự trường hợp trên,nếu em thử con số phân bổ cho tất cả các số nếu còn số dư thì quay tít bác nhỉ, có cho nó cộng hết vào số cuối rồi thoát vòng lặp được không bác.
 
Lần chỉnh sửa cuối:
Sếp ơi, chuẩn 90% , còn 10% số dư chưa phân bổ hết phải cộng hết vào cuối nữa sếp:
View attachment 265069


Cảm ơn bác tương tự trường hợp trên,nếu em thử con số phân bổ cho tất cả các số nếu còn số dư thì quay tít bác nhỉ, có cho nó cộng hết vào số cuối rồi thoát vòng lặp được không bác.
Ah, tôi quên vụ cột nó có 17 mà tôi lại cho nó là 7 bạn thử sửa lại cái này nha. Thử chạy lại có đúng không!

PHP:
Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
    
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
    
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
    
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
    
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
    
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
    
    For r = 1 To lngRow Step 2
        
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
            
            dblThayDoi = dblTemp + arrDuLieu(r, c)
            
            If dblThayDoi > dblSoMax Then
                arrDuLieu(r + 1, c) = dblSoMax
                dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
            
            Cols = lngCol - c
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
    
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub


Chỉ thay thế ở chỗ Select Case thôi!

Mã:
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
 
Sếp ơi, chuẩn 90% , còn 10% số dư chưa phân bổ hết phải cộng hết vào cuối nữa sếp:
View attachment 265069


Cảm ơn bác tương tự trường hợp trên,nếu em thử con số phân bổ cho tất cả các số nếu còn số dư thì quay tít bác nhỉ, có cho nó cộng hết vào số cuối rồi thoát vòng lặp được không bác.
Bạn đưa file thử quay tít lên cho cụ thể nhé
 
Dùng công thức được hôn?

G4 =ROUND((G3/$E3)*($E3+$F3),0)
Công thức này của bác không thấy bắt theo giới hạn max nhỉ? với lại bài này em muốn dùng code bác à, cảm ơn bác.
Ah, tôi quên vụ cột nó có 17 mà tôi lại cho nó là 7 bạn thử sửa lại cái này nha. Thử chạy lại có đúng không!

PHP:
Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
 
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
 
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
 
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
 
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
 
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
 
    For r = 1 To lngRow Step 2
     
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
         
            dblThayDoi = dblTemp + arrDuLieu(r, c)
         
            If dblThayDoi > dblSoMax Then
                arrDuLieu(r + 1, c) = dblSoMax
                dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
         
            Cols = lngCol - c
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
 
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub


Chỉ thay thế ở chỗ Select Case thôi!

Mã:
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
Sêp ơi, code trên W6 vẫn ra = 1710 nếu F5= 1000000 ===\.

Bạn đưa file thử quay tít lên cho cụ thể nhé
Sorry bác em gửi file, bác check giúp em.
Ah, tôi quên vụ cột nó có 17 mà tôi lại cho nó là 7 bạn thử sửa lại cái này nha. Thử chạy lại có đúng không!

PHP:
Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
  
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
  
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
  
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
  
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
  
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
  
    For r = 1 To lngRow Step 2
      
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
          
            dblThayDoi = dblTemp + arrDuLieu(r, c)
          
            If dblThayDoi > dblSoMax Then
                arrDuLieu(r + 1, c) = dblSoMax
                dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
          
            Cols = lngCol - c
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
  
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub


Chỉ thay thế ở chỗ Select Case thôi!

Mã:
            Select Case Cols
            Case 1 To lngCol - 1
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol
                dblTemp = dblSoPhanBo - dblRemain
            End Select
Em gửi sếp file test , sếp xem giúp em nhé
 

File đính kèm

  • PhanBo_nhieu (CQ).xlsm
    262 KB · Đọc: 4
  • PhanBo_Nhieu_DanDeu-HTN.xlsm
    165.1 KB · Đọc: 6
Lần chỉnh sửa cuối:
Sêp ơi, code trên W6 vẫn ra = 1710 nếu F5= 1000000 ===\.
Bạn thay thủ tục cũ bằng thủ tục dưới đây! Phải test như thế mới ra kết quả đúng. Bạn test tiếp đi.

PHP:
Option Explicit

Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
    
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
    
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
    
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
    
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
    
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
    
    For r = 1 To lngRow Step 2
        
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
            
            dblThayDoi = dblTemp + arrDuLieu(r, c)
            
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblTemp + arrDuLieu(r, c)
                Else
                    arrDuLieu(r + 1, c) = dblSoMax
                    dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
                End If
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
            
            Cols = lngCol - c
            Select Case Cols
            Case 1 To lngCol - 2
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol - 1
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
    
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
 
Bạn thay thủ tục cũ bằng thủ tục dưới đây! Phải test như thế mới ra kết quả đúng. Bạn test tiếp đi.

PHP:
Option Explicit

Sub PhanBo_DanDeu_HTN()
    Dim rngTieuChuan As Range
    Dim c As Byte, Cols As Byte
    Dim arrPhanBo, arrDuLieu, arrCode
    Dim shDuLieu As Worksheet, shTieuChuan As Worksheet
    Dim e As Long, r As Long, lngCol As Long, lngRow As Long
    Dim dblSoMax As Double, dblSoPhanBo As Double, dblThayDoi As Double, dblTemp As Double, dblRemain As Double, dblTotal As Double
   
    Set shDuLieu = Sheets("DU_LIEU")
    Set shTieuChuan = Sheets("TIEU_CHUAN")
   
    shDuLieu.AutoFilterMode = False
    shTieuChuan.AutoFilterMode = False
   
    e = shTieuChuan.Range("B" & Rows.Count).End(xlUp).Row
    Set rngTieuChuan = shTieuChuan.Range("B3:B" & e)
   
    e = shDuLieu.Range("B" & Rows.Count).End(xlUp).Row + 1
    arrPhanBo = shDuLieu.Range("F3:F" & e).Value
    arrDuLieu = shDuLieu.Range("G3:W" & e).Value
    arrCode = shDuLieu.Range("B3:B" & e).Value
   
    lngRow = UBound(arrDuLieu, 1)
    lngCol = UBound(arrDuLieu, 2)
   
    For r = 1 To lngRow Step 2
       
        dblSoPhanBo = arrPhanBo(r, 1)
        dblRemain = dblSoPhanBo
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        dblTemp = Round(dblSoPhanBo / lngCol)
        dblTotal = dblTemp
        For c = 1 To lngCol
           
            dblThayDoi = dblTemp + arrDuLieu(r, c)
           
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblTemp + arrDuLieu(r, c)
                Else
                    arrDuLieu(r + 1, c) = dblSoMax
                    dblRemain = dblRemain - (dblSoMax - arrDuLieu(r, c))
                End If
            Else
                arrDuLieu(r + 1, c) = dblThayDoi
                dblRemain = dblRemain - dblTemp
            End If
           
            Cols = lngCol - c
            Select Case Cols
            Case 1 To lngCol - 2
                dblTemp = Round(dblRemain / Cols)
                dblTotal = dblTotal + dblTemp
            Case lngCol - 1
                dblTemp = dblSoPhanBo - dblRemain
            End Select
        Next
    Next
   
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
Ok rồi, chắc là ngon rồi sếp ạ ,cảm ơn sếp nhiều lắm, với Sub PhanBo_UuTien_HTN làm phiền sếp có thể làm tiếp cho em nếu còn số dư nó cũng để hết vào cuối như này được không sếp?
 
Với chỗ này:

Mã:
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblTemp + arrDuLieu(r, c)
                Else

Bạn sửa lại như vầy cho nó đỡ mất thời gian tính lại một công đoạn:

Mã:
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblThayDoi
                Else

Ok rồi, chắc là ngon rồi sếp ạ ,cảm ơn sếp nhiều lắm, với Sub PhanBo_UuTien_HTN làm phiền sếp có thể làm tiếp cho em nếu còn số dư nó cũng để hết vào cuối như này được không sếp?

Trời ơi, được 2 bà Tưng rồi, lại muốn hốt luôn bà Tân V-lốc hay sao vậy trời! Để xem sao.
 
Với chỗ này:

Mã:
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblTemp + arrDuLieu(r, c)
                Else

Bạn sửa lại như vầy cho nó đỡ mất thời gian tính lại một công đoạn:

Mã:
            If dblThayDoi > dblSoMax Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblThayDoi
                Else



Trời ơi, được 2 bà Tưng rồi, lại muốn hốt luôn bà Tân V-lốc hay sao vậy trời! Để xem sao.
Thời buổi này dịch vụ phải chọn gói sếp ạ. Ủa mà sếp cũng xem "bà Tân V-lốc" ạ kakaka.
Chắc tầm này sếp cũng mệt rồi khó mà theo lao được, em không làm phiền sếp nữa, có vấn đề gì em sẽ tìm hiểu rồi xử lý tiếp.
Cảm ơn sếp nhiều nhé.
 
Thời buổi này dịch vụ phải chọn gói sếp ạ. Ủa mà sếp cũng xem "bà Tân V-lốc" ạ kakaka.
Chắc tầm này sếp cũng mệt rồi khó mà theo lao được, em không làm phiền sếp nữa, có vấn đề gì em sẽ tìm hiểu rồi xử lý tiếp.
Cảm ơn sếp nhiều nhé.
Cái Ưu tiên thì cập nhật không cần VLOOKUP và phân bổ vào cái cuối nghèo út ăn giàu út chịu phải không?
P/s: Dịch vụ trọn gói gì mà chả có ly cà phê nào hết trơn à! Qua dịch lời lãi gì tính một lần hết đó nha!
 
Cái Ưu tiên thì cập nhật không cần VLOOKUP và phân bổ vào cái cuối nghèo út ăn giàu út chịu phải không?
P/s: Dịch vụ trọn gói gì mà chả có ly cà phê nào hết trơn à! Qua dịch lời lãi gì tính một lần hết đó nha!
OK , đồng ý sếp! Hi vọng sớm qua dịch để em gặp sếp làm trận tưng bừng ::?>>
 
Công thức này của bác không thấy bắt theo giới hạn max nhỉ? với lại bài này em muốn dùng code bác à, cảm ơn bác.

Sêp ơi, code trên W6 vẫn ra = 1710 nếu F5= 1000000 ===\.


Sorry bác em gửi file, bác check giúp em.

Em gửi sếp file test , sếp xem giúp em nhé
Phân bổ cái file này xong là đi tù cả mớ, làm tới đây thôi. :cool::p:D
 

File đính kèm

  • PhanBo_nhieu (1).xlsm
    264.9 KB · Đọc: 9
Web KT
Back
Top Bottom