Định mức nguyên vật liệu

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Bài nầy dể hơn . . .
Mã:
Option Explicit

Sub abc()
  Dim arr(), res(), a, d As Object, d2 As Object
  Dim sR&, i&, k&, ik&, j&, key$

  Set d = CreateObject("scripting.dictionary")
  Set d2 = CreateObject("scripting.dictionary")
  With Sheets("DATA")
    arr = .Range("A2", .Range("G" & Rows.Count).End(xlUp)).Value
  End With
  sR = UBound(arr)
  ReDim res(1 To sR * 2, 1 To 6)
  For i = 1 To sR
    d(arr(i, 1)) = d(arr(i, 1)) & "," & i
  Next i
 
  For i = 1 To sR
    If d.exists(arr(i, 4)) Then
      Call DeQui(arr, res, d, d2, k, Split(d(arr(i, 4)), ","), arr(i, 7), arr(i, 1))
    Else
      key = arr(i, 1) & "|" & arr(i, 4)
      If d2.exists(key) = False Then
        k = k + 1
        d2(key) = k
      End If
      ik = d2(key)
      res(ik, 1) = arr(i, 1): res(ik, 3) = arr(i, 4)
      res(ik, 5) = arr(i, 6): res(ik, 6) = res(ik, 6) + arr(i, 7)
    End If
  Next i
  Sheets("BOM").Range("A2").Resize(k, 6) = res
End Sub

Sub DeQui(arr, res, d, d2, k, ByVal a, ByVal sl#, ByVal sp$)
    Dim key$, j&, i&, ik&
    For j = 1 To UBound(a)
      i = CLng(a(j))
      If d.exists(arr(i, 4)) Then
        Call DeQui(arr, res, d, d2, k, Split(d(arr(i, 4)), ","), arr(i, 7) * sl, sp)
      Else
        key = sp & "|" & arr(i, 4)
        If d2.exists(key) = False Then
          k = k + 1
          d2(key) = k
        End If
        ik = d2(key)
        res(ik, 1) = sp: res(ik, 3) = arr(i, 4)
        res(ik, 5) = arr(i, 6): res(ik, 6) = res(ik, 6) + arr(i, 7) * sl
      End If
    Next j
End Sub
Bác @HieuCD ơi, bác có thể thêm code để tính ra giúp em ra cột I - Sản phẩm cuối giống như ví dụ của em ở bài 1 được không ạ.
Trong bài của bác @ptm0412 thì có cột này rồi tuy nhiên có 2 điểm em chưa dùng được luôn vì KHSX nhà em luôn luôn thay đổi. Vì vậy để tính toán đươc thì em phải cho vào KHSX là tất cả danh sách Thành phẩm (phải liệt kê ra) và kết quả của bác ý bỏ bớt các bán thành phẩm trung gian ra thẳng đến nguyên vật liệu cuối cùng nên em không có dữ liệu để biết sản phẩm cuối cùng của các bán thành phẩm trung gian là cái gì.
Kính mong hai bác giúp đỡ ạ.
Em cảm ơn!
 
Trong bài của bác @ptm0412 thì có cột này rồi tuy nhiên có 2 điểm em chưa dùng được luôn vì KHSX nhà em luôn luôn thay đổi. Vì vậy để tính toán đươc thì em phải cho vào KHSX là tất cả danh sách Thành phẩm (phải liệt kê ra) và kết quả của bác ý bỏ bớt các bán thành phẩm trung gian ra thẳng đến nguyên vật liệu cuối cùng nên em không có dữ liệu để biết sản phẩm cuối cùng của các bán thành phẩm trung gian là cái gì.
Nói về code của tôi:
Cột cuối cùng (Parent) chính là cột BTP
Ý nghĩa của code là tạo nhu cầu NVL cho 1 đơn hàng sản xuất (MO - Manufacturing order), không phải cho kế hoạch sản xuất.
Code đáp ứng cho bài 16 của trannamhai051284. Bạn này nói ở bài 26:
"Nhưng mình chỉ cần tính đến NVL đầu vào thôi, các lớp trung gian bỏ qua cho đỡ rối mắt"
Còn bạn nói ở bài 35:
còn cái BOM2, BOM3 khi đã bóc tách được thì dùng pivot table là ra được kết quả thôi.
Khi áp dụng cho bài 1 thì tôi có nói: "Áp dụng cho bài 1. Ra thẳng thống kê vật tư. Còn 2 sheet BOM2 và BOM3 liệt kê theo cột thì tôi không thích lắm nên không làm. Làm cho 3 loại tủ xong khi áp cho dữ liệu thực 20 loại là vất code hết."

Kế hoạch sản xuất: sản xuất cái gì và số lượng bao nhiêu, để giao cho xưởng sản xuất
Yêu cầu vật tư: Sử dụng cái gì và số lượng bao nhiêu, giao cho kho và phòng vật tư (hoặc phòng thu mua)

Vậy thì:
Bạn có 1 yêu cầu mới cho KHSX (kế hoạch SX) chứ không phải yêu cầu vật tư. Vậy đừng nói rằng code cũ không đáp ứng được.
 
Lần chỉnh sửa cuối:
Nói về code của tôi:
Cột cuối cùng (Parent) chính là cột BTP
Ý nghĩa của code là tạo nhu cầu NVL cho 1 đơn hàng sản xuất (MO - Manufacturing order), không phải cho kế hoạch sản xuất.
Code đáp ứng cho bài 16 của trannamhai051284. Bạn này nói ở bài 26:
"Nhưng mình chỉ cần tính đến NVL đầu vào thôi, các lớp trung gian bỏ qua cho đỡ rối mắt"
Còn bạn nói ở bài 35:
còn cái BOM2, BOM3 khi đã bóc tách được thì dùng pivot table là ra được kết quả thôi.
Khi áp dụng cho bài 1 thì tôi có nói: "Áp dụng cho bài 1. Ra thẳng thống kê vật tư. Còn 2 sheet BOM2 và BOM3 liệt kê theo cột thì tôi không thích lắm nên không làm. Làm cho 3 loại tủ xong khi áp cho dữ liệu thực 20 loại là vất code hết."

Kế hoạch sản xuất: sản xuất cái gì và số lượng bao nhiêu, để giao cho xưởng sản xuất
Yêu cầu vật tư: Sử dụng cái gì và số lượng bao nhiêu, giao cho kho và phòng vật tư (hoặc phòng thu mua)

Vậy thì:
Bạn có 1 yêu cầu mới cho KHSX (kế hoạch SX) chứ không phải yêu cầu vật tư. Vậy đừng nói rằng code cũ không đáp ứng được.
Em cảm ơn bác. Giống như ở bài 35 em có ghi dùng pivot table là ra được kết quả. Tuy nhiên phần bóc tách bác đã bỏ qua các lớp trung gian nên em không có dữ liệu để ra được kết quả mong muốn ạ. Kính mong bác hỗ trợ giúp ạ
 
Bác @HieuCD ơi, bác có thể thêm code để tính ra giúp em ra cột I - Sản phẩm cuối giống như ví dụ của em ở bài 1 được không ạ.
Trong bài của bác @ptm0412 thì có cột này rồi tuy nhiên có 2 điểm em chưa dùng được luôn vì KHSX nhà em luôn luôn thay đổi. Vì vậy để tính toán đươc thì em phải cho vào KHSX là tất cả danh sách Thành phẩm (phải liệt kê ra) và kết quả của bác ý bỏ bớt các bán thành phẩm trung gian ra thẳng đến nguyên vật liệu cuối cùng nên em không có dữ liệu để biết sản phẩm cuối cùng của các bán thành phẩm trung gian là cái gì.
Kính mong hai bác giúp đỡ ạ.
Em cảm ơn!
Cột I có thể làm người dùng hiểu nhầm bán thành phẩm chỉ dùng cho 1 sản phẩm
Kết quả tạm gán ở cột K
Mã:
Sub xyz2()
  Dim arr(), res(), d As Object, dsp As Object
  Dim sR&, i&

  Set d = CreateObject("scripting.dictionary")
  Set dsp = CreateObject("scripting.dictionary")
  With Sheets("BOM1")
    arr = .Range("A2", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  sR = UBound(arr)
  ReDim res(1 To sR, 1 To 1)
  For i = 1 To sR
    If Not dsp.exists(arr(i, 1)) Then dsp(arr(i, 1)) = arr(i, 2)
    If Not d.exists(arr(i, 4)) Then d(arr(i, 4)) = arr(i, 1)
  Next i

  For i = 1 To sR
    If d.exists(arr(i, 1)) Then
      Call DeQui2(arr, res, d, dsp, d(arr(i, 1)), i)
    Else
      res(i, 1) = arr(i, 2)
    End If
  Next i
  Sheets("BOM1").Range("K2").Resize(sR) = res
End Sub

Sub DeQui2(arr, res, d, dsp, ByVal btp$, ByVal r&)
    If d.exists(btp) Then
      Call DeQui2(arr, res, d, dsp, d(btp), r)
    Else
      res(r, 1) = dsp(btp)
    End If
End Sub
 
Web KT

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

Back
Top Bottom