Chia số lượng các cỡ theo điều kiện để đóng thùng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoangquyenbong

Thành viên thường trực
Tham gia
13/7/18
Bài viết
212
Được thích
41
Em chào các thành viên của diễn đàn ạ !
Em có 1 file excel xin nhờ cả nhà viết giúp em câu lệnh VBA để em có thể làm nhanh hơn ạ.
Chi tiết cụ thể em đã ghi trong file đính kèm.
Rất mong nhận được sự giúp đỡ của các bác, các anh, các chị ạ !
Em xin cảm ơn !
 

File đính kèm

Em chào các thành viên của diễn đàn ạ !
Em có 1 file excel xin nhờ cả nhà viết giúp em câu lệnh VBA để em có thể làm nhanh hơn ạ.
Chi tiết cụ thể em đã ghi trong file đính kèm.
Rất mong nhận được sự giúp đỡ của các bác, các anh, các chị ạ !
Em xin cảm ơn !
WoW... càng đọc càng không ... hiểu....
 
Upvote 0
WoW... càng đọc càng không ... hiểu....
Cảm ơn bạn đã xem bài,
Cũng hơi khó hiểu thật khi nhìn vào, nhưng giải thích đơn giản thì ví dụ như cùng màu 01( cột B) sẽ có nhiều cỡ từ 0M1 đến 0M7 ( cột A). Khi cột E có giá trị thì mình sẽ bắt đầu chia cho từng R001,R002,... với mỗi cỡ thì chỉ được lấy 1 giá trị <=5 và tổng các cỡ <=12( ô D3). Khi R001 thỏa mãn mà cột E vẫn còn số dư thì mình lại chia tiếp với quy luật chia như ở R001 cho đến khi tổng các R của cỡ đó bằng giá trị ở cột E. ( Mình có để 1 cột phụ là cột F để kiểm tra kết quả).
Đặc biệt chú ý là mỗi R001, R002,... phải có ít nhất 2 cỡ.
 
Upvote 0
Cảm ơn bạn đã xem bài,
Cũng hơi khó hiểu thật khi nhìn vào, nhưng giải thích đơn giản thì ví dụ như cùng màu 01( cột B) sẽ có nhiều cỡ từ 0M1 đến 0M7 ( cột A). Khi cột E có giá trị thì mình sẽ bắt đầu chia cho từng R001,R002,... với mỗi cỡ thì chỉ được lấy 1 giá trị <=5 và tổng các cỡ <=12( ô D3). Khi R001 thỏa mãn mà cột E vẫn còn số dư thì mình lại chia tiếp với quy luật chia như ở R001 cho đến khi tổng các R của cỡ đó bằng giá trị ở cột E. ( Mình có để 1 cột phụ là cột F để kiểm tra kết quả).
Đặc biệt chú ý là mỗi R001, R002,... phải có ít nhất 2 cỡ.
không không và không... hiểu...
bạn cho từng cái hình, mỗi cái hình là một bước chọn con số nào đó và trên hình giải thích tại sao chọn con số này....
chứ bạn cho ra một đống số (từ cộ G tới cột V) thì ai mà biết ????
 
Upvote 0
không không và không... hiểu...
bạn cho từng cái hình, mỗi cái hình là một bước chọn con số nào đó và trên hình giải thích tại sao chọn con số này....
chứ bạn cho ra một đống số (từ cộ G tới cột V) thì ai mà biết ????
Nội dung trình bày như vậy là khá dễ hiểu (tuy vẫn đánh rơi một vài nhịp :D ), nhưng mà với trình độ code gà của mình thì cảm nhận không đủ để giải bài toán này. Đã vào và âm thầm đi ra không nói gì =))
 
Upvote 0
không không và không... hiểu...
bạn cho từng cái hình, mỗi cái hình là một bước chọn con số nào đó và trên hình giải thích tại sao chọn con số này....
chứ bạn cho ra một đống số (từ cộ G tới cột V) thì ai mà biết ????
Cảm ơn bạn !
Mình ví dụ tại ô G5 ( tên tương ứng là R001) mình đang chọn kết quả là 5 (Vì tại ô E5 có giá trị và giá trị = 6). G5 =5 thỏa mãn điều kiện <=5. Vậy ô E6 vẫn còn dư 1 và lượng này chuyển sang H5(R002).
- R001 vẫn chưa đủ điều kiện là có ít nhất 2 cỡ nên mình phải chọn G6=5. Tương tự như trên mình còn dư 4, chuyển qua R002.
- R001 vẫn có thể thêm giá trị để thỏa mãn điều kiện <=12( ô D3) nên mình lấy tiếp G7=2.
Những R002, R003,... tương tự như R001.
Mình giải thích cũng không tệ lắm mà.
 
Upvote 0
Cảm ơn bạn !
Mình ví dụ tại ô G5 ( tên tương ứng là R001) mình đang chọn kết quả là 5 (Vì tại ô E5 có giá trị và giá trị = 6). G5 =5 thỏa mãn điều kiện <=5. Vậy ô E6 vẫn còn dư 1 và lượng này chuyển sang H5(R002).
- R001 vẫn chưa đủ điều kiện là có ít nhất 2 cỡ nên mình phải chọn G6=5. Tương tự như trên mình còn dư 4, chuyển qua R002.
- R001 vẫn có thể thêm giá trị để thỏa mãn điều kiện <=12( ô D3) nên mình lấy tiếp G7=2.
Những R002, R003,... tương tự như R001.
Mình giải thích cũng không tệ lắm mà.
Mà cho mình hỏi, sao không mặc định cột đầu là 5 luôn đi (nếu cột E>5) thừa thiếu tính vào cột sau? mà phải ngẫu nhiên như vậy?
 
Upvote 0
Nội dung trình bày như vậy là khá dễ hiểu (tuy vẫn đánh rơi một vài nhịp :D ), nhưng mà với trình độ code gà của mình thì cảm nhận không đủ để giải bài toán này. Đã vào và âm thầm đi ra không nói gì =))
Cảm ơn bạn !
Bạn đã vào và ra đi có thông báo mà !
Thường thì gà sẽ không nhận mình là gà.
Bạn viết giúp mình nhé !
Bài đã được tự động gộp:

Mà cho mình hỏi, sao không mặc định cột đầu là 5 luôn đi (nếu cột E>5) thừa thiếu tính vào cột sau? mà phải ngẫu nhiên như vậy?
Mình chưa hiểu câu hỏi của bạn.
ý bạn đang hỏi là dữ liệu ở cột E hay cột G ?
Nếu là cột E thì nó sẽ có giá trị từ 0 cho đến < ô D3. dữ liệu là ngẫu nhiên.
Nếu là cột G trở đi thì sẽ lấy theo điều kiện như mình đã nói. <=5.
Mình cảm ơn !
 
Upvote 0
Cảm ơn bạn !
Mình ví dụ tại ô G5 ( tên tương ứng là R001) mình đang chọn kết quả là 5 (Vì tại ô E5 có giá trị và giá trị = 6). G5 =5 thỏa mãn điều kiện <=5. Vậy ô E6 vẫn còn dư 1 và lượng này chuyển sang H5(R002).
- R001 vẫn chưa đủ điều kiện là có ít nhất 2 cỡ nên mình phải chọn G6=5. Tương tự như trên mình còn dư 4, chuyển qua R002.
- R001 vẫn có thể thêm giá trị để thỏa mãn điều kiện <=12( ô D3) nên mình lấy tiếp G7=2.
Những R002, R003,... tương tự như R001.
Mình giải thích cũng không tệ lắm mà.
theo cái hình mình gởi có phải là ý bạn không???
1597134459588.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn làm chuẩn chi tiết luôn !
Đúng ý mình là như vậy.
Cảm ơn bạn đã dành thời gian giúp mình !
Cái này hay hay, mình làm vậy cho các bạn khác dễ hiễu và giúp bạn...
Mình cố gắng code cho bạn ... không biết được không nha... vì mình không được thông minh cho lắm.
Ah.. cho hỏi 1 chi tiết nữa là "mỗi một màu thì có đúng 7 cỡ thôi" phải không???
 
Upvote 0
Cái này hay hay, mình làm vậy cho các bạn khác dễ hiễu và giúp bạn...
Mình cố gắng code cho bạn ... không biết được không nha... vì mình không được thông minh cho lắm.
Ah.. cho hỏi 1 chi tiết nữa là "mỗi một màu thì có đúng 7 cỡ thôi" phải không???
Cảm ơn bạn nhiều !
Mình không biết thông minh hay không nhưng viết được code là cũng không phải dạng vừa rồi !
Số lượng cỡ có thể thay đổi nhưng tối đa là 7 cỡ bạn ạ.
 
Upvote 0
Giả sử màu 01 chỉ có cỡ 0M7 dư 11 cái, các cỡ khác không dư thì thớt chia như thế nào để thỏa điều kiện có ít nhất 2 cỡ cùng có giá trị trong R00
 
Upvote 0
Giả sử màu 01 chỉ có cỡ 0M7 dư 11 cái, các cỡ khác không dư thì thớt chia như thế nào để thỏa điều kiện có ít nhất 2 cỡ cùng có giá trị trong R00
Dạ em cảm ơn vì đã xem bài !
Dạ với trường hợp này thì những cỡ trước đó của R00 trước nó sẽ để tổng của 1 R00<12 để tất cả các R00 thỏa mãn điều kiện có số lượng của 1 cỡ <=5 và có đủ 2 cỡ trở lên ạ.
 
Upvote 0
Dạ em cảm ơn vì đã xem bài !
Dạ với trường hợp này thì những cỡ trước đó của R00 trước nó sẽ để tổng của 1 R00<12 để tất cả các R00 thỏa mãn điều kiện có số lượng của 1 cỡ <=5 và có đủ 2 cỡ trở lên ạ.
Tôi giả sử các cỡ khác không dư thì làm gì có R00 trước đó.
 
Upvote 0
Dạ nếu gặp trường hợp đặc biệt như vậy thì đành phải bỏ lại thôi ạ. không thỏa mãn các điều kiện ạ.
Tôi làm rõ các vấn đề để các bạn khác có bắt tay vào làm thì lưu ý thôi. Bài này không đơn giản kể cả khi dùng VBA.
 
Upvote 0
Tôi làm rõ các vấn đề để các bạn khác có bắt tay vào làm thì lưu ý thôi. Bài này không đơn giản kể cả khi dùng VBA.
Dạ, em cũng nghĩ giống thầy ạ...
Có những trường hợp "không thể và có thể" xẩy ra nhiều mà mình không lường trước được...
Nghĩ giải thuật chưa ra ... hazzz
 
Upvote 0
Tôi nghĩ xử lý điều kiện ít nhất 2 cỡ như thế này
- Tạo mảng kết quả cho từng màu đảm bảo thỏa các điều kiện khác (bỏ qua điều kiện ít nhất 2 cỡ)
- Xét dòng cuối có dư, nếu R00 chỉ có 1 cỡ thì
+ Kiểm tra lại các dòng trên, dòng nào có số >1 ở mảng kết quả thì giảm 1, mang qua R00 đang xét
+ Nếu còn R00 có 1 cỡ mà không còn dòng có số >1 thì lại kiểm tra các dòng trên, dòng nào có số =1 và R00 của nó có 3 cỡ thì giảm 1, mang qua R00 đang xét
+ Nếu vẫn còn R00 có 1 cỡ thì chấp nhận không thỏa điều kiện
- Lặp lại với màu khác
 
Upvote 0
Em chào các thành viên của diễn đàn ạ !
Em có 1 file excel xin nhờ cả nhà viết giúp em câu lệnh VBA để em có thể làm nhanh hơn ạ.
Chi tiết cụ thể em đã ghi trong file đính kèm.
Rất mong nhận được sự giúp đỡ của các bác, các anh, các chị ạ !
Em xin cảm ơn !
Mình đã làm cho bạn.
Mình nghiệm ra rằng: vì xếp vào thùng 1 cỡ tối đa là 5 và thùng được xếp tối đa là 12 nên chắc chắn khi xếp đầy thùng thì phải có ít nhất 2 cỡ ( dĩ nhiên là trùng màu) trở lên !!! nên bài toán lại đơn giản hóa đi!
Bạn coi file nha.
Mình không giới hạn cột kết quả, không giới hạn dòng dữ liệu, không cố định mỗi một loại màu có mấy cỡ hết!
trải nghiện thử nha... """:::":\
 

File đính kèm

Upvote 0
Đề bạn phức tạp quá, mình chỉ làm được tới đây. Còn thiếu điều kiện có ít nhất 2 cỡ có cùng giá trị trong mỗi R00.
Bạn xem thử:
 

File đính kèm

Upvote 0
Đề bạn phức tạp quá, mình chỉ làm được tới đây. Còn thiếu điều kiện có ít nhất 2 cỡ có cùng giá trị trong mỗi R00.
Bạn xem thử:
Wow... Công thức...
Mình phải xách cặp học bạn thôi...
Hic... công thức mình tệ lắm!!!
 
Upvote 0
Mình đã làm cho bạn.
Mình nghiệm ra rằng: vì xếp vào thùng 1 cỡ tối đa là 5 và thùng được xếp tối đa là 12 nên chắc chắn khi xếp đầy thùng thì phải có ít nhất 2 cỡ ( dĩ nhiên là trùng màu) trở lên !!! nên bài toán lại đơn giản hóa đi!
Bạn coi file nha.
Mình không giới hạn cột kết quả, không giới hạn dòng dữ liệu, không cố định mỗi một loại màu có mấy cỡ hết!
trải nghiện thử nha... """:::":\
Cảm ơn bạn !
Sáng giờ thỉnh thoảng mình lại vào diễn đàn mong thông báo. Số liệu chạy ok nhưng còn 1 chỗ bạn chỉnh giúp mình được không. Ví dụ như thùng R011 và thùng R016, nó đang chỉ còn có 1 cỡ. nếu như vậy thì mình sẽ không thể đóng được. Bạn có thể bớt số lượng của thùng trước nó là R010 và R015 ( chỉ cần 1 chiếc của cỡ khác) cũng được chuyển qua 2 thùng R011 và R016 để được đóng hết thùng.
Một lần nữa cảm ơn bạn đã nhiệt tình giúp mình !
 
Upvote 0
Cảm ơn bạn !
Sáng giờ thỉnh thoảng mình lại vào diễn đàn mong thông báo. Số liệu chạy ok nhưng còn 1 chỗ bạn chỉnh giúp mình được không. Ví dụ như thùng R011 và thùng R016, nó đang chỉ còn có 1 cỡ. nếu như vậy thì mình sẽ không thể đóng được. Bạn có thể bớt số lượng của thùng trước nó là R010 và R015 ( chỉ cần 1 chiếc của cỡ khác) cũng được chuyển qua 2 thùng R011 và R016 để được đóng hết thùng.
Một lần nữa cảm ơn bạn đã nhiệt tình giúp mình !

Tôi đã làm theo lời bạn nói mà...

Dạ nếu gặp trường hợp đặc biệt như vậy thì đành phải bỏ lại thôi ạ. không thỏa mãn các điều kiện ạ.
 
Upvote 0
Đề bạn phức tạp quá, mình chỉ làm được tới đây. Còn thiếu điều kiện có ít nhất 2 cỡ có cùng giá trị trong mỗi R00.
Bạn xem thử:
Cảm ơn bạn nhiều !
Bạn cũng siêu thật !
Chỉ còn mắc ở R011 và R016 để cho R011 và R016 có thể đủ điều kiện để đóng thùng.
Bài đã được tự động gộp:

Tôi đã làm theo lời bạn nói mà...
Kết quả như file bạn cho đối với mình là quá tuyệt rồi ! nhưng nếu chuẩn để hàng được đóng hết thì thùng R010 cỡ 0M7 mình sẽ chỉ lấy 2 và chừa lại 1 cho thùng R011 ( thay vì cho 3 vào R010)
Còn như ví dụ bác @huuthang_bd hỏi thì phải bỏ lại thật. Kiểu bác giả sử cột F chỉ có 1 cỡ duy nhất của màu đó có dư thôi ý.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu thêm điều kiện tối ưu để số lượng thùng là thấp nhất thì khó hơn nữa.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = i - 1 To lFr Step -1
                    If aResult(n, m) > 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, m) > 1 Or lTmp > 2 Then
                            aResult(n, m) = aResult(n, m) - 1
                            aResult(n, lRi) = 1
                            If aResult(n, m) = 0 Then aResult(n, m) = Empty
                            GoTo Check_k
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub
 
Upvote 0
Nếu thêm điều kiện tối ưu để số lượng thùng là thấp nhất thì khó hơn nữa.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = i - 1 To lFr Step -1
                    If aResult(n, m) > 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, m) > 1 Or lTmp > 2 Then
                            aResult(n, m) = aResult(n, m) - 1
                            aResult(n, lRi) = 1
                            If aResult(n, m) = 0 Then aResult(n, m) = Empty
                            GoTo Check_k
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub
Dạ cảm ơn bác nhiều ạ !
Code này đã khắc phục được thùng R016 nhưng thùng R011 kết quả dư cuối đang chưa đúng ạ. Màu 03 cỡ 0M6 vẫn đang còn tồn dư 2 chiêc ở cột F ạ.
 
Upvote 0
Dạ cảm ơn bác nhiều ạ !
Code này đã khắc phục được thùng R016 nhưng thùng R011 kết quả dư cuối đang chưa đúng ạ. Màu 03 cỡ 0M6 vẫn đang còn tồn dư 2 chiêc ở cột F ạ.
Có chút nhầm lẫn, bạn thử lại với code này.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        lTo = i
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = lTo To lFr Step -1
                    If aResult(n, m) > 0 And aResult(n, lRi) = 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, m) > 1 Or lTmp > 2 Then
                            aResult(n, m) = aResult(n, m) - 1
                            aResult(n, lRi) = 1
                            If aResult(n, m) = 0 Then aResult(n, m) = Empty
                            GoTo Check_k
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub
 
Upvote 0
Có chút nhầm lẫn, bạn thử lại với code này.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        lTo = i
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = lTo To lFr Step -1
                    If aResult(n, m) > 0 And aResult(n, lRi) = 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, m) > 1 Or lTmp > 2 Then
                            aResult(n, m) = aResult(n, m) - 1
                            aResult(n, lRi) = 1
                            If aResult(n, m) = 0 Then aResult(n, m) = Empty
                            GoTo Check_k
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub
Dạ cảm ơn bác ạ !
Kết quả chuẩn rồi ạ.
Cuối cùng bác vẫn phải xuất chiêu mặc dù bác đã từ chối ạ.
 
Upvote 0
Cảm ơn bạn !
Sáng giờ thỉnh thoảng mình lại vào diễn đàn mong thông báo. Số liệu chạy ok nhưng còn 1 chỗ bạn chỉnh giúp mình được không. Ví dụ như thùng R011 và thùng R016, nó đang chỉ còn có 1 cỡ. nếu như vậy thì mình sẽ không thể đóng được. Bạn có thể bớt số lượng của thùng trước nó là R010 và R015 ( chỉ cần 1 chiếc của cỡ khác) cũng được chuyển qua 2 thùng R011 và R016 để được đóng hết thùng.
Một lần nữa cảm ơn bạn đã nhiệt tình giúp mình !
vậy thì thử cái này nè....
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
@thnghiachau : Tôi sử dụng mảng còn bạn đọc ghi dữ liệu trực tiếp thì chậm hơn là phải rồi.
--
Sửa lại code một chút cho chặt chẽ hơn.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        lTo = i
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = lTo To lFr Step -1
                    If aResult(n, m) > 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, lRi) = 0 Then
                            If aResult(n, m) > 1 Or lTmp > 2 Then
                                aResult(n, m) = aResult(n, m) - 1
                                aResult(n, lRi) = 1
                                If aResult(n, m) = 0 Then aResult(n, m) = Empty
                                GoTo Check_k
                            End If
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub
 
Upvote 0
@thnghiachau : Tôi sử dụng mảng còn bạn đọc ghi dữ liệu trực tiếp thì chậm hơn là phải rồi.
--
Sửa lại code một chút cho chặt chẽ hơn.
Mã:
Sub GPE()
Dim Sh As Worksheet, lMaxQ As Long, aData As Variant, aResult() As Variant, i As Long, m As Long, n As Long, k As Long, lTmp As Long
Dim lRi As Long, lQr As Long, lZr As Long, lFr As Long, lTo As Long
Set Sh = ActiveSheet
Sh.Range("G4").Resize(1000, 1000).ClearContents
lMaxQ = Sh.Range("D3").Value
aData = Sh.Range("B4:E" & Sh.Cells(&H100000, 1).End(xlUp).Row)
ReDim aResult(1 To UBound(aData, 1) - 1, 1 To 1)
lRi = 1: lFr = 1
For i = 1 To UBound(aData, 1) - 1
    If aData(i, 4) > 0 Then
        If lZr = lMaxQ Then
            lRi = lRi + 1: lQr = 0: lZr = 0
            ReDim Preserve aResult(1 To UBound(aResult, 1), 1 To lRi)
            If k > 0 Then
                i = k - 1: k = 0
                GoTo Next_i
            End If
        End If
        lTmp = aData(i, 4)
        If lTmp > (lMaxQ - lZr) Then lTmp = (lMaxQ - lZr)
        If lTmp > 5 Then lTmp = 5
        aResult(i, lRi) = lTmp: aData(i, 4) = aData(i, 4) - lTmp: lQr = lQr + 1: lZr = lZr + lTmp
        If aData(i, 4) > 0 And k = 0 Then k = i
    End If
    If aData(i + 1, 1) <> aData(i, 1) Then
        lTo = i
        If lQr = 1 Then
            For m = lRi - 1 To 1 Step -1
                lTmp = 0
                For n = lTo To lFr Step -1
                    If aResult(n, m) > 0 Then
                        lTmp = lTmp + 1
                        If aResult(n, lRi) = 0 Then
                            If aResult(n, m) > 1 Or lTmp > 2 Then
                                aResult(n, m) = aResult(n, m) - 1
                                aResult(n, lRi) = 1
                                If aResult(n, m) = 0 Then aResult(n, m) = Empty
                                GoTo Check_k
                            End If
                        End If
                    End If
                Next
            Next
        End If
Check_k:
        lZr = lMaxQ
        If k > 0 Then
            i = k - 1: k = 0
        Else
            lFr = i + 1
        End If
    End If
Next_i:
Next
Sh.Range("G4").Resize(UBound(aResult, 1), lRi).Value = aResult
End Sub

Thầy @huuthang_bd ơi, Code thầy hay quá, ngắn gọn, chạy nhanh siêu tốc
Em ngưỡng mộ và học thầy hoài mà chưa áp dụng được... hic...
------
Đúng là của thầy toàn xử lý trên mảng, còn em vừa làm vừa ghi nên chạy chậm hơn nhiều...
 
Upvote 0
Cảm ơn bạn !
Bản này chạy chuẩn, đẹp luôn rồi. Nhưng nếu mình muốn thay đổi số ở ô D3 thì sum của mỗi R00 nó sẽ là <=ô D3 chứ không phải <=12.
Code của bác @huuthang_bd đang chạy như vậy.
Vậy thì cái này...
Hic mới đầu bạn hổng nói là cái này thay đổi nên tui để cho nó là const luôn ah...
 

File đính kèm

Upvote 0
Vậy thì cái này...
Hic mới đầu bạn hổng nói là cái này thay đổi nên tui để cho nó là const luôn ah...
Hihi lần này thì hết " nhưng " nữa rồi bạn nhé ! Tại mình quên không để ý cái ghi chú bạn ghi ở trên, xin lỗi bạn vì sự sơ ý này !
Cảm ơn vì sự nhiệt tình của bạn và mọi người !
Xin chân thành cảm ơn ạ !
 
Upvote 0
@thnghiachau : Tôi sử dụng mảng còn bạn đọc ghi dữ liệu trực tiếp thì chậm hơn là phải rồi.
--
Thầy @huuthang_bd ơi...
Em mạng phép học lóm chút code của thầy để chuyển cái code mà em làm trực tiếp trên Sheet thành sử dụng mảng ...
Cơ bản em vẫn dùng code của em chỉ thay mấy chỗ trực tiếp trên Sheet thì dùng mảng mà thôi!!!
Ôi... chạy siêu nhanh rùi thầy ơi...
Cám ơn code của thầy nhiều!
 

File đính kèm

Upvote 0
Hihi lần này thì hết " nhưng " nữa rồi bạn nhé ! Tại mình quên không để ý cái ghi chú bạn ghi ở trên, xin lỗi bạn vì sự sơ ý này !
Cảm ơn vì sự nhiệt tình của bạn và mọi người !
Xin chân thành cảm ơn ạ !
Bạn chắc là hết nhưng chưa :D
--
@thnghiachau :
Giả sử màu 01 chỉ có cỡ 0M7 dư 11 cái, các cỡ khác không dư thì thớt chia như thế nào để thỏa điều kiện có ít nhất 2 cỡ cùng có giá trị trong R00
Trường hợp này xảy ra ở màu đầu tiên thì kết quả sai đối với code nhập trực tiếp trên sheet và lỗi đối với code dùng mảng của bạn.
Trường hợp 1 thùng chứa được 8 sp, trong một mã màu có 6 cỡ đầu mỗi cỡ dư 1 SP, cỡ cuối dư hơn 2 SP thì kết quả chưa đạt yêu cầu.
 
Upvote 0
Bạn chắc là hết nhưng chưa :D
--
@thnghiachau :

Trường hợp này xảy ra ở màu đầu tiên thì kết quả sai đối với code nhập trực tiếp trên sheet và lỗi đối với code dùng mảng của bạn.
Trường hợp 1 thùng chứa được 8 sp, trong một mã màu có 6 cỡ đầu mỗi cỡ dư 1 SP, cỡ cuối dư hơn 2 SP thì kết quả chưa đạt yêu cầu.
Dạ. Mai em sẽ kiểm tra lại ạ.
 
Upvote 0
Bạn chắc là hết nhưng chưa :D
--
@thnghiachau :

Trường hợp này xảy ra ở màu đầu tiên thì kết quả sai đối với code nhập trực tiếp trên sheet và lỗi đối với code dùng mảng của bạn.
Trường hợp 1 thùng chứa được 8 sp, trong một mã màu có 6 cỡ đầu mỗi cỡ dư 1 SP, cỡ cuối dư hơn 2 SP thì kết quả chưa đạt yêu cầu.
Chúc bác và toàn thể diễn đàn ngày mới nhiều niềm vui !
Dạ đúng là như bác nói ạ, Vì hiện tại dữ liệu tại ô D3 của em số sẽ thay đổi có thể là 12, 18 ,24 hoặc là 36 thôi ạ. Nên với code này vẫn chuẩn ạ.
Em cảm ơn !
 
Upvote 0
Bạn kiểm tra trường hợp bài #15 chưa?
Hoặc trường hợp này: Số lượng dư của 7 cỡ trong 1 màu lần lượt như sau: 1, 1, 6, 0, 0, 0, 0.
Nói chung phải đọc hiểu code thì mới biết nó sai chỗ nào chứ bạn chạy thử thì nhất thời khó mà thấy lỗ hổng của code.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chắc là hết nhưng chưa :D
--
@thnghiachau :

Trường hợp này xảy ra ở màu đầu tiên thì kết quả sai đối với code nhập trực tiếp trên sheet và lỗi đối với code dùng mảng của bạn.
Trường hợp 1 thùng chứa được 8 sp, trong một mã màu có 6 cỡ đầu mỗi cỡ dư 1 SP, cỡ cuối dư hơn 2 SP thì kết quả chưa đạt yêu cầu.
Cám ơn thấy đã chỉ điểm... Đúng là bị lỗi và sai ngay cái chỗ thấy nói luôn! Bái phục....
Em đã làm lại như file.
 

File đính kèm

Upvote 0
Bạn kiểm tra trường hợp bài #15 chưa?
Hoặc trường hợp này: Số lượng dư của 7 cỡ trong 1 màu lần lượt như sau: 1, 1, 6, 0, 0, 0, 0.
Nói chung phải đọc hiểu code thì mới biết nó sai chỗ nào chứ bạn chạy thử thì nhất thời khó mà thấy lỗ hổng của code.
Dạ em chỉ biết kiểm tra bằng cách chạy thử thôi ạ, gặp kết quả sai thì mới biết là chưa ổn thôi ạ. còn hiểu code thì em cũng muốn lắm mà nhìn vào cứ như kiểu xem tranh trìu tượng vậy bác ơi.
Cảm ơn bác rất nhiều ạ !
Bài đã được tự động gộp:

Cám ơn thấy đã chỉ điểm... Đúng là bị lỗi và sai ngay cái chỗ thấy nói luôn! Bái phục....
Em đã làm lại như file.
Bạn cũng siêu thật chứ !
Cảm ơn bạn đã dành thời gian giúp mình !
 
Upvote 0
Upvote 0

Bài viết mới nhất

Back
Top Bottom