Nhờ giúp đỡ bài toán chia số lượng theo vị trí.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

mira_saruno

Thành viên mới
Tham gia
15/8/23
Bài viết
8
Được thích
1
Chào các anh chị.
Em làm việc ở kho phân phối, công việc chính là phân bổ hàng theo đơn hàng (Delivery). Em đang găp khó khăn khi tạo một phiếu packing list có vị trí.
Một đơn hàng gồm nhiều mã hàng và mỗi mã hàng thì có nhiều vị trí khác nhau.
Rất mong các anh chị giúp đỡ em phần này với.
--
Dữ liệu nguồn ở sheet O_Stock và O_Demand
- Thứ tự lấy sẽ ưu tiên lấy ở Storage Location 2000 rồi đến 3005
z4605674359608_d2664f1b720fe3df40226773f100ad51.png
 

File đính kèm

  • chia hang theo Bin.xlsx
    24.8 KB · Đọc: 30
Giải pháp
Chào các anh chị.
Em làm việc ở kho phân phối, công việc chính là phân bổ hàng theo đơn hàng (Delivery). Em đang găp khó khăn khi tạo một phiếu packing list có vị trí.
Một đơn hàng gồm nhiều mã hàng và mỗi mã hàng thì có nhiều vị trí khác nhau.
Rất mong các anh chị giúp đỡ em phần này với.
--
Dữ liệu nguồn ở sheet O_Stock và O_Demand
- Thứ tự lấy sẽ ưu tiên lấy ở Storage Location 2000 rồi đến 3005
View attachment 293853
Dữ liệu đã được sort theo Sku item và Storage Location
Kiểm tra lại . . .
Mã:
Sub XYZ()
  Dim a, aa(), b(), res(), sku, SL#
  Dim sRow&, srA&, srB&, sCol&, i&, r&, k&, fr&

  With Sheets("O_Stock")
    aa = .Range("A2:H" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  With Sheets("O_Demand")
    b =...
Kính nhờ các anh chị giúp em với ạ. :help:

Cứ bình tĩnh, bài của bạn cần phải gặp được 1 người mà được gọi là đồng chí.

Còn muốn nhanh hơn thì in 3 sheet này ra + nội dung nhờ vả bên trên,
đưa cho 1 người nào đó,
Hỏi họ rằng có giúp được không.

Sau đó viết hết tất cả câu hỏi của người đó đăng lên đây.
Chúc mau mắng.
 
Upvote 0
Chào các anh chị.
Em làm việc ở kho phân phối, công việc chính là phân bổ hàng theo đơn hàng (Delivery). Em đang găp khó khăn khi tạo một phiếu packing list có vị trí.
Một đơn hàng gồm nhiều mã hàng và mỗi mã hàng thì có nhiều vị trí khác nhau.
Rất mong các anh chị giúp đỡ em phần này với.
--
Dữ liệu nguồn ở sheet O_Stock và O_Demand
- Thứ tự lấy sẽ ưu tiên lấy ở Storage Location 2000 rồi đến 3005
View attachment 293853
Dữ liệu đã được sort theo Sku item và Storage Location
Kiểm tra lại . . .
Mã:
Sub XYZ()
  Dim a, aa(), b(), res(), sku, SL#
  Dim sRow&, srA&, srB&, sCol&, i&, r&, k&, fr&

  With Sheets("O_Stock")
    aa = .Range("A2:H" & .Range("A" & Rows.Count).End(xlUp).Row + 1).Value
  End With
  With Sheets("O_Demand")
    b = .Range("A2", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  srA = UBound(aa) - 1
  srB = UBound(b)
  sCol = UBound(aa, 2)
 
LamLai:
  a = aa
  sRow = sRow + 1000 ' Du lieu nhieu, Tang so 1000 len
  ReDim res(1 To sRow, 1 To sCol)
  fr = 1
  k = 0
  For i = 1 To srB
    sku = b(i, 2)
    SL = b(i, 4)
    For r = fr To srA
      If sku = a(r, 1) And a(r, 7) > 0 Then
        If k + 1 > sRow Then GoTo LamLai
        Call AddRes(res, a, r, b, i, k)
        If SL >= a(r, 7) Then
          res(k, 4) = a(r, 7)
          SL = SL - res(k, 4)
          a(r, 7) = 0
        Else
          res(k, 4) = SL
          a(r, 7) = a(r, 7) - SL
          SL = 0
        End If
        If SL = 0 Then fr = r: Exit For
        If sku <> a(r + 1, 1) Then 'Out of stock
          If k + 1 > sRow Then GoTo LamLai
          Call AddRes(res, a, r, b, i, k)
          res(k, 4) = -SL
          res(k, 6) = "Out of stock"
        End If
      End If
    Next r
  Next i
  With Sheets("Result")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:H" & i).ClearContents
    If k Then .Range("A2").Resize(k, sCol) = res
  End With
End Sub

Sub AddRes(res, a, r, b, i, k)
  k = k + 1
  res(k, 1) = b(i, 1):      res(k, 2) = b(i, 2)
  res(k, 3) = b(i, 3):      res(k, 5) = b(i, 5)
  res(k, 6) = a(r, 3):      res(k, 7) = a(r, 5):      res(k, 8) = a(r, 6)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Giải pháp
Dữ liệu đã được sort them Sku item và Storage Location
Kiểm tra lại . . .
Cảm ơn anh rất nhiều. Code đã chạy đúng, cảm ơn anh đã giúp em xử lý vấn đề này mà em làm thủ công mãi.
Em cũng có tự học được một chút nhưng vẫn chưa hiểu cách anh khai báo biến sao lại không khai rõ ràng nó thuộc kiểu dữ liệu nào. Cách khai báo này có ưu điểm gì không anh?
Mã:
  Dim a, aa(), b(), res(), sku, SL#
  Dim sRow&, srA&, srB&, sCol&, i&, r&, k&, fr&
 
Upvote 0
Cảm ơn anh rất nhiều. Code đã chạy đúng, cảm ơn anh đã giúp em xử lý vấn đề này mà em làm thủ công mãi.
Em cũng có tự học được một chút nhưng vẫn chưa hiểu cách anh khai báo biến sao lại không khai rõ ràng nó thuộc kiểu dữ liệu nào. Cách khai báo này có ưu điểm gì không anh?
Mã:
  Dim a, aa(), b(), res(), sku, SL#
  Dim sRow&, srA&, srB&, sCol&, i&, r&, k&, fr&
Khai báo ngắn dể đọc
Khai báo đầy đủ sẽ là
Mã:
  Dim a As Variant, aa() As Variant, b() As Variant, res() As Variant, sku As Variant, SL As Double
  Dim sRow As Long, srA As Long, srB As Long, sCol As Long, i As Long, r As Long, k As Long, fr As Long
 
Upvote 0
Anh Hiếu ơi.
Có cách nào các mã không có tồn kho sẽ hiển thị "Out of stock" được không anh.
Em kiểm tra lại thì thấy Sheet Result trả về kết quả với các mã có trong sheet O_Stock. Các mã không có sẽ không hiển thị.
 

File đính kèm

  • chia hang theo Bin.xlsx
    21.2 KB · Đọc: 6
Upvote 0
Anh Hiếu ơi.
Có cách nào các mã không có tồn kho sẽ hiển thị "Out of stock" được không anh.
Em kiểm tra lại thì thấy Sheet Result trả về kết quả với các mã có trong sheet O_Stock. Các mã không có sẽ không hiển thị.
Chỉnh lại . . .
Mã:
Sub XYZ()
  Dim a, aa(), b(), res(), sku, SL#
  Dim sRow&, srA&, srB&, sCol&, i&, r&, k&, fr&

  With Sheets("O_Stock")
    aa = .Range("A2:H" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("O_Demand")
    b = .Range("A2", .Range("E" & Rows.Count).End(xlUp)).Value
  End With
  srA = UBound(aa)
  srB = UBound(b)
  sCol = UBound(aa, 2)
 
LamLai:
  a = aa
  sRow = sRow + 1000 ' Du lieu nhieu, Tang so 1000 len
  ReDim res(1 To sRow, 1 To sCol)
  fr = 1
  k = 0
  For i = 1 To srB
    sku = b(i, 2)
    SL = b(i, 4)
    For r = fr To srA
      If sku = a(r, 1) And a(r, 7) > 0 Then
        If k + 1 > sRow Then GoTo LamLai
        Call AddRes(res, a, r, b, i, k)
        If SL >= a(r, 7) Then
          res(k, 4) = a(r, 7)
          SL = SL - res(k, 4)
          a(r, 7) = 0
        Else
          res(k, 4) = SL
          a(r, 7) = a(r, 7) - SL
          SL = 0
        End If
        If SL = 0 Then fr = r: Exit For
      End If
    Next r
    If r = srA + 1 Then
      If k + 1 > sRow Then GoTo LamLai
      Call AddRes(res, a, r, b, i, k, False)
      res(k, 4) = -SL
    End If
  Next i
  With Sheets("Result")
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:H" & i).ClearContents
    If k Then .Range("A2").Resize(k, sCol) = res
  End With
End Sub

Sub AddRes(res, a, r, b, i, k, Optional ByVal bStock As Boolean = True)
  k = k + 1
  res(k, 1) = b(i, 1):      res(k, 2) = b(i, 2)
  res(k, 3) = b(i, 3):      res(k, 5) = b(i, 5)
  If bStock Then
    res(k, 6) = a(r, 3):      res(k, 7) = a(r, 5):      res(k, 8) = a(r, 6)
  Else
    res(k, 6) = "Out of stock"
  End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hi anh Hiếu.
Sau nhiều ngày kiểm tra và sử dụng em có phát hiện thêm một số tính toán chưa đúng.
Nếu các mã hàng cùng sắp xếp theo thứ tự trong 2 sheet O_Stock và O_Demand cùng kiểu (từ A-Z hoặc Z-A ) thì kết quả trả về đúng, nhưng nếu không sắp xếp giống nhau thì sẽ không cho ra kết quả như ý.
Kết quả trả về phụ thuộc vào thứ tự sắp xếp các SKU trong 2 Sheet.
Rất mong anh hỗ trợ giúp, mong anh không cảm thấy phiền hà vì em nhờ anh nhiều quá.
 

File đính kèm

  • chia hang theo Bin.xlsx
    18.8 KB · Đọc: 2
Upvote 0
Hi anh Hiếu.
Sau nhiều ngày kiểm tra và sử dụng em có phát hiện thêm một số tính toán chưa đúng.
Nếu các mã hàng cùng sắp xếp theo thứ tự trong 2 sheet O_Stock và O_Demand cùng kiểu (từ A-Z hoặc Z-A ) thì kết quả trả về đúng, nhưng nếu không sắp xếp giống nhau thì sẽ không cho ra kết quả như ý.
Kết quả trả về phụ thuộc vào thứ tự sắp xếp các SKU trong 2 Sheet.
Rất mong anh hỗ trợ giúp, mong anh không cảm thấy phiền hà vì em nhờ anh nhiều quá.
Ngay từ đầu mình đã nói dữ liệu phải sort trước. Bạn muốn tự sort hay code sort?
 
Upvote 0
Web KT

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

Back
Top Bottom