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
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 ::?>>
Ừ thì tưng bừng!

PHP:
Sub PhanBo_UuTien_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, dblRemain As Double, dblThayDoi 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
        
        dblRemain = arrPhanBo(r, 1)
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
        
        For c = 1 To lngCol
            If dblRemain > 0 Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblRemain + arrDuLieu(r, c)
                Else
                    dblThayDoi = dblRemain + 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 = 0
                    End If
                End If
            Else
                arrDuLieu(r + 1, c) = arrDuLieu(r, c)
            End If
        Next
    Next
    
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
 
Ừ thì tưng bừng!

PHP:
Sub PhanBo_UuTien_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, dblRemain As Double, dblThayDoi 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
       
        dblRemain = arrPhanBo(r, 1)
        dblSoMax = rngTieuChuan.Find(arrCode(r, 1), , xlValues, xlWhole).Offset(, 1).Value
       
        For c = 1 To lngCol
            If dblRemain > 0 Then
                If c = lngCol Then
                    arrDuLieu(r + 1, c) = dblRemain + arrDuLieu(r, c)
                Else
                    dblThayDoi = dblRemain + 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 = 0
                    End If
                End If
            Else
                arrDuLieu(r + 1, c) = arrDuLieu(r, c)
            End If
        Next
    Next
   
    shDuLieu.Range("G3:W" & e).Value = arrDuLieu
    shDuLieu.Range("A2:W2").AutoFilter
End Sub
Đã quá sếp ơi, code chạy lê tê quá, cảm ơn sếp nhiều:drinks:
 
Bà Tưng, bà Tân bạn hốt hết rồi, còn bà nào nữa mà không đã!
Thôi sếp đến đây đã lắm rồi, em hỏi thôi mà cũng mệt,sếp khỏe thật đấy theo lao đến cùng vẫn chưa mệt, nể sếp thật. @!>><

Bài toán khiến em cảm tưởng như lên kế hoạch sản xuất ấy với 2 kiểu chạy backwards and forwards giới hạn max giống năng suất, phân bổ là số lượng cần sản xuất thêm, có lẽ thêm mấy tiêu chí (không phân bổ vào một ngày nào đó giống như ngày nghỉ .v.v.. ) nữa thành ứng dụng lên kế hoạch sản xuất không chừng""":::":\
 
Thôi sếp đến đây đã lắm rồi, em hỏi thôi mà cũng mệt,sếp khỏe thật đấy theo lao đến cùng vẫn chưa mệt, nể sếp thật. @!>><

Bài toán khiến em cảm tưởng như lên kế hoạch sản xuất ấy với 2 kiểu chạy backwards and forwards giới hạn max giống năng suất, phân bổ là số lượng cần sản xuất thêm, có lẽ thêm mấy tiêu chí (không phân bổ vào một ngày nào đó giống như ngày nghỉ .v.v.. ) nữa thành ứng dụng lên kế hoạch sản xuất không chừng""":::":\
Cái đó bạn tự xây dựng và giải quyết, khi nào có nhu cầu hay vướng mắc gì gửi lên đây, các thành viên ở GPE này sẽ giúp cho bạn.
 
Cái đó bạn tự xây dựng và giải quyết, khi nào có nhu cầu hay vướng mắc gì gửi lên đây, các thành viên ở GPE này sẽ giúp cho bạn.
OK, cảm ơn sếp, chờ một ngày đẹp trời.. sếp ngứa rảnh dỗi qua đây gõ vai từ thì lúc đó em sẽ hỏi sếp tiếp :huglove:
Mặc dầu đã xong , nhưng cho phép em để cái hình ở đây để mai mốt sếp còn quay lại: :drive1:

1630334234990.png
 
Lần chỉnh sửa cuối:
Rồi xong, hết 2 bà Tưng, rồi bà Tân Vê-lốc, giờ chắc bạn hốt luôn bà Phương Hằng quá! Để tôi suy nghĩ đã.
Em cảm ơn sếp nhiều, thực sự khi áp dụng em thấy nó là vấn đề thực tế và đang xảy ra , mong sếp xem suy xét rồi có hướng xử lý nhanh chóng giúp em.
 
Cứ theo quy định sếp đã làm cho em, giờ thêm điều kiện không cho nó xuất hiện ở ngày nghỉ là được sếp ạ.. như vậy số còn dư sẽ theo quy tắc cũ cộng dồn hết vào ngày cuối sếp ạ.
Ý là cái số có của nó có đem xuống hàng dưới hay không?
 
Sếp ơi số liệu vẫn điền hết xuống dòng dưới sếp ạ, dòng trên là dòng ban đầu nên vẫn giữ nguyên (không thay đổi) sếp ạ.
Có nghĩa là bê nguyên xuống và không cộng thêm số lượng phân bổ?
 
Có cái có có cái không thì làm sao? Nếu có thì sao? Nếu không thì sao?

View attachment 265894
Ảnh này của Sếp dòng trên có thì kệ dòng trên đi sếp (không thay đổi), dòng dưới tương ứng ngày nghỉ này sẽ không có sếp ạ, nó sẽ phân bổ tiếp.
kết quả làm sao tổng dòng trên = tổng dòng dưới + số phân bổ

Có nghĩa là bê nguyên xuống và không cộng thêm số lượng phân bổ?
Không phải vậy sếp, vẫn cộng theo theo cách cũ, chỉ là ở dòng dưới không hiển thị (vì nó là ngày nghỉ) nó sẽ phân bổ sang các ngày không phải ngày nghỉ và phần dư sẽ dồn về cuối,nếu các ngày khác đều là max không phân bổ được nữa thì các dòng ngày nghỉ có số sẽ đưa hết về cuối sếp ạ.
 
Lần chỉnh sửa cuối:
Ảnh này của Sếp dòng trên có thì kệ dòng trên đi sếp (không thay đổi), dòng dưới sẽ không có sếp ạ.
Không phải vậy sếp, vẫn cộng theo theo cách cũ, chỉ là ở dòng dưới không hiển thị (vì nó là ngày nghỉ) nó sẽ phân bổ sang các ngày không phải ngày nghỉ và phần dư sẽ dồn về cuối,nếu các ngày khác đều là max không phân bổ được nữa thì các dòng ngày nghỉ có số sẽ đưa hết về cuối sếp ạ.
Không hiểu tôi hỏi gì hay sao trời? Thí dụ phân bổ là 10, dòng trên là 69 thì dòng dưới nếu không phải lễ thì 69+10=79 còn nếu có lễ thì bằng bao nhiêu? 0 hay 69 hay là 79?
 
Không hiểu tôi hỏi gì hay sao trời? Thí dụ phân bổ là 10, dòng trên là 69 thì dòng dưới nếu không phải lễ thì 69+10=79 còn nếu có lễ thì bằng bao nhiêu? 0 hay 69 hay là 79?
Sorry sếp, em hơi chậm hiểu (câu hỏi này của sếp rất cần thiết)
Nếu có lễ thì bằng 0 sếp ạ, và lúc này con số 69 của dòng 1 sẽ cộng cùng vào 10 = 79 (nhưng con số 10 sẽ phân bổ trước rồi mới đến 69, bởi 10 có thể nó còn phân bổ vào n1,n2,n3, còn 69 thì từ sau ngày bắt đầu làm việc nó mới cộn tiếp vào phần dư của số 10) để phân bổ vào những tiếp theo (sau ngày nghỉ ) sếp ạ ví dụ số 69 đang ở cột N4 (ngày nghỉ và n5 cũng nghỉ, thì số 69 này sẽ phân bổ vào ngày n6 trở đi nếu nó thỏa mãn điều kiện đã làm ) , bởi vì ứng với cột ngày nghỉ ở dưới 69 đã không đưa xuống rồi sếp.
 
Lần chỉnh sửa cuối:
Sorry sếp, em hơi chậm hiểu (câu hỏi này của sếp rất cần thiết)
Nếu có lễ thì bằng 0 sếp ạ, và lúc này con số 69 của dòng 1 sẽ cộng cùng vào 10 = 79 (nhưng con số 10 sẽ phân bổ trước rồi mới đến 69, bởi 10 có thể nó còn phân bổ vào n1,n2,n3, còn 69 thì từ sau ngày bắt đầu làm việc nó mới cộn tiếp vào phần dư của số 10) để phân bổ vào những tiếp theo (sau ngày nghỉ ) sếp ạ ví dụ số 69 đang ở cột N4 (ngày nghỉ và n5 cũng nghỉ, thì số 69 này sẽ phân bổ vào ngày n6 trở đi nếu nó thỏa mãn điều kiện đã làm ) , bởi vì ứng với cột ngày nghỉ ở dưới 69 đã không đưa xuống rồi sếp.
Sếp ơi hay sếp cứ cộng tất số lượng ngày nghỉ vào số phân bổ rồi thực hiện phân bổ cho đỡ rắc rối sếp ạ.Ví dụ sếp cộng 69 của ngày nghỉ vào 10 số phân bổ như vậy tổng phân bổ sẽ bằng 79
Rồi thực hiện phân bổ ko đưa vào ngày nghỉ.

Còn nếu phân bổ 10 sau đó mới đến 69 sẽ rắc rối hơn mà số liệu cũng chỉ là dự báo cho tương lai và vẫn sẽ tiếp tục điều chỉnh theo thực tế nên ko đến mức phải nghiêm ngặt về quy tắc sếp ạ.
 
Web KT
Back
Top Bottom