Ngày mai trời lại sáng
Thành viên thường trực
- Tham gia
- 4/7/21
- Bài viết
- 339
- Được thích
- 139
1 chuyến 2 loại cá tôm giới hạn số thùng như thế nào?Mình up lại bạn nào biết và có thời gian giúp mình với...
Thùng sử dụng để đóng gói cho các sản phẩm thì hiện tại cùng 1 loại (có kích thước trọng lượng giống nhau) nên số thùng 1 chuyến dựa vào số lượng thùng tối đa cho phep theo tiêu chuẩn của sản phẩm (hiện tại lấy theo mặt hàng tôm tối đa là 200 thùng) nhưng đóng mặt hàng khác như cá thì số thùng sẽ giảm vì 200 thùng thì sẽ vượt số kg cho phép của một chuyến.1 chuyến 2 loại cá tôm giới hạn số thùng như thế nào?
Có bao nhiêu loại sản phẩm?
Bạn gởi file với nhiều mặt hàng dể kiểm tra code hơnThùng sử dụng để đóng gói cho các sản phẩm thì hiện tại cùng 1 loại (có kích thước trọng lượng giống nhau) nên số thùng 1 chuyến dựa vào số lượng thùng tối đa cho phep theo tiêu chuẩn của sản phẩm (hiện tại lấy theo mặt hàng tôm tối đa là 200 thùng) nhưng đóng mặt hàng khác như cá thì số thùng sẽ giảm vì 200 thùng thì sẽ vượt số kg cho phép của một chuyến.
Có khoảng chừng hơn 20 mặt hàng 1 chút các loại nhưng em chỉ đưa ví dụ mặt hàng chính và cũng mô tả theo hướng chung cho các mặt hàng còn lại.
Cảm ơn bạn đã xem.
Em gửi thêm mặt hàng, bác xem giúp em.Bạn gởi file với nhiều mặt hàng dể kiểm tra code hơn
Bài đã được tự động gộp:
Hình như mình đã viết code dạng nầy cho bạn ở bài trước
Kiểm tra lại . .Em gửi thêm mặt hàng, bác xem giúp em.
Option Explicit
Sub XYZ()
Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6)
Dim sRow&, i&, r&, k&, s&, x&, sp$, N&
Dim hop&, tl#, tlHop#, t#, tongH#, tongT#
Const tMax# = 3600 'Gioi han tren cua Trong luong
With Sheets("Sheet1")
aDM = Range("C4", Range("G4").End(xlDown)).Value
aSL = Range("C21:F" & Range("C10000").End(xlUp).Row).Value
End With
sRow = UBound(aSL)
ReDim arr(1 To sRow, 1 To 6)
For i = 1 To sRow
sp = aSL(i, 1)
For r = 1 To UBound(aDM)
If sp = aDM(r, 1) Then
tlHop = aDM(r, 3) 'Trong luong 1 hop
hop = aDM(r, 4) 'So hop
tl = aDM(r, 5) 'Trong luong
Exit For
End If
Next r
N = Int(aSL(i, 4) / hop)
For r = 1 To N
k = k + 1: x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = sp
res(k, 3) = aSL(i, 2)
res(k, 5) = hop
aSL(i, 4) = aSL(i, 4) - hop
If aSL(i, 4) = 0 Then
res(k, 4) = aSL(i, 3)
aSL(i, 3) = 0
Else
res(k, 4) = tl
aSL(i, 3) = aSL(i, 3) - tl
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
Next r
If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac
s = s + 1
arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2)
arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4)
arr(s, 5) = tlHop
End If
Next i
If s > 0 Then 'SP du chuyen gop voi sp khac
Call SortArr(arr, s)
For i = 1 To s
If arr(i, 3) > 0 Then
k = k + 1
If t = 0 Then x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = arr(i, 1)
res(k, 3) = arr(i, 2)
If t + arr(i, 3) < tMax Then
t = t + arr(i, 3)
res(k, 4) = arr(i, 3)
res(k, 5) = arr(i, 4)
Else
res(k, 5) = Int((tMax - t) / arr(i, 5))
res(k, 4) = res(k, 5) * arr(i, 5)
arr(i, 4) = arr(i, 4) - res(k, 5)
arr(i, 3) = arr(i, 3) - res(k, 4)
t = 0
i = i - 1
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
End If
Next i
End If
With Sheets("Sheet1")
i = Range("J" & Rows.Count).End(xlUp).Row
If i > 20 Then Range("I21:N" & i).Clear
If k Then
k = k + 1
res(k, 2) = "Total"
res(k, 4) = tongT
res(k, 5) = tongH
res(k, 6) = res(k - 1, 6)
Range("I21").Resize(k, 6) = res
End If
End With
End Sub
Private Sub SortArr(arr, s)
Dim t, i&, r&, j
t = arr
arr(s, 6) = 1
For i = 1 To s - 1
arr(i, 6) = 1
For r = i + 1 To s
If arr(i, 3) > arr(r, 3) Then
arr(i, 6) = arr(i, 6) + 1
Else
arr(r, 6) = arr(r, 6) + 1
End If
Next r
Next i
For i = 1 To s
For j = 1 To 5
arr(arr(i, 6), j) = t(i, j)
Next j
Next i
End Sub
Cảm ơn bác nhiều,em đã kiểm tra code chạy đúng ý em muốn rồi.Kiểm tra lại . .
Mã:Option Explicit Sub XYZ() Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6) Dim sRow&, i&, r&, k&, s&, x&, sp$, N& Dim hop&, tl#, tlHop#, t#, tongH#, tongT# Const tMax# = 3600 'Gioi han tren cua Trong luong With Sheets("Sheet1") aDM = Range("C4", Range("G4").End(xlDown)).Value aSL = Range("C21:F" & Range("C10000").End(xlUp).Row).Value End With sRow = UBound(aSL) ReDim arr(1 To sRow, 1 To 6) For i = 1 To sRow sp = aSL(i, 1) For r = 1 To UBound(aDM) If sp = aDM(r, 1) Then tlHop = aDM(r, 3) 'Trong luong 1 hop hop = aDM(r, 4) 'So hop tl = aDM(r, 5) 'Trong luong Exit For End If Next r N = Int(aSL(i, 4) / hop) For r = 1 To N k = k + 1: x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = sp res(k, 3) = aSL(i, 2) res(k, 5) = hop aSL(i, 4) = aSL(i, 4) - hop If aSL(i, 4) = 0 Then res(k, 4) = aSL(i, 3) aSL(i, 3) = 0 Else res(k, 4) = tl aSL(i, 3) = aSL(i, 3) - tl End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) Next r If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac s = s + 1 arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2) arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4) arr(s, 5) = tlHop End If Next i If s > 0 Then 'SP du chuyen gop voi sp khac Call SortArr(arr, s) For i = 1 To s If arr(i, 3) > 0 Then k = k + 1 If t = 0 Then x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) If t + arr(i, 3) < tMax Then t = t + arr(i, 3) res(k, 4) = arr(i, 3) res(k, 5) = arr(i, 4) Else res(k, 5) = Int((tMax - t) / arr(i, 5)) res(k, 4) = res(k, 5) * arr(i, 5) arr(i, 4) = arr(i, 4) - res(k, 5) arr(i, 3) = arr(i, 3) - res(k, 4) t = 0 i = i - 1 End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) End If Next i End If With Sheets("Sheet1") i = Range("J" & Rows.Count).End(xlUp).Row If i > 20 Then Range("I21:N" & i).Clear If k Then k = k + 1 res(k, 2) = "Total" res(k, 4) = tongT res(k, 5) = tongH res(k, 6) = res(k - 1, 6) Range("I21").Resize(k, 6) = res End If End With End Sub Private Sub SortArr(arr, s) Dim t, i&, r&, j t = arr arr(s, 6) = 1 For i = 1 To s - 1 arr(i, 6) = 1 For r = i + 1 To s If arr(i, 3) > arr(r, 3) Then arr(i, 6) = arr(i, 6) + 1 Else arr(r, 6) = arr(r, 6) + 1 End If Next r Next i For i = 1 To s For j = 1 To 5 arr(arr(i, 6), j) = t(i, j) Next j Next i End Sub
Em thử dữ liệu này thì chưa đúng, bác xem giúp em với.Kiểm tra lại . .
Mã:Option Explicit Sub XYZ() Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6) Dim sRow&, i&, r&, k&, s&, x&, sp$, N& Dim hop&, tl#, tlHop#, t#, tongH#, tongT# Const tMax# = 3600 'Gioi han tren cua Trong luong With Sheets("Sheet1") aDM = Range("C4", Range("G4").End(xlDown)).Value aSL = Range("C21:F" & Range("C10000").End(xlUp).Row).Value End With sRow = UBound(aSL) ReDim arr(1 To sRow, 1 To 6) For i = 1 To sRow sp = aSL(i, 1) For r = 1 To UBound(aDM) If sp = aDM(r, 1) Then tlHop = aDM(r, 3) 'Trong luong 1 hop hop = aDM(r, 4) 'So hop tl = aDM(r, 5) 'Trong luong Exit For End If Next r N = Int(aSL(i, 4) / hop) For r = 1 To N k = k + 1: x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = sp res(k, 3) = aSL(i, 2) res(k, 5) = hop aSL(i, 4) = aSL(i, 4) - hop If aSL(i, 4) = 0 Then res(k, 4) = aSL(i, 3) aSL(i, 3) = 0 Else res(k, 4) = tl aSL(i, 3) = aSL(i, 3) - tl End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) Next r If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac s = s + 1 arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2) arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4) arr(s, 5) = tlHop End If Next i If s > 0 Then 'SP du chuyen gop voi sp khac Call SortArr(arr, s) For i = 1 To s If arr(i, 3) > 0 Then k = k + 1 If t = 0 Then x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) If t + arr(i, 3) < tMax Then t = t + arr(i, 3) res(k, 4) = arr(i, 3) res(k, 5) = arr(i, 4) Else res(k, 5) = Int((tMax - t) / arr(i, 5)) res(k, 4) = res(k, 5) * arr(i, 5) arr(i, 4) = arr(i, 4) - res(k, 5) arr(i, 3) = arr(i, 3) - res(k, 4) t = 0 i = i - 1 End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) End If Next i End If With Sheets("Sheet1") i = Range("J" & Rows.Count).End(xlUp).Row If i > 20 Then Range("I21:N" & i).Clear If k Then k = k + 1 res(k, 2) = "Total" res(k, 4) = tongT res(k, 5) = tongH res(k, 6) = res(k - 1, 6) Range("I21").Resize(k, 6) = res End If End With End Sub Private Sub SortArr(arr, s) Dim t, i&, r&, j t = arr arr(s, 6) = 1 For i = 1 To s - 1 arr(i, 6) = 1 For r = i + 1 To s If arr(i, 3) > arr(r, 3) Then arr(i, 6) = arr(i, 6) + 1 Else arr(r, 6) = arr(r, 6) + 1 End If Next r Next i For i = 1 To s For j = 1 To 5 arr(arr(i, 6), j) = t(i, j) Next j Next i End Sub
Chỉnh tí xíuCảm ơn bác nhiều,em đã kiểm tra code chạy đúng ý em muốn rồi.
Bài đã được tự động gộp:
Em thử dữ liệu này thì chưa đúng, bác xem giúp em với.
Private Sub SortArr(arr, s)
Dim t, i&, r&, j
t = arr
arr(s, 6) = 1
For i = 1 To s - 1
arr(i, 6) = arr(i, 6) + 1
For r = i + 1 To s
If arr(i, 3) > arr(r, 3) Then
arr(i, 6) = arr(i, 6) + 1
Else
arr(r, 6) = arr(r, 6) + 1
End If
Next r
Next i
For i = 1 To s
For j = 1 To 5
arr(arr(i, 6), j) = t(i, j)
Next j
Next i
End Sub
Sub XYZ()
Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6)
Dim sRow&, i&, r&, k&, s&, x&, sp$, N&
Dim hop&, tl#, tlHop#, t#, tongH#, tongT#
Const tMax# = 3600 'Gioi han tren cua Trong luong
With Sheets("Sheet1")
aDM = .Range("C4", .Range("G4").End(xlDown)).Value
aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value
End With
sRow = UBound(aSL)
ReDim arr(1 To sRow, 1 To 6)
For i = 1 To sRow
sp = aSL(i, 1)
For r = 1 To UBound(aDM)
If sp = aDM(r, 1) Then
tlHop = aDM(r, 3) 'Trong luong 1 hop
hop = aDM(r, 4) 'So hop
tl = aDM(r, 5) 'Trong luong
Exit For
End If
Next r
N = Int(aSL(i, 4) / hop)
For r = 1 To N
k = k + 1: x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = sp
res(k, 3) = aSL(i, 2)
res(k, 5) = hop
aSL(i, 4) = aSL(i, 4) - hop
If aSL(i, 4) = 0 Then
res(k, 4) = aSL(i, 3)
aSL(i, 3) = 0
Else
res(k, 4) = tl
aSL(i, 3) = aSL(i, 3) - tl
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
Next r
If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac
s = s + 1
arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2)
arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4)
arr(s, 5) = tlHop
End If
Next i
If s > 0 Then 'SP du chuyen gop voi sp khac
Call SortArr(arr, s)
For i = 1 To s
If arr(i, 3) > 0 Then
k = k + 1
If t = 0 Then x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = arr(i, 1)
res(k, 3) = arr(i, 2)
If t + arr(i, 3) < tMax Then
t = t + arr(i, 3)
res(k, 4) = arr(i, 3)
res(k, 5) = arr(i, 4)
Else
res(k, 5) = Int((tMax - t) / arr(i, 5))
res(k, 4) = res(k, 5) * arr(i, 5)
arr(i, 4) = arr(i, 4) - res(k, 5)
arr(i, 3) = arr(i, 3) - res(k, 4)
t = 0
i = i - 1
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
End If
Next i
End If
With Sheets("Sheet1")
i = .Range("J" & Rows.Count).End(xlUp).Row
If i > 20 Then .Range("I21:N" & i).Clear
If k Then
k = k + 1
res(k, 2) = "Total"
res(k, 4) = tongT
res(k, 5) = tongH
res(k, 6) = res(k - 1, 6)
.Range("I21").Resize(k, 6) = res
End If
End With
End Sub
Cảm ơn bác nhiều code chạy đúng ý em muốn rồi,như vậy đã giảm được khoảng 90% thao tác em phải làm thủ công tại bước 1, còn 10% nữa em phải tách bằng tay nhưng mà nhanh,có thể chỉnh code để chạy 1 lần ra được đến luôn bước 2 không bác.Chỉnh tí xíu
arr(i, 6) = arr(i, 6) + 1
Mã:Private Sub SortArr(arr, s) Dim t, i&, r&, j t = arr arr(s, 6) = 1 For i = 1 To s - 1 arr(i, 6) = arr(i, 6) + 1 For r = i + 1 To s If arr(i, 3) > arr(r, 3) Then arr(i, 6) = arr(i, 6) + 1 Else arr(r, 6) = arr(r, 6) + 1 End If Next r Next i For i = 1 To s For j = 1 To 5 arr(arr(i, 6), j) = t(i, j) Next j Next i End Sub
Mã:Sub XYZ() Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6) Dim sRow&, i&, r&, k&, s&, x&, sp$, N& Dim hop&, tl#, tlHop#, t#, tongH#, tongT# Const tMax# = 3600 'Gioi han tren cua Trong luong With Sheets("Sheet1") aDM = .Range("C4", .Range("G4").End(xlDown)).Value aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value End With sRow = UBound(aSL) ReDim arr(1 To sRow, 1 To 6) For i = 1 To sRow sp = aSL(i, 1) For r = 1 To UBound(aDM) If sp = aDM(r, 1) Then tlHop = aDM(r, 3) 'Trong luong 1 hop hop = aDM(r, 4) 'So hop tl = aDM(r, 5) 'Trong luong Exit For End If Next r N = Int(aSL(i, 4) / hop) For r = 1 To N k = k + 1: x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = sp res(k, 3) = aSL(i, 2) res(k, 5) = hop aSL(i, 4) = aSL(i, 4) - hop If aSL(i, 4) = 0 Then res(k, 4) = aSL(i, 3) aSL(i, 3) = 0 Else res(k, 4) = tl aSL(i, 3) = aSL(i, 3) - tl End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) Next r If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac s = s + 1 arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2) arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4) arr(s, 5) = tlHop End If Next i If s > 0 Then 'SP du chuyen gop voi sp khac Call SortArr(arr, s) For i = 1 To s If arr(i, 3) > 0 Then k = k + 1 If t = 0 Then x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) If t + arr(i, 3) < tMax Then t = t + arr(i, 3) res(k, 4) = arr(i, 3) res(k, 5) = arr(i, 4) Else res(k, 5) = Int((tMax - t) / arr(i, 5)) res(k, 4) = res(k, 5) * arr(i, 5) arr(i, 4) = arr(i, 4) - res(k, 5) arr(i, 3) = arr(i, 3) - res(k, 4) t = 0 i = i - 1 End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) End If Next i End If With Sheets("Sheet1") i = .Range("J" & Rows.Count).End(xlUp).Row If i > 20 Then .Range("I21:N" & i).Clear If k Then k = k + 1 res(k, 2) = "Total" res(k, 4) = tongT res(k, 5) = tongH res(k, 6) = res(k - 1, 6) .Range("I21").Resize(k, 6) = res End If End With End Sub
Còn vấn đề nào không ? mình sẽ viết lần cuốiCảm ơn bác nhiều code chạy đúng ý em muốn rồi,như vậy đã giảm được khoảng 90% thao tác em phải làm thủ công tại bước 1, còn 10% nữa em phải tách bằng tay nhưng mà nhanh,có thể chỉnh code để chạy 1 lần ra được đến luôn bước 2 không bác.
Không ạ, cảm ơn bạn đã dành thời gian giúp, mục đích của em vẫn là để mặt hàng cùng chủng loại vào cùng một chuyến,nếu quá tải không còn cùng được nữa mới phải để chung, bước 2 ban đầu em định viết ở bài 1 nhưng thấy hơi khó giải thích nên dừng lại ở đó, nếu tối ưu được tiếp thì bác xem giúp em.Còn vấn đề nào không ? mình sẽ viết lần cuối
Kiểm tra thêm các trường hợp khácKhông ạ, cảm ơn bạn đã dành thời gian giúp, mục đích của em vẫn là để mặt hàng cùng chủng loại vào cùng một chuyến,nếu quá tải không còn cùng được nữa mới phải để chung, bước 2 ban đầu em định viết ở bài 1 nhưng thấy hơi khó giải thích nên dừng lại ở đó, nếu tối ưu được tiếp thì bác xem giúp em.
Option Explicit
Sub XYZ()
Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6)
Dim sRow&, i&, r&, k&, ik&, j&, s&, x&, sp$, N&
Dim hop&, tl#, tlHop#, t#, tongH#, tongT#
Const tMax# = 3600 'Gioi han tren cua Trong luong
With Sheets("Sheet1")
aDM = .Range("C4", .Range("G4").End(xlDown)).Value
aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value
End With
sRow = UBound(aSL)
ReDim arr(1 To sRow, 1 To 6)
For i = 1 To sRow
sp = aSL(i, 1)
For r = 1 To UBound(aDM)
If sp = aDM(r, 1) Then
tlHop = aDM(r, 3) 'Trong luong 1 hop
hop = aDM(r, 4) 'So hop
tl = aDM(r, 5) 'Trong luong
Exit For
End If
Next r
N = Int(aSL(i, 4) / hop)
For r = 1 To N
k = k + 1: x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = sp
res(k, 3) = aSL(i, 2)
res(k, 5) = hop
aSL(i, 4) = aSL(i, 4) - hop
If aSL(i, 4) = 0 Then
res(k, 4) = aSL(i, 3)
aSL(i, 3) = 0
Else
res(k, 4) = tl
aSL(i, 3) = aSL(i, 3) - tl
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
Next r
If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac
s = s + 1
arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2)
arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4)
arr(s, 5) = tlHop
End If
Next i
If s > 0 Then 'SP du chuyen gop voi sp khac
Call SortArr(arr, s)
ik = k + 1
For i = 1 To s
If arr(i, 3) > 0 Then
k = k + 1
If t = 0 Then x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = arr(i, 1)
res(k, 3) = arr(i, 2)
If t + arr(i, 3) < tMax Then
t = t + arr(i, 3)
res(k, 4) = arr(i, 3)
res(k, 5) = arr(i, 4)
Else
res(k, 5) = Int((tMax - t) / arr(i, 5))
res(k, 4) = res(k, 5) * arr(i, 5)
arr(i, 4) = arr(i, 4) - res(k, 5)
arr(i, 3) = arr(i, 3) - res(k, 4)
t = 0
i = i - 1
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
End If
Next i
t = 0
For i = k To ik + 1 Step -1 'Dieu chinh
t = t + res(i, 4)
If res(i, 6) <> res(i - 1, 6) Then
If res(i, 2) = res(i - 1, 2) Then
If t + res(i - 1, 4) <= tMax Then
res(i, 4) = res(i, 4) + res(i - 1, 4)
res(i, 5) = res(i, 5) + res(i - 1, 5)
res(i - 1, 2) = Empty
i = i - 1
s = -1 'Có dieu chinh
End If
End If
t = 0
End If
Next i
If s = -1 Then 'Có dieu chinh
r = 0
For i = 1 To k
If res(i, 2) <> Empty Then
r = r + 1
res(r, 1) = r
For j = 2 To 6
res(r, j) = res(i, j)
Next j
End If
Next i
k = r
End If
End If
With Sheets("Sheet1")
i = .Range("J" & Rows.Count).End(xlUp).Row
If i > 20 Then .Range("I21:N" & i).Clear
If k Then
k = k + 1
res(k, 2) = "Total"
res(k, 4) = tongT
res(k, 5) = tongH
res(k, 6) = res(k - 1, 6)
.Range("I21").Resize(k, 6) = res
End If
End With
End Sub
Private Sub SortArr(arr, s)
Dim t, i&, r&, j
t = arr
arr(s, 6) = 1
For i = 1 To s - 1
arr(i, 6) = arr(i, 6) + 1
For r = i + 1 To s
If arr(i, 3) > arr(r, 3) Then
arr(i, 6) = arr(i, 6) + 1
Else
arr(r, 6) = arr(r, 6) + 1
End If
Next r
Next i
For i = 1 To s
For j = 1 To 5
arr(arr(i, 6), j) = t(i, j)
Next j
Next i
End Sub
Cảm ơn bác nhiều, em chạy thử thấy tuyệt lắm rồi, stt dòng tổng cộng muốn xóa chỉnh chỗ nào vậy bác?Kiểm tra thêm các trường hợp khác
Mã:Option Explicit Sub XYZ() Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6) Dim sRow&, i&, r&, k&, ik&, j&, s&, x&, sp$, N& Dim hop&, tl#, tlHop#, t#, tongH#, tongT# Const tMax# = 3600 'Gioi han tren cua Trong luong With Sheets("Sheet1") aDM = .Range("C4", .Range("G4").End(xlDown)).Value aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value End With sRow = UBound(aSL) ReDim arr(1 To sRow, 1 To 6) For i = 1 To sRow sp = aSL(i, 1) For r = 1 To UBound(aDM) If sp = aDM(r, 1) Then tlHop = aDM(r, 3) 'Trong luong 1 hop hop = aDM(r, 4) 'So hop tl = aDM(r, 5) 'Trong luong Exit For End If Next r N = Int(aSL(i, 4) / hop) For r = 1 To N k = k + 1: x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = sp res(k, 3) = aSL(i, 2) res(k, 5) = hop aSL(i, 4) = aSL(i, 4) - hop If aSL(i, 4) = 0 Then res(k, 4) = aSL(i, 3) aSL(i, 3) = 0 Else res(k, 4) = tl aSL(i, 3) = aSL(i, 3) - tl End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) Next r If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac s = s + 1 arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2) arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4) arr(s, 5) = tlHop End If Next i If s > 0 Then 'SP du chuyen gop voi sp khac Call SortArr(arr, s) ik = k + 1 For i = 1 To s If arr(i, 3) > 0 Then k = k + 1 If t = 0 Then x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) If t + arr(i, 3) < tMax Then t = t + arr(i, 3) res(k, 4) = arr(i, 3) res(k, 5) = arr(i, 4) Else res(k, 5) = Int((tMax - t) / arr(i, 5)) res(k, 4) = res(k, 5) * arr(i, 5) arr(i, 4) = arr(i, 4) - res(k, 5) arr(i, 3) = arr(i, 3) - res(k, 4) t = 0 i = i - 1 End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) End If Next i t = 0 For i = k To ik + 1 Step -1 'Dieu chinh t = t + res(i, 4) If res(i, 6) <> res(i - 1, 6) Then If res(i, 2) = res(i - 1, 2) Then If t + res(i - 1, 4) <= tMax Then res(i, 4) = res(i, 4) + res(i - 1, 4) res(i, 5) = res(i, 5) + res(i - 1, 5) res(i - 1, 2) = Empty i = i - 1 s = -1 'Có dieu chinh End If End If t = 0 End If Next i If s = -1 Then 'Có dieu chinh r = 0 For i = 1 To k If res(i, 2) <> Empty Then r = r + 1 res(r, 1) = r For j = 2 To 6 res(r, j) = res(i, j) Next j End If Next i k = r End If End If With Sheets("Sheet1") i = .Range("J" & Rows.Count).End(xlUp).Row If i > 20 Then .Range("I21:N" & i).Clear If k Then k = k + 1 res(k, 2) = "Total" res(k, 4) = tongT res(k, 5) = tongH res(k, 6) = res(k - 1, 6) .Range("I21").Resize(k, 6) = res End If End With End Sub Private Sub SortArr(arr, s) Dim t, i&, r&, j t = arr arr(s, 6) = 1 For i = 1 To s - 1 arr(i, 6) = arr(i, 6) + 1 For r = i + 1 To s If arr(i, 3) > arr(r, 3) Then arr(i, 6) = arr(i, 6) + 1 Else arr(r, 6) = arr(r, 6) + 1 End If Next r Next i For i = 1 To s For j = 1 To 5 arr(arr(i, 6), j) = t(i, j) Next j Next i End Sub
Thêm lệnhCảm ơn bác nhiều, em chạy thử thấy tuyệt lắm rồi, stt dòng tổng cộng muốn xóa chỉnh chỗ nào vậy bác?
If s = -1 Then 'Có dieu chinh
r = 0
For i = 1 To k
If res(i, 2) <> Empty Then
r = r + 1
res(r, 1) = r
For j = 2 To 6
res(r, j) = res(i, j)
Next j
End If
Next i
k = r
res(k, 1) = Empty
End If
Với số liệu này đang bị tách mặt hàng "Ngán" làm 2 chuyến có thể gộp lại "1-2" thành 1 chuyến và "3-4" vào 1 chuyến được không bác.Thêm lệnh
res(k, 1) = Empty
Mã:If s = -1 Then 'Có dieu chinh r = 0 For i = 1 To k If res(i, 2) <> Empty Then r = r + 1 res(r, 1) = r For j = 2 To 6 res(r, j) = res(i, j) Next j End If Next i k = r res(k, 1) = Empty End If
Chỉnh res(k, 1) = Empty thành res(k+1, 1) = EmptyVới số liệu này đang bị tách mặt hàng "Ngán" làm 2 chuyến có thể gộp lại "1-2" thành 1 chuyến và "3-4" vào 1 chuyến được không bác.
Vẫn đảm bảo không quá tải và cùng mặt hàng không bị tách nhiều chuyến
View attachment 272296
Sub XYZ()
Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6)
Dim sRow&, i&, r&, k&, ik&, j&, s&, x&, sp$, N&
Dim hop&, tl#, tlHop#, t#, tongH#, tongT#
Const tMax# = 3600 'Gioi han tren cua Trong luong
With Sheets("Sheet1")
aDM = .Range("C4", .Range("G4").End(xlDown)).Value
aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value
End With
sRow = UBound(aSL)
ReDim arr(1 To sRow, 1 To 6)
For i = 1 To sRow
sp = aSL(i, 1)
For r = 1 To UBound(aDM)
If sp = aDM(r, 1) Then
tlHop = aDM(r, 3) 'Trong luong 1 hop
hop = aDM(r, 4) 'So hop
tl = aDM(r, 5) 'Trong luong
Exit For
End If
Next r
N = Int(aSL(i, 4) / hop)
For r = 1 To N
k = k + 1: x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = sp
res(k, 3) = aSL(i, 2)
res(k, 5) = hop
aSL(i, 4) = aSL(i, 4) - hop
If aSL(i, 4) = 0 Then
res(k, 4) = aSL(i, 3)
aSL(i, 3) = 0
Else
res(k, 4) = tl
aSL(i, 3) = aSL(i, 3) - tl
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
Next r
If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac
s = s + 1
arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2)
arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4)
arr(s, 5) = tlHop
End If
Next i
If s > 0 Then 'SP du chuyen gop voi sp khac
Call SortArr(arr, s)
ik = k + 1
For i = 1 To s
If arr(i, 3) > 0 Then
k = k + 1
If t = 0 Then x = x + 1
res(k, 1) = k: res(k, 6) = x
res(k, 2) = arr(i, 1)
res(k, 3) = arr(i, 2)
If t + arr(i, 3) <= tMax Then
t = t + arr(i, 3)
res(k, 4) = arr(i, 3)
res(k, 5) = arr(i, 4)
Else
res(k, 5) = Int((tMax - t) / arr(i, 5))
res(k, 4) = res(k, 5) * arr(i, 5)
arr(i, 4) = arr(i, 4) - res(k, 5)
arr(i, 3) = arr(i, 3) - res(k, 4)
t = 0
i = i - 1
End If
tongH = tongH + res(k, 5)
tongT = tongT + res(k, 4)
End If
Next i
t = 0
For i = k To ik + 1 Step -1 'Dieu chinh
t = t + res(i, 4)
If res(i, 6) <> res(i - 1, 6) Then
If res(i, 2) = res(i - 1, 2) Then
If t + res(i - 1, 4) <= tMax Then
res(i, 4) = res(i, 4) + res(i - 1, 4)
res(i, 5) = res(i, 5) + res(i - 1, 5)
res(i - 1, 2) = Empty
i = i - 1
s = -1 'Có dieu chinh
End If
End If
t = 0
End If
Next i
If s = -1 Then 'Có dieu chinh
r = 0
For i = 1 To k
If res(i, 2) <> Empty Then
r = r + 1
res(r, 1) = r
For j = 2 To 6
res(r, j) = res(i, j)
Next j
End If
Next i
k = r
res(k + 1, 1) = Empty
End If
End If
With Sheets("Sheet1")
i = .Range("J" & Rows.Count).End(xlUp).Row
If i > 20 Then .Range("I21:N" & i).Clear
If k Then
k = k + 1
res(k, 2) = "Total"
res(k, 4) = tongT
res(k, 5) = tongH
res(k, 6) = res(k - 1, 6)
.Range("I21").Resize(k, 6) = res
End If
End With
End Sub
Có vẻ rất ổn rồi bác, em chưa thấy vấn đề gì, cảm ơn bác nhiều.Chỉnh res(k, 1) = Empty thành res(k+1, 1) = Empty
Chỉnh tiếp
Mã:Sub XYZ() Dim aDM(), aSL(), arr(), res(1 To 1000, 1 To 6) Dim sRow&, i&, r&, k&, ik&, j&, s&, x&, sp$, N& Dim hop&, tl#, tlHop#, t#, tongH#, tongT# Const tMax# = 3600 'Gioi han tren cua Trong luong With Sheets("Sheet1") aDM = .Range("C4", .Range("G4").End(xlDown)).Value aSL = .Range("C21:F" & .Range("C10000").End(xlUp).Row).Value End With sRow = UBound(aSL) ReDim arr(1 To sRow, 1 To 6) For i = 1 To sRow sp = aSL(i, 1) For r = 1 To UBound(aDM) If sp = aDM(r, 1) Then tlHop = aDM(r, 3) 'Trong luong 1 hop hop = aDM(r, 4) 'So hop tl = aDM(r, 5) 'Trong luong Exit For End If Next r N = Int(aSL(i, 4) / hop) For r = 1 To N k = k + 1: x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = sp res(k, 3) = aSL(i, 2) res(k, 5) = hop aSL(i, 4) = aSL(i, 4) - hop If aSL(i, 4) = 0 Then res(k, 4) = aSL(i, 3) aSL(i, 3) = 0 Else res(k, 4) = tl aSL(i, 3) = aSL(i, 3) - tl End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) Next r If aSL(i, 4) > 0 Then 'SP du chuyen gop voi sp khac s = s + 1 arr(s, 1) = aSL(i, 1): arr(s, 2) = aSL(i, 2) arr(s, 3) = aSL(i, 3): arr(s, 4) = aSL(i, 4) arr(s, 5) = tlHop End If Next i If s > 0 Then 'SP du chuyen gop voi sp khac Call SortArr(arr, s) ik = k + 1 For i = 1 To s If arr(i, 3) > 0 Then k = k + 1 If t = 0 Then x = x + 1 res(k, 1) = k: res(k, 6) = x res(k, 2) = arr(i, 1) res(k, 3) = arr(i, 2) If t + arr(i, 3) <= tMax Then t = t + arr(i, 3) res(k, 4) = arr(i, 3) res(k, 5) = arr(i, 4) Else res(k, 5) = Int((tMax - t) / arr(i, 5)) res(k, 4) = res(k, 5) * arr(i, 5) arr(i, 4) = arr(i, 4) - res(k, 5) arr(i, 3) = arr(i, 3) - res(k, 4) t = 0 i = i - 1 End If tongH = tongH + res(k, 5) tongT = tongT + res(k, 4) End If Next i t = 0 For i = k To ik + 1 Step -1 'Dieu chinh t = t + res(i, 4) If res(i, 6) <> res(i - 1, 6) Then If res(i, 2) = res(i - 1, 2) Then If t + res(i - 1, 4) <= tMax Then res(i, 4) = res(i, 4) + res(i - 1, 4) res(i, 5) = res(i, 5) + res(i - 1, 5) res(i - 1, 2) = Empty i = i - 1 s = -1 'Có dieu chinh End If End If t = 0 End If Next i If s = -1 Then 'Có dieu chinh r = 0 For i = 1 To k If res(i, 2) <> Empty Then r = r + 1 res(r, 1) = r For j = 2 To 6 res(r, j) = res(i, j) Next j End If Next i k = r res(k + 1, 1) = Empty End If End If With Sheets("Sheet1") i = .Range("J" & Rows.Count).End(xlUp).Row If i > 20 Then .Range("I21:N" & i).Clear If k Then k = k + 1 res(k, 2) = "Total" res(k, 4) = tongT res(k, 5) = tongH res(k, 6) = res(k - 1, 6) .Range("I21").Resize(k, 6) = res End If End With End Sub