Nhờ trợ giúp để tính toán cho số lượng xe tải.

Liên hệ QC

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
Chào các bạn, mình cần trợ giúp viết câu lệnh macro để tính toán số liệu xe theo cơ sở dữ liệu trong file kèm.
Bạn nào biết giúp mình với, xin cảm ơn nhiều.
 

File đính kèm

  • Tối ưu hóa cho số lượng xe tải.xlsx
    10.9 KB · Đọc: 14
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?
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.
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.
 
Upvote 0
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.
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.
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
 
Upvote 0

File đính kèm

  • Tối ưu hóa cho số lượng xe tải.xlsx
    11.4 KB · Đọc: 9
Upvote 0
Em gửi thêm mặt hàng, bác xem giúp em.
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
 
Upvote 0
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
Cả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:

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.
 

File đính kèm

  • Tối ưu hóa cho số lượng xe tải.xlsm
    24.7 KB · Đọc: 3
Upvote 0
Cả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.
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
 
Upvote 0
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ả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.
 

File đính kèm

  • Tối ưu hóa cho số lượng xe tải.xlsm
    26.6 KB · Đọc: 6
Upvote 0
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.
Còn vấn đề nào không ? mình sẽ viết lần cuối
 
Upvote 0
Còn vấn đề nào không ? mình sẽ viết lần cuối
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.
 
Upvote 0
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.
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
 
Upvote 0
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
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?
 
Upvote 0
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?
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
 
Upvote 0
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
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.
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
1645258475862.png
 
Upvote 0
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.
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
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
 
Upvote 0
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
Có vẻ rất ổn rồi bác, em chưa thấy vấn đề gì, cảm ơn bác nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom