Nhờ mọi người giúp code VBA để tìm kiếm và thay thế vùng dữ liệu

Liên hệ QC
Hình như lúc ấy tự ái dâng cao quá nên cứ cho câu hỏi ở bài #17 là "phê bình" mình. Không muốn khai rõ là do "kéo ẩu".
Không thuyết phục. Cứ cho là lúc ấy (bài 17 - Thứ sáu lúc 05:30) tự ái dâng cao quá, nhưng bây giờ (bài 35 - Hôm nay (thứ Ba) lúc 14:33) vẫn "lờ" đi là sao. Chả nhẽ "dâng cao" từ thứ Sáu tới thứ Ba? :D
 
Tại sao có 5 dòng giống nhau:
80SAQ51134.ASAQB.006
Chỗ đó em viết sai nhé bác. file gốc đính kèm. bác xem giúp em với ạ
Bài đã được tự động gộp:

@Chủ bài đăng: Đến đây & tìm cách xem được các hình trong nớ, có thể có ích cho bạn:
cảm ơn bạn nhé
 

File đính kèm

  • Book2.xlsx
    350.1 KB · Đọc: 5
Dữ liệu chuẩn đây nhé bác. vì nó quá khó giải thích nên em mới phải làm ví dụ như vậy.
ví dụ dòng 16 mã bôi màu tím là bán thành phẩm của MO 55. nhưng chính nó cũng có các vật liệu tạo thành. em cần thay mã 60 màu tím đó thành các vật liệu tạo ra nó
Bài đã được tự động gộp:


Em nói rồi mà, em vừa vào là viết bài nhờ cậy mọi người luôn. có gì không đúng, không phải thì mong bác và mọi người bỏ qua và không chấp những thứ nhỏ nhặt. cảm ơn bác nhiều.
Không biết bài toán của bạn có giống hình bên dưới không nhỉ ?
Trong file BOM có nhiều sp để đơn giản giả xử có SPX SPY
trong sơ đồ SPX là gốc A1 , A2...là các cái ngọn
Lần này bạn muốn loại bỏ hết những cái trung gian như A , B , B2 chỉ còn để lại gốc và ngọn phải không nhỉ?

Nếu vậy 1 vấn đề là những cái trung gian A B B2 ... có xuất hiện ở các sp khác không. vd trong SPY sẽ có A và do đó cái ngọn của nó sẽ có A1 A2
Nếu không xuất hiện ở SPY bài toán rất đơn giản ... chương trình chạy nhanh
Nếu có xuất hiện ở SPY bài toán rất phức tạp hơn 1 chút ... và chương trình sẽ hơi chậm vì lượng dữ liệu hơi lớn 12k dòng
 

File đính kèm

  • 09090.jpg
    09090.jpg
    75 KB · Đọc: 15
Không biết bài toán của bạn có giống hình bên dưới không nhỉ ?
Trong file BOM có nhiều sp để đơn giản giả xử có SPX SPY
trong sơ đồ SPX là gốc A1 , A2...là các cái ngọn
Lần này bạn muốn loại bỏ hết những cái trung gian như A , B , B2 chỉ còn để lại gốc và ngọn phải không nhỉ?

Nếu vậy 1 vấn đề là những cái trung gian A B B2 ... có xuất hiện ở các sp khác không. vd trong SPY sẽ có A và do đó cái ngọn của nó sẽ có A1 A2
Nếu không xuất hiện ở SPY bài toán rất đơn giản ... chương trình chạy nhanh
Nếu có xuất hiện ở SPY bài toán rất phức tạp hơn 1 chút ... và chương trình sẽ hơi chậm vì lượng dữ liệu hơi lớn 12k dòng
Bài của mình đúng như bạn mô tả và đúng là nó sẽ còn xuất hiện ở sản phẩm Y. Bạn xem giúp mình với nhé. Mình cũng k cần quá nhanh đâu. miễn là nó có thể tự động được.
 
Dữ liệu chuẩn đây nhé bác. vì nó quá khó giải thích nên em mới phải làm ví dụ như vậy.
ví dụ dòng 16 mã bôi màu tím là bán thành phẩm của MO 55. nhưng chính nó cũng có các vật liệu tạo thành. em cần thay mã 60 màu tím đó thành các vật liệu tạo ra nó
Bài đã được tự động gộp:


Em nói rồi mà, em vừa vào là viết bài nhờ cậy mọi người luôn. có gì không đúng, không phải thì mong bác và mọi người bỏ qua và không chấp những thứ nhỏ nhặt. cảm ơn bác nhiều.
Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Mã:
Option Explicit
Dim res(), sArr(), dic As Object, k&

Sub XYZ()
  Dim d As Object, sRow&, i&, iKey
  Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau
 
  Application.ScreenUpdating = False
  Set dic = CreateObject("scripting.dictionary")
  Set d = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng
  For i = 1 To sRow
    iKey = sArr(i, 1)
    dic.Item(iKey) = dic.Item(iKey) & "|" & i
    If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = ""
    sArr(i, 3) = -sArr(i, 3)
  Next
  k = 0
  For Each iKey In d.keys
    Call TaoDinhMuc(iKey, iKey, 1)
  Next iKey
  With Sheets("Sheet1")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("G2:I" & i).ClearContents
    If k > 0 Then .Range("G2").Resize(k, 3) = res
  End With
  Application.ScreenUpdating = True
  Set dic = Nothing: Set d = Nothing
  Erase sArr, res
End Sub

Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double)
  Dim S, iKey$, i&, j&, ik&
  S = Split(dic.Item(tmp), "|")
  For i = 1 To UBound(S)
    j = Val(S(i))
    If Not dic.exists(sArr(j, 2)) Then
      iKey = sp & "|" & sArr(j, 2)
      ik = dic.Item(iKey)
      If ik = 0 Then
        k = k + 1
        ik = k
        dic.Item(iKey) = k
      End If
      res(ik, 1) = sp
      res(ik, 2) = sArr(j, 2)
      res(ik, 3) = res(ik, 3) + sl * sArr(j, 3)
    Else
      If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub
      Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3))
    End If
  Next i
End Sub
 
Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Tôi không làm chuyên môn này nên có thắc mắc.

Sau khi chạy code cho tập tin ở bài #44 thì có kết quả như hình dưới, tức 55.LVD12.MGA là sản phẩm hoàn chỉnh.

ket qua.jpg

Nhưng theo như dòng 9216 ở hình tiếp theo

ban tp.jpg

thì 55.LVD12.MGA là bán thành phẩm của sản phẩm 57.LVD12.G03 chứ không thể là sản phẩm hoàn chỉnh.

Đó là cách hiểu của người ngoại đạo như tôi. Vậy chuyên môn về BOM là như thế nào, và lý thuyết có thể đọc ở đâu?
 
Tôi không làm chuyên môn này nên có thắc mắc.

Sau khi chạy code cho tập tin ở bài #44 thì có kết quả như hình dưới, tức 55.LVD12.MGA là sản phẩm hoàn chỉnh.

View attachment 272194

Nhưng theo như dòng 9216 ở hình tiếp theo

View attachment 272195

thì 55.LVD12.MGA là bán thành phẩm của sản phẩm 57.LVD12.G03 chứ không thể là sản phẩm hoàn chỉnh.

Đó là cách hiểu của người ngoại đạo như tôi. Vậy chuyên môn về BOM là như thế nào, và lý thuyết có thể đọc ở đâu?
Thành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩm
Lúc đầu mình dùng các lệnh sau để xác định thành phẩm, như thấy không ổn nên mới chỉnh lại như code trên
Mã:
  For i = 1 To sRow
    iKey = sArr(i, 1)
    dic.Item(iKey) = dic.Item(iKey) & "|" & i
    d.Item(iKey) = ""
    sArr(i, 3) = -sArr(i, 3)
  Next
  For i = 1 To sRow
    If d.exists(sArr(i, 2)) Then
      d.Remove (sArr(i, 2))
    End If
  Next
  k = 0
  For Each iKey In d.keys
    q = 0
    Call TaoDinhMuc(iKey, iKey, 1)
  Next iKey
 
Tôi chạy code cho hình

du lieu.jpg

thì không có kết quả. Dù là thế nào cũng phải có kết quả chứ nhỉ. Ít ra là San pham 1 và San pham 2 là sản phẩm hoàn chỉnh, nếu doanh nghiệp không cho là Vat lieu 1 và Vat lieu 2 cũng là sản phẩm. Nhưng đây là không có kết quả gì.

Tôi không hiểu rõ lắm Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau

Nếu phải liệt kê gì đó mà với dữ liệu của tác giả hàng chục nghìn dòng thì rất có thể phải liệt kê rất rất nhiều. Nhưng như tôi đã viết, tôi không tìm hiểu xem TP nó là gì vì thực ra tôi cũng không quan tâm.

Thành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩm
Vì thế tôi cho là chủ thớt phải mô tả thật kỹ càng. Họ có thể có khái niệm riêng của họ mà theo đấy 55.LVD12.MGA KHÔNG là sản phẩm hoàn chỉnh (hình như trong tập tin chủ thớt tô mầu chữ để nhấn mạnh đó là Bán thành phẩm). Tôi muốn biết rõ trước khi viết code: sản phẩm hoàn chỉnh là gì, cách phát hiện, bán thành phẩm là gì và cách phát hiện. Vì với một người ngoại đạo như tôi mà không giải thích thì tôi chỉ còn cách đoán mò, tự hiểu. Mà ở thời điểm này tôi hiểu thế này - theo lôgíc của tôi thôi:
- Những mã ở cột A mà không có ở cột B thì là Sản phẩm. Và chỉ chúng mới là Sản phẩm.
- Những mã có ở cột A và cả ở cột B thì là Bán thành phẩm.
- Những mã chỉ có ở cột B thì là nguyên liệu.


Cho tới khi chủ thớt không mô tả, không định nghĩa gì cả thì mọi code chưa chắc đúng ý. Chủ thớt có thể có định nghĩa Sản phẩm, Bán thành phẩm và Nguyên liệu của RIÊNG MÌNH (với tư cách là doanh nghiệp anh ta xác định chuẩn như thế), không cần giống ai. Nhưng lúc đó phải định nghĩa rõ ràng, và chỉ ra cách xác định mã thế nào là Sản phẩm, Bán thành phẩm và Nguyên liệu.
 
Bài của mình đúng như bạn mô tả và đúng là nó sẽ còn xuất hiện ở sản phẩm Y. Bạn xem giúp mình với nhé. Mình cũng k cần quá nhanh đâu. miễn là nó có thể tự động được.
Trong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.
bạn check xem có đúng ý bạn không nhé !
 

File đính kèm

  • test1.xlsx
    362.6 KB · Đọc: 6
Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Mã:
Option Explicit
Dim res(), sArr(), dic As Object, k&

Sub XYZ()
  Dim d As Object, sRow&, i&, iKey
  Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau
 
  Application.ScreenUpdating = False
  Set dic = CreateObject("scripting.dictionary")
  Set d = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng
  For i = 1 To sRow
    iKey = sArr(i, 1)
    dic.Item(iKey) = dic.Item(iKey) & "|" & i
    If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = ""
    sArr(i, 3) = -sArr(i, 3)
  Next
  k = 0
  For Each iKey In d.keys
    Call TaoDinhMuc(iKey, iKey, 1)
  Next iKey
  With Sheets("Sheet1")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("G2:I" & i).ClearContents
    If k > 0 Then .Range("G2").Resize(k, 3) = res
  End With
  Application.ScreenUpdating = True
  Set dic = Nothing: Set d = Nothing
  Erase sArr, res
End Sub

Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double)
  Dim S, iKey$, i&, j&, ik&
  S = Split(dic.Item(tmp), "|")
  For i = 1 To UBound(S)
    j = Val(S(i))
    If Not dic.exists(sArr(j, 2)) Then
      iKey = sp & "|" & sArr(j, 2)
      ik = dic.Item(iKey)
      If ik = 0 Then
        k = k + 1
        ik = k
        dic.Item(iKey) = k
      End If
      res(ik, 1) = sp
      res(ik, 2) = sArr(j, 2)
      res(ik, 3) = res(ik, 3) + sl * sArr(j, 3)
    Else
      If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub
      Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3))
    End If
  Next i
End Sub
Em cảm ơn bác nhiều ạ.
em đang kiểm tra lại kết quả
Bài đã được tự động gộp:

Tôi không làm chuyên môn này nên có thắc mắc.

Sau khi chạy code cho tập tin ở bài #44 thì có kết quả như hình dưới, tức 55.LVD12.MGA là sản phẩm hoàn chỉnh.

View attachment 272194

Nhưng theo như dòng 9216 ở hình tiếp theo

View attachment 272195

thì 55.LVD12.MGA là bán thành phẩm của sản phẩm 57.LVD12.G03 chứ không thể là sản phẩm hoàn chỉnh.

Đó là cách hiểu của người ngoại đạo như tôi. Vậy chuyên môn về BOM là như thế nào, và lý thuyết có thể đọc ở đâu?
Cảm ơn bác, Đúng như bác HieuCD giải thích. TP và Bán Thành Phẩm chỉ là khái niệm tương đối thôi ạ. Khi nó được tạo ra và bán cho công ty khác thì nó là thành phẩm, nhưng khi nó lại đem vào làm một bộ phận cho một sản phẩm khác thì nó lại được coi là bán thành phẩm.
Bài đã được tự động gộp:

Trong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.
bạn check xem có đúng ý bạn không nhé !
Cảm ơn bạn nhiều nhé, mình sẽ kiểm tra kết quả
 
Code không xử lý sản phẩm sử dụng lẫn nhau (A --> . . . --> A), các sản phẩm nầy sẽ được thong báo và tính nguyên vật liệu thiếu
Mã:
Option Explicit
Dim res(), sArr(), dic As Object, k&

Sub XYZ()
  Dim d As Object, sRow&, i&, iKey
  Const TP$ = "5,8,9" 'Tham Pham xet theo ký tu dau
 
  Application.ScreenUpdating = False
  Set dic = CreateObject("scripting.dictionary")
  Set d = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    sArr = .Range("A2", .Range("C" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim res(1 To 100000, 1 To 3) 'Ket qua 100.000 dòng
  For i = 1 To sRow
    iKey = sArr(i, 1)
    dic.Item(iKey) = dic.Item(iKey) & "|" & i
    If InStr(1, TP, Mid(iKey, 1, 1)) > 0 Then d.Item(iKey) = ""
    sArr(i, 3) = -sArr(i, 3)
  Next
  k = 0
  For Each iKey In d.keys
    Call TaoDinhMuc(iKey, iKey, 1)
  Next iKey
  With Sheets("Sheet1")
    i = .Range("G" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("G2:I" & i).ClearContents
    If k > 0 Then .Range("G2").Resize(k, 3) = res
  End With
  Application.ScreenUpdating = True
  Set dic = Nothing: Set d = Nothing
  Erase sArr, res
End Sub

Private Sub TaoDinhMuc(ByVal sp$, ByVal tmp$, ByVal sl As Double)
  Dim S, iKey$, i&, j&, ik&
  S = Split(dic.Item(tmp), "|")
  For i = 1 To UBound(S)
    j = Val(S(i))
    If Not dic.exists(sArr(j, 2)) Then
      iKey = sp & "|" & sArr(j, 2)
      ik = dic.Item(iKey)
      If ik = 0 Then
        k = k + 1
        ik = k
        dic.Item(iKey) = k
      End If
      res(ik, 1) = sp
      res(ik, 2) = sArr(j, 2)
      res(ik, 3) = res(ik, 3) + sl * sArr(j, 3)
    Else
      If sArr(j, 2) = sp Then MsgBox ("San Pham " & sp & " va " & tmp & " bi tinh vong!"): Exit Sub
      Call TaoDinhMuc(sp, sArr(j, 2), sl * sArr(j, 3))
    End If
  Next i
End Sub
Code của bác đúng cái mà em cần rồi ạ. Cảm ơn bác rất nhiều!
Bài đã được tự động gộp:

Trong file bạn gửi mình có thử viết qua code nhưng do chương trình chạy chậm quá nên mình moi xử lý sp đầu tiên.
bạn check xem có đúng ý bạn không nhé !
Code của bạn đang chưa đúng cái mình muốn. ví dụ như mã 55.LVX61.DG2, trong mã đó còn có mã 60.LVX61.F01 mã đó cũng là thành phẩm/bán thành phẩm, nên lại phải thay toàn bộ nguyên liệu trong mã 60 đó vào trong mã 55.LVX61.DG2 nữa cơ bạn ạ.
Bài đã được tự động gộp:

Thành phẩm và bán thành phẩm chỉ là khái niệm tương đối, chỉ có doanh nghiệp mới xác định chuẩn, ví dụ doanh nghiệp giấy, dùng một ít thành phẩm giấy làm bao bì, là nguyên liệu của sản phẩm khác, nhưng giấy vẫn gọi là thành phẩm vì mục đích sản xuất là bán ra ngoài, nếu chủ yếu dùng sản xuất nội bộ và bán ra ngoài là thứ yếu thì gọi là bán thành phẩm
Lúc đầu mình dùng các lệnh sau để xác định thành phẩm, như thấy không ổn nên mới chỉnh lại như code trên
Mã:
  For i = 1 To sRow
    iKey = sArr(i, 1)
    dic.Item(iKey) = dic.Item(iKey) & "|" & i
    d.Item(iKey) = ""
    sArr(i, 3) = -sArr(i, 3)
  Next
  For i = 1 To sRow
    If d.exists(sArr(i, 2)) Then
      d.Remove (sArr(i, 2))
    End If
  Next
  k = 0
  For Each iKey In d.keys
    q = 0
    Call TaoDinhMuc(iKey, iKey, 1)
  Next iKey
Bác rất cẩn thận, em chưa biết đọc nhiều ngôn ngữ VBA, bác có ghi thêm phần ghi chú nên em cần thêm mã đầu 60 vào thành phẩm/bán thành phẩm thì cũng có thể tự thêm vào được. Cảm ơn bác nhiều ạ
 
Lần chỉnh sửa cuối:
Code của bác đúng cái mà em cần rồi ạ. Cảm ơn bác rất nhiều!
Bài đã được tự động gộp:


Code của bạn đang chưa đúng cái mình muốn. ví dụ như mã 55.LVX61.DG2, trong mã đó còn có mã 60.LVX61.F01 mã đó cũng là thành phẩm/bán thành phẩm, nên lại phải thay toàn bộ nguyên liệu trong mã 60 đó vào trong mã 55.LVX61.DG2 nữa cơ bạn ạ.
Bài đã được tự động gộp:


Bác rất cẩn thận, em chưa biết đọc nhiều ngôn ngữ VBA, bác có ghi thêm phần ghi chú nên em cần thêm mã đầu 60 vào thành phẩm/bán thành phẩm thì cũng có thể tự thêm vào được. Cảm ơn bác nhiều ạ
trong sheet ket qua minh thay mã 60.LVX61.F01 thanh ma 72.50048.001 la nguyên liệu cua no vao trong 55.LVX61.DG2 roi nhi ?:)
 
Tôi chạy code cho hình

View attachment 272196

thì không có kết quả. Dù là thế nào cũng phải có kết quả chứ nhỉ. Ít ra là San pham 1 và San pham 2 là sản phẩm hoàn chỉnh, nếu doanh nghiệp không cho là Vat lieu 1 và Vat lieu 2 cũng là sản phẩm. Nhưng đây là không có kết quả gì.

Tôi không hiểu rõ lắm Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau

Nếu phải liệt kê gì đó mà với dữ liệu của tác giả hàng chục nghìn dòng thì rất có thể phải liệt kê rất rất nhiều. Nhưng như tôi đã viết, tôi không tìm hiểu xem TP nó là gì vì thực ra tôi cũng không quan tâm.


Vì thế tôi cho là chủ thớt phải mô tả thật kỹ càng. Họ có thể có khái niệm riêng của họ mà theo đấy 55.LVD12.MGA KHÔNG là sản phẩm hoàn chỉnh (hình như trong tập tin chủ thớt tô mầu chữ để nhấn mạnh đó là Bán thành phẩm). Tôi muốn biết rõ trước khi viết code: sản phẩm hoàn chỉnh là gì, cách phát hiện, bán thành phẩm là gì và cách phát hiện. Vì với một người ngoại đạo như tôi mà không giải thích thì tôi chỉ còn cách đoán mò, tự hiểu. Mà ở thời điểm này tôi hiểu thế này - theo lôgíc của tôi thôi:
- Những mã ở cột A mà không có ở cột B thì là Sản phẩm. Và chỉ chúng mới là Sản phẩm.
- Những mã có ở cột A và cả ở cột B thì là Bán thành phẩm.
- Những mã chỉ có ở cột B thì là nguyên liệu.


Cho tới khi chủ thớt không mô tả, không định nghĩa gì cả thì mọi code chưa chắc đúng ý. Chủ thớt có thể có định nghĩa Sản phẩm, Bán thành phẩm và Nguyên liệu của RIÊNG MÌNH (với tư cách là doanh nghiệp anh ta xác định chuẩn như thế), không cần giống ai. Nhưng lúc đó phải định nghĩa rõ ràng, và chỉ ra cách xác định mã thế nào là Sản phẩm, Bán thành phẩm và Nguyên liệu.
Thông thường doanh nghiệp cần định mức của tất cả sản phẩm bao gồm thành phẩmbán thành phẩm, sau đó cần cụ thể sản phẩm gì sẽ bóc tách ra sau, lúc đó không cần phân loại thành phẩm và bán thành phẩm

Code xét: Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau
Chỉ phán đoán dựa vào đặc điểm bộ mã thực tế, nếu dữ liệu khác cần cách nhận diện khác
 
Lần chỉnh sửa cuối:
Thông thường doanh nghiệp cần định mức của tất cả sản phẩm bao gồm thành phẩmbán thành phẩm, sau đó cần cụ thể sản phẩm gì sẽ bóc tách ra sau, lúc đó không cần phân loại thành phẩm và bán thành phẩm

Code xét: Const TP$ = "5,8,9" 'Tham Pham xet theo kư tu dau
Chỉ phán đoán dựa vào đặc điểm bộ mã thực tế, nếu dữ liệu khác cần cách nhận diện khác
Có những nhà máy dùng một số bán thành phẩm của họ như thành phẩm.
Trường hợp này, họ sẽ xuất kho từ bán thành phẩm trực tiếp sang thành phẩm và từ thành phẩm vào đơn vận hàng.
Đôi khi, có nhà máy xuất ngược thành phẩm về bên bán thành phẩm để chế biến thêm. Trường hợp này họ thường có cái hoá đơn nội, tức là kho bán thành phẩm "mua hàng" từ bên thành phẩm.

Nhà máy chế biến nhiều công đoạn có thể có một phần mềm gọi là cái "routemaker" (đọc là rao-mếch-kơ). Cái routemaker này có khả năng tách thành phẩm ra nhiều công đoạn và xét kho thành phẩm, bán thành phẩm, vật liệu thô, lập thành các chọn lựa đường sản xuất, các BOM,... Nó có thể đưa ra nhiều chọn lựa cho người dùng. Người kỹ sư trách nhiệm món hàng sẽ chọn.

Ví dụ routemaker cho biết để tối ưu sử dụng, tôi cần vật liệu A. Nhưng tôi cũng biết vật liệu B đang ối (dư hàng), tuy đường đi bằng B không tốt bằng A nhưng sử dụng B thì kinh tế hơn. Tôi có thể chọn B.
 
trong sheet ket qua minh thay mã 60.LVX61.F01 thanh ma 72.50048.001 la nguyên liệu cua no vao trong 55.LVX61.DG2 roi nhi ?:)
À, đúng rồi bạn ạ. vậy phần code đã chạy đúng rồi bạn nhé. Mình cần thêm 1 đoạn nữa chạy cho số lượng. ví dụ như là trong mã 55.LVX61.DG2 dùng 3 mã 60.LVX61.F01 thì toàn bộ số lượng nguyên liệu của mã 60.LVX61.F01 sẽ nhân với 3. bạn nghĩ thêm giúp mình với nhé
 
Web KT
Back
Top Bottom