Hỏi cách liệt kê hết nguyên vật liệu tiêu hao để sản xuất sản phẩm chính có phân nhiều công đoạn bán thành phẩm

Liên hệ QC

leductung1610

Thành viên mới
Tham gia
24/11/20
Bài viết
8
Được thích
1
Hôm trước e có đưa 1 file cột A là thành phẩm + các bán thành phẩm, cột E là bán thành phẩm + nguyên vật liệu để tạo thành cột A. Bjo e muốn quy đổi các thành phẩm + bán thành phẩm của cột A ra hết nguyên vật liệu chứ không để bán thành phẩm nữa. Có bác "Excel lv 15" đã làm được và chỉ e là dùng Power Query. Nhưng phần vì e chưa sử dụng bjo và cũng gà nên mò mãi không ra. đọc tài liệu thì không hiểu gì. Mong mọi người ai biết thì chỉ giúp mình làm thế nào để được như file đính kèm này với. Cảm ơn mọi người rất nhiều ạ!
 

File đính kèm

  • hoi dap.xlsx
    997.1 KB · Đọc: 41
Hôm trước e có đưa 1 file cột A là thành phẩm + các bán thành phẩm, cột E là bán thành phẩm + nguyên vật liệu để tạo thành cột A. Bjo e muốn quy đổi các thành phẩm + bán thành phẩm của cột A ra hết nguyên vật liệu chứ không để bán thành phẩm nữa. Có bác "Excel lv 15" đã làm được và chỉ e là dùng Power Query. Nhưng phần vì e chưa sử dụng bjo và cũng gà nên mò mãi không ra. đọc tài liệu thì không hiểu gì. Mong mọi người ai biết thì chỉ giúp mình làm thế nào để được như file đính kèm này với. Cảm ơn mọi người rất nhiều ạ!
Thấy có kết quả rồi mà
Hay bạn muốn khác?
 
Làm cho bạn bằng VBA, đệ quy xuống tận cấp dưới cùng, dù cho công thức sản xuất có bao nhiêu cấp:
- Cột I sheet Data điền đủ định mức
- Sheet Calc điền mặt hàng & số lượng cần sản xuất
- Nhấn nút Run để tính toán tất cả nguyên vật liệu (đã tính cho tất cả bán thành phẩm)

Ghi chú:
Muốn liệt kê bao nhiêu mặt hàng cột A cũng được (kể cả liệt kê hết mặt hàng, số lượng cứ cho bằng 1)
Cột M trở về sau là tính tay để kiểm tra
 

File đính kèm

  • BOM-Calculate.xlsm
    705.9 KB · Đọc: 70
Làm cho bạn bằng VBA, đệ quy xuống tận cấp dưới cùng, dù cho công thức sản xuất có bao nhiêu cấp:
- Cột I sheet Data điền đủ định mức
- Sheet Calc điền mặt hàng & số lượng cần sản xuất
- Nhấn nút Run để tính toán tất cả nguyên vật liệu (đã tính cho tất cả bán thành phẩm)

Ghi chú:
Muốn liệt kê bao nhiêu mặt hàng cột A cũng được (kể cả liệt kê hết mặt hàng, số lượng cứ cho bằng 1)
Cột M trở về sau là tính tay để kiểm tra
Em điền thêm mã vào ấn run thì bị lỗi như này. Với cả em muốn nhờ anh điền thêm cột đơn vị tính của tiêu hao nguyên vật liệu với ạ. Cảm ơn anh! 1606786186957.png
 

File đính kèm

  • BOM-Calculate.xlsm
    964.3 KB · Đọc: 11
Hôm trước e có đưa 1 file cột A là thành phẩm + các bán thành phẩm, cột E là bán thành phẩm + nguyên vật liệu để tạo thành cột A. Bjo e muốn quy đổi các thành phẩm + bán thành phẩm của cột A ra hết nguyên vật liệu chứ không để bán thành phẩm nữa. Có bác "Excel lv 15" đã làm được và chỉ e là dùng Power Query. Nhưng phần vì e chưa sử dụng bjo và cũng gà nên mò mãi không ra. đọc tài liệu thì không hiểu gì. Mong mọi người ai biết thì chỉ giúp mình làm thế nào để được như file đính kèm này với. Cảm ơn mọi người rất nhiều ạ!
Bạn làm theo video này, đã bổ dung thêm sản lượng sản xuất và sản lượng tiêu hao, mỗi lần thay đổi chuột phải vào bảng result refresh
Làm cho bạn bằng VBA, đệ quy xuống tận cấp dưới cùng, dù cho công thức sản xuất có bao nhiêu cấp:
- Cột I sheet Data điền đủ định mức
- Sheet Calc điền mặt hàng & số lượng cần sản xuất
- Nhấn nút Run để tính toán tất cả nguyên vật liệu (đã tính cho tất cả bán thành phẩm)

Ghi chú:
Muốn liệt kê bao nhiêu mặt hàng cột A cũng được (kể cả liệt kê hết mặt hàng, số lượng cứ cho bằng 1)
Cột M trở về sau là tính tay để kiểm tra
Bài này dùng VBA chậm hơn PQ khá nhiều
 

File đính kèm

  • hoi dap.xlsx
    1.2 MB · Đọc: 34
Em điền thêm mã vào ấn run thì bị lỗi như này. Với cả em muốn nhờ anh điền thêm cột đơn vị tính của tiêu hao nguyên vật liệu với ạ. Cảm ơn anh!
Trước mắt bạn sửa câu lệnh
Redim Result(1 to 1000, 1 to 5)
thành
Redim Result(1 to 50000, 1 to 5)

Sửa cả chỗ ClearContents

1606792861076.png

Chạy sẽ mất khoảng 10 phút, rồi tôi cải tiến tốc độ và thêm cột đơn vị tính sau
 
Đã thêm đơn vị tính (bạn chèn cột mà không biết sửa code nên kết quả sai)
Cải tiến chỉ chạy hơn 1 phút (máy yếu)

1606797125081.png
 

File đính kèm

  • BOM-Calculate (1).xlsm
    2.1 MB · Đọc: 72
BOM là một công việc của ERP (*). Nó có thể là một biểu thức hết sức đơn giản a+b=c. Nhưng cũng có thể là một công việc đòi hỏi cả một bảng chân lý (truth table).
Cách đây cũng khá lâu, người đồng nghiệp của tôi lãnh đồ án làm cái RoutMaker (một hình thức phân bố công việc và kiểm soát vật liệu đầu vào, đầu ra). Là một Lập trình viên chuyên nghiệp (trên 10 năm), cô ta phải thêm một LTV phụ, 20% giờ của Phân Tích Hệ Thống (Systems Analyst), và 10% giờ của Trưởng Xưởng (Shop Floor Manager) (**), ròng rã 6 tháng phần mềm mới thành hình (***)

Nếu thớt muốn làm cái này thì phải xác định thật rõ phạm vi tầm vực của công việc. Nếu phạm vi nhỏ thì mới làm. Lớn quá thì mướn người ta làm. Loại công việc này không thể làm theo kiểu "bắt đầu nhỏ, từ từ khơi lớn". Không thể nhờ GPE làm từng bước một đâu.

(*) khi tôi nói ERP (Enterprise Resource Planning) là tôi nói về cách tổ chức hệ thống quy trình làm việc của một công ty/cơ sở. Tôi không nói về cái phần mềm gì đó mà người ta hay đem lên đây hỏi "dữ liệu xuất ra từ phần mềm ERP..."

(**) dân chuyên nghiệp đồ án làm việc tính theo "time and materials". Họ tính ngày giờ của các người trong dự án, cộng với các phí tổn khác (tiền máy, tiền giấy má,...) để có giá thành sản phẩm phần mềm. Như ví dụ trên thì LTV chuyên nghiệp 100% thời gian (6 tháng = 22 ngày/tháng x 6 tháng = 132 ngày); LTV phụ cũng 100%; cộng SA là 132 x 20%; SFM là 132 x 10%.

(***) thành hình có nghĩa là tạm đem vào sử dụng. Còn phải qua một giai đoạn gọi là lên răng sữa (teething) để chỉnh đốn những chỗ gút mắc.
 
Đã thêm đơn vị tính (bạn chèn cột mà không biết sửa code nên kết quả sai)
Cải tiến chỉ chạy hơn 1 phút (máy yếu)

View attachment 250361
thanks a nhiều!
Bài đã được tự động gộp:

Bạn làm theo video này, đã bổ dung thêm sản lượng sản xuất và sản lượng tiêu hao, mỗi lần thay đổi chuột phải vào bảng result refresh

Bài này dùng VBA chậm hơn PQ khá nhiều
cảm ơn anh nhé!
 
Máy mình chạy hơn 1 phút, tạo thêm Dic tốc độ sẽ nhanh hơn nhiều
Anh có thể cho biết thêm Dic cho dữ liệu nào không? Vì tôi đã sử dụng 1 Dic cho danh mục hàng SX rồi? Thủ tục chạy đệ quy nên số vòng lặp khá lớn 2000 x 2000
Tôi cũng thử bỏ Dic thêm 1 cột phụ IsBOM thay cho việc xét điều kiện tồn tại trong Dic nhưng không cải thiện được bao nhiêu.
Nếu phạm vi nhỏ thì mới làm.
Yêu cầu ban đầu chỉ là liệt kê, tôi nghĩ tầm mức này là của 1 anh chỉ lập báo cáo chứ không phải sĩ quan cấp trung hay cấp cao. Tôi còn mở rộng ra thành tính cả số lượng NVL cho 1 đơn hàng sản xuất (là tầm mức của 1 anh kế hoạch dự trù vật tư cho sản xuất). Chắc không thiếu
(**) dân chuyên nghiệp đồ án làm việc tính theo "time and materials". Họ tính ngày giờ của các người trong dự án, cộng với các phí tổn khác (tiền máy, tiền giấy má,...)
Tôi đang thất nghiệp, tạm tính 3 mandays, mỗi manday 100 USD, điện nước bao trọn gói.
 
Anh có thể cho biết thêm Dic cho dữ liệu nào không? Vì tôi đã sử dụng 1 Dic cho danh mục hàng SX rồi? Thủ tục chạy đệ quy nên số vòng lặp khá lớn 2000 x 2000
Tôi cũng thử bỏ Dic thêm 1 cột phụ IsBOM thay cho việc xét điều kiện tồn tại trong Dic nhưng không cải thiện được bao nhiêu.

Yêu cầu ban đầu chỉ là liệt kê, tôi nghĩ tầm mức này là của 1 anh chỉ lập báo cáo chứ không phải sĩ quan cấp trung hay cấp cao. Tôi còn mở rộng ra thành tính cả số lượng NVL cho 1 đơn hàng sản xuất (là tầm mức của 1 anh kế hoạch dự trù vật tư cho sản xuất). Chắc không thiếu

Tôi đang thất nghiệp, tạm tính 3 mandays, mỗi manday 100 USD, điện nước bao trọn gói.
Trong trường hợp sử dụng sản phẩm làm nguyên vật liệu sản xuất sản phẩm khác và ngược lại, cách tính sẽ phức tạp
File có danh mục sản phẩm trong sheet "Calc" nên không cần thêm Dic, chỉ cần thêm Item là thứ tự dòng để tăng tốc code, những vấn đề khác chưa xét tới
Mã:
Sub Run()
Dim MOrder(), LRw As Long, ikey As String
ReDim Result(1 To 50000, 1 To 7)
LRw = [A10000].End(xlUp).Row
MOrder = Range("A4:C" & LRw).Value
'ActiveSheet.Range("F4:L50000").ClearContents
Application.ScreenUpdating = False
With Sheets("Data")
    .AutoFilterMode = 0
    LastRw = .Cells(50000, 2).End(xlUp).Row
    SProduct = .Range("A2:A" & LastRw).Value
    Material = .Range("E2:G" & LastRw).Value
    SQty = .Range("I2:I" & LastRw).Value
End With
    Set Dict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(SProduct, 1)
        'If Not Dict1.exists(SProduct(i, 1)) Then
            'Dict1.Add SProduct(i, 1), ""
            ikey = SProduct(i, 1)
            Dict1.Item(ikey) = Dict1.Item(ikey) & "|" & i
        'End If
    Next
t = Timer
For i = 1 To UBound(MOrder, 1)
    InitialProduct = MOrder(i, 1)
    ManufactQty = MOrder(i, 3)
    CalculateBOM_2 InitialProduct, ManufactQty
    'CalculateBOM InitialProduct, ManufactQty
Next
If m > 0 Then
    'ActiveSheet.[F4].Resize(m, 7) = Result
    ActiveSheet.[N4].Resize(m, 7) = Result
End If
Erase Material, SQty, SProduct, Result
Set dic1 = Nothing
InitialProduct = "": ManufactQty = 0: m = 0
Application.ScreenUpdating = True
MsgBox Timer - t & " second", , "Ptm0412"
End Sub

Sub CalculateBOM_2(ByVal Product As String, ByVal PrQty As Double)
    Dim S As Variant
   
    S = Split(Dict1.Item(Product), "|")
    For i = 1 To UBound(S)
        j = Val(S(i))
            If Not Dict1.exists(CStr(Material(j, 1))) Then
                m = m + 1
                Result(m, 1) = InitialProduct
                Result(m, 2) = ManufactQty
                Result(m, 3) = Material(j, 1)
                Result(m, 4) = Material(j, 2)
                Result(m, 5) = Material(j, 3)
                Result(m, 7) = SQty(j, 1) * PrQty
                Result(m, 6) = Result(m, 7) / ManufactQty
            Else
                NewPrqty = SQty(j, 1)
                CalculateBOM_2 Material(j, 1), NewPrqty * PrQty
            End If
    Next i
End Sub
 
Trong trường hợp sử dụng sản phẩm làm nguyên vật liệu sản xuất sản phẩm khác và ngược lại, cách tính sẽ phức tạp
File có danh mục sản phẩm trong sheet "Calc" nên không cần thêm Dic, chỉ cần thêm Item là thứ tự dòng để tăng tốc code, những vấn đề khác chưa xét tới
Hay quá anh, số vòng lặp giảm xuống còn trong khoảng 2000 x 5 đến 2000 x 10 gì đó thay vì 2000 x 2000. Tuyệt chiêu!
Nói thêm
Có thể dùng sản phẩm này làm nguyên liệu đầu vào cho sản phẩm khác, nhưng không thể/ rất hiếm trường hợp có 2 chiều. Trừ trường hợp rất đặc biệt như trong ngành nông sản:
Có các ngành mà sản phẩm phân loại theo tỷ lệ tạp chất hoặc độ ẩm thí dụ:
- loại A: tạp chất <= 0.5%
- Loại B: tạp chất > 0.5% và <= 1 %
- Loại C: tạp chất > 1% và <= 2%
Sẽ có các trường hợp:
Loại B hoặc C tinh chế loại bỏ bớt tạp chất thành loại A.
Loại A pha thêm tạp chất thành loại B hoặc C (do A bán chậm và B, C đang thiếu hàng)
Tất cả các trường hợp là lấy hàng tồn kho thành phẩm ra làm đầu vào, chứ không từ nguyên liệu thô SX cái này rồi dùng nó để SX cái kia

Trong trường hợp xuôi ngược như vậy thì mỗi mã hàng sẽ có thêm 1 BOM (1 mã SX có nhiều BOM):
Cụ thể:
Loại A có 3 BOM:
- BOM A01 từ nguyên liệu thô
- BOM A02 từ B và chi phí loại tạp chất
- BOM A03 từ C và chi phí loại tạp chât
Loại B có 3 BOM
- BOM B01 từ nguyên liệu thô
- BOM B02 từ A và tạp chất
- BOM B03 từ C và chi phí loại tạp chất
Loại C tương tự

Lệnh sản xuất phải ghi rõ đợt sản xuất này sử dụng mã BOM nào, code kiết cũng có cơ sở để tính (lấy nguyên liệu hay lấy thành phẩm)
 
Lần chỉnh sửa cuối:
Bạn làm theo video này, đã bổ dung thêm sản lượng sản xuất và sản lượng tiêu hao, mỗi lần thay đổi chuột phải vào bảng result refresh

Bài này dùng VBA chậm hơn PQ khá nhiều
Em Vân muốn hỏi anh chút ạ. Ở Bài này nếu thêm 1 cột điều kiện Tháng thì PowerQuery sẽ làm như kiểu nào ạ ?

Em Vân cảm ơn anh ạ
 
Web KT
Back
Top Bottom