Xin chào các pro, em có bài toán này trên excel mà vẫn chưa có lời giải.
Ví dụ trong các nhà kho có chứa hoa quả gồm cam quýt xoài táo….vv Trong đó có các Thùng + một số túi hoa quả + một ít quả rơi vãi trên sàn.
Trong mỗi Thùng, mỗi loại túi thì chứa các túi hoa quả theo tiêu chuẩn trên file.
Yêu cầu đặt ra là trong các nhà kho hiện tại có bao nhiêu quả? Liệu có phương án nào, công thức, addin hay VBA nào giải quyết nhanh đc không ạ?
Xin cảm ơn anh, chị!
Xin chào các pro, em có bài toán này trên excel mà vẫn chưa có lời giải.
Ví dụ trong các nhà kho có chứa hoa quả gồm cam quýt xoài táo….vv Trong đó có các Thùng + một số túi hoa quả + một ít quả rơi vãi trên sàn.
Trong mỗi Thùng, mỗi loại túi thì chứa các túi hoa quả theo tiêu chuẩn trên file.
Yêu cầu đặt ra là trong các nhà kho hiện tại có bao nhiêu quả? Liệu có phương án nào, công thức, addin hay VBA nào giải quyết nhanh đc không ạ?
Xin cảm ơn anh, chị!
Xin chào bạn thành viên mới toanh. Lần sau bạn đổi đoạn này "Xin chào các pro" lại thành:
"Xin chào mọi người"
hoặc "Xin chào các anh chị"
nhé!
Bài của bạn mình không biết giải, nhưng bạn có thể cho mình hỏi đây là bài toán gì không? Và ứng dụng của nó vào việc gì vậy bạn?
Kho 1 với Kho 2 là 2 bài toán độc lập hay nó có dính líu gì nhau không? Mình tách ra để giải quyết từng Kho hén!
Xin chào bạn thành viên mới toanh. Lần sau bạn đổi đoạn này "Xin chào các pro" lại thành:
"Xin chào mọi người"
hoặc "Xin chào các anh chị"
nhé!
Bài của bạn mình không biết giải, nhưng bạn có thể cho mình hỏi đây là bài toán gì không? Và ứng dụng của nó vào việc gì vậy bạn?
Kho 1 với Kho 2 là 2 bài toán độc lập hay nó có dính líu gì nhau không? Mình tách ra để giải quyết từng Kho hén!
Xin cảm anh/chị Xuongrongdat đã nhắc nhở, lần sau mình sẽ lưu ý
Bài toán này thực chất là tìm ra định mức nhỏ nhất (nguyên vật liệu) của một sản phẩm đc sản xuất theo định mức (BOM) qua nhiều giai đoạn.
Ứng dụng trong quản trị sản xuất hoặc kế toán.
Cụ thể hơn, VD có Thành phẩm A đc sản xuất từ : Bán thành phẩm (hay có nơi gọi là nửa thành phẩm) B, C. Và các nguyên vật liệu A1, A2.
- BTP B thì đc tạo từ các NVL: B1, B2, B3 với định mức cố định.
- BTP C thì đc tạo từ các NVL: C1, C2 với định mức cố định.
Như vậy, thành phẩm A đc tạo ra từ các nguyên vật liệu là: A1, A2, B1, B2, B3, C1, C2 với định mức là bao nhiêu.
Từ đó có thể tính đc là sản xuất 1000 sp A thì cần tốn bao nhiêu NVL: A1, A2, B1, B2, B3, C1, C2
Bác thông cảm nếu em không diễnđạt tốt.
@Dapconmuoi1993 : một lần nữa mình nhắc bạn, bạn đừng nên viết tắt hoặc viết tiếng Anh lửng lửng nha (pro, đc,...). Nên tôn trọng những anh chị chú bác là những người sẽ giúp bạn đó.
Cảm ơn bạn đã giải thích cặn kẽ. Bạn chờ các anh chị chú bác khác vào giúp nhé!
Xin cảm anh/chị Xuongrongdat đã nhắc nhở, lần sau mình sẽ lưu ý
Bài toán này thực chất là tìm ra định mức nhỏ nhất (nguyên vật liệu) của một sản phẩm đc sản xuất theo định mức (BOM) qua nhiều giai đoạn.
Ứng dụng trong quản trị sản xuất hoặc kế toán.
Cụ thể hơn, VD có Thành phẩm A đc sản xuất từ : Bán thành phẩm (hay có nơi gọi là nửa thành phẩm) B, C. Và các nguyên vật liệu A1, A2.
- BTP B thì đc tạo từ các NVL: B1, B2, B3 với định mức cố định.
- BTP C thì đc tạo từ các NVL: C1, C2 với định mức cố định.
Như vậy, thành phẩm A đc tạo ra từ các nguyên vật liệu là: A1, A2, B1, B2, B3, C1, C2 với định mức là bao nhiêu.
Từ đó có thể tính đc là sản xuất 1000 sp A thì cần tốn bao nhiêu NVL: A1, A2, B1, B2, B3, C1, C2
Bác thông cảm nếu em không diễnđạt tốt.
Cái quan trọng đọc cái đề bài chẳng hiểu nổi chủ thớt muốn kết quả là thế nào, đưa bài toán thực tế và kết quả mong muốn như nào thì may ra còn hiểu được
Xin chào các pro, em có bài toán này trên excel mà vẫn chưa có lời giải.
Ví dụ trong các nhà kho có chứa hoa quả gồm cam quýt xoài táo….vv Trong đó có các Thùng + một số túi hoa quả + một ít quả rơi vãi trên sàn.
Trong mỗi Thùng, mỗi loại túi thì chứa các túi hoa quả theo tiêu chuẩn trên file.
Yêu cầu đặt ra là trong các nhà kho hiện tại có bao nhiêu quả? Liệu có phương án nào, công thức, addin hay VBA nào giải quyết nhanh đc không ạ?
Xin cảm ơn anh, chị!
Xin chào các pro, em có bài toán này trên excel mà vẫn chưa có lời giải.
Ví dụ trong các nhà kho có chứa hoa quả gồm cam quýt xoài táo….vv Trong đó có các Thùng + một số túi hoa quả + một ít quả rơi vãi trên sàn.
Trong mỗi Thùng, mỗi loại túi thì chứa các túi hoa quả theo tiêu chuẩn trên file.
Yêu cầu đặt ra là trong các nhà kho hiện tại có bao nhiêu quả? Liệu có phương án nào, công thức, addin hay VBA nào giải quyết nhanh đc không ạ?
Xin cảm ơn anh, chị!
Mấy phần mềm chuyên tính BOM và Fast Track (dự tính Semi-finished product / bán thành phẩm) nó còn phải có chuyên viên sử dụng.
Bảo Excel và VBA làm mà còn đòi hỏi "giải quyết nhanh". Diễu hơi xa.
Về cơ bản, coi bán thành phẩm là 1 loại thành phẩm, đồng thời nó cũng là nguyên liệu.
Mình tạo bảng như sau:
Cột: Thành phẩm và bán thành phẩm
Dòng: Nguyên vật liệu cơ bản và Bán thành phẩm
Ví dụ kinh doanh cơm tấm. Có 2 loại cơm tấm, Loại 1 và loại 2
Các loại nguyên liệu sử dụng : Gạo, thịt, Tỏi ớt, Nước mắm nguyên chất, Nước, Nước mắm pha (Bán TP 1), Thịt nướng (Bán TP 2)
Bán TP 1 (Nước mắm pha) : Nguyên liệu: Tỏi ớt, Nước mắm nguyên chất, Nước
Bán TP 2: (Thịt nướng): Nguyên liệu: Thịt, Tỏi ớt, Nước mắm nguyên chất, Nước
Về cơ bản, coi bán thành phẩm là 1 loại thành phẩm, đồng thời nó cũng là nguyên liệu.
Mình tạo bảng như sau:
Cột: Thành phẩm và bán thành phẩm
Dòng: Nguyên vật liệu cơ bản và Bán thành phẩm
Ví dụ kinh doanh cơm tấm. Có 2 loại cơm tấm, Loại 1 và loại 2
Các loại nguyên liệu sử dụng : Gạo, thịt, Tỏi ớt, Nước mắm nguyên chất, Nước, Nước mắm pha (Bán TP 1), Thịt nướng (Bán TP 2)
Bán TP 1 (Nước mắm pha) : Nguyên liệu: Tỏi ớt, Nước mắm nguyên chất, Nước
Bán TP 2: (Thịt nướng): Nguyên liệu: Thịt, Tỏi ớt, Nước mắm nguyên chất, Nước
File này bạn chỉ thiết kế bán thành phẩm 1 cấp, trong ví dụ của bạn chủ thread ít nhất 2 cấp (bán thành phẩm trong bán thành phẩm), nếu vậy data bạn sẽ thiết kế như thế nào ít nhất là 2 cấp trở lên
Nếu gọi BTP-C1, BTP-C2, thì TP và BTP liệt kê theo cột
Các loại NVL và BTP-C1, BTP-C2 liệt kê theo dòng
Nơi giao nhau là số lượng sử dụng tương quan giữa 2 loại NVL,BTP và TP,BTP
VD: Nơi giao nhau giữa dòng BTP-C2 và cột BTP-C1 là số lượng sử dụng của BTP-C2 dùng để SX BTP-C1
Code chỉ dùng cho 1 sản phẩm, chạy 3 giai đoạn, không có trường hợp bán thành phẩm dùng cho nhau
Mã:
Sub XYZ()
Dim aSP(), aBTP(), aGD1(), Res(), Dic As Object
Dim sRow&, i&, iKey
aSP = Range("C11:F17").Value 'Thanh Pham
aBTP = Range("C18:F38").Value 'Ban Thanh Pham
Set Dic = CreateObject("scripting.dictionary")
Set Dic2 = CreateObject("scripting.dictionary")
For i = 1 To UBound(aSP)
Dic.Item(aSP(i, 3)) = aSP(i, 4)
Next i
For i = 1 To UBound(aBTP)
If aBTP(i, 1) <> Empty Then iKey = aBTP(i, 1)
If Dic.exists(iKey) Then
Dic2.Item(iKey) = ""
Dic.Item(aBTP(i, 3)) = Dic.Item(aBTP(i, 3)) + Dic.Item(iKey) * aBTP(i, 4)
End If
Next i
If Dic2.Count > 0 Then
For Each iKey In Dic2.keys
Dic.Remove iKey
Next iKey
End If
ReDim Res(1 To Dic.Count, 1 To 2)
For Each iKey In Dic.keys
k = k + 1
Res(k, 1) = iKey
Res(k, 2) = Dic.Item(iKey)
Next iKey
Range("I12").Resize(UBound(Res), 2) = Res
End Sub
Nhờ các bình luận và file của mọi người, em đã phần nào giải quyết được vấn đề; đồng thời cũng học hỏi được thêm nhiều thứ.
Xin cảm ơn tất cả anh/chị đã nhiệt tình hỗ trợ!
Tối qua không thấy bạn phản hồi nên tôi không giám viết code. T phải đợi bạn phản hồi tôi mới làm code cho bạn được =)).
Ưu điểm của code này.
- Cơ bản code này chạy với n giai đoạn. dữ liệu đầu vào là cái bảng định mức tổng hợp. Điều kiện tra là cái mã thành phẩm hoặc bán thành phẩm bạn nhập vào ô "i12".
- Tự động cộng dồn các nguyên liệu đầu vào nếu chúng có trong ở các bán thành phẩm khác nhau.
Nhược điểrm của bảng này:
- Nó sẽ không sắp xếp các nguyên liệu đầu vào theo thứ tự từ 1 đến 29 đâu.
Luu ý bạn có thể thay các dữ liệu đầu vào trực tiếp vào code bên dưới những cái tôi bôi đậm để tương thích với từng cách bố trí của từng người. Mình có file đính kèm. bên trong có 1 function phụ.
Sub ExtractDataLucas()
Dim ImportData() As Variant
Dim CriticalValue As String
Dim ActivesheetLucas As String
Dim BTPorTP, BTPorTPDraft As String
Dim ScheduleAll() As String
Dim OutPutLucas() As Variant
Dim i, j, k, t As Double
ActivesheetLucas = Application.ActiveSheet.Name
'Define Input data
ImportData = ThisWorkbook.Worksheets(ActivesheetLucas).Range("C11:F50").Value
CriticalValue = ThisWorkbook.Worksheets(ActivesheetLucas).Range("I12").Value
For i = 1 To UBound(ImportData)
If ImportData(i, 1) = "" And i > 1 Then ImportData(i, 1) = ImportData(i - 1, 1)
Next i
k = 0
BTPorTP = BTPorTP & "*\" & CriticalValue & "*\"
Do
k = 0
ScheduleAll = VBA.Split(BTPorTP, "*\")
For i = 1 To UBound(ScheduleAll)
BTPorTPDraft = ""
If ScheduleAll(i) <> "" And IsNumeric(ScheduleAll(i)) = False Then
If ScheduleAll(i + 1) = "" Then
t = 1
ElseIf IsNumeric(ScheduleAll(i + 1)) = True Then
t = ScheduleAll(i + 1)
End If
For j = 1 To UBound(ImportData)
If ScheduleAll(i) = ImportData(j, 1) Then
BTPorTPDraft = BTPorTPDraft & ImportData(j, 3) & "*\" & VBA.CDbl(ImportData(j, 4)) * t & "*\"
k = 1
End If
Next j
If BTPorTPDraft <> "" Then
BTPorTP = VBA.Replace(BTPorTP, ScheduleAll(i) & "*\" & ScheduleAll(i + 1), BTPorTPDraft)
BTPorTP = VBA.Replace(BTPorTP, "*\*\", "*\")
End If
End If
Next i
Loop While k = 1
'Write data to activesheet
ScheduleAll = VBA.Split(BTPorTP, "*\")
t = Application.WorksheetFunction.RoundDown((UBound(ScheduleAll) + 3) / 2, 0) * 2
ReDim OutPutLucas(2, 4) As Variant
OutPutLucas = ReDimPreserve(OutPutLucas, t / 2, 3)
k = 1
For i = 1 To t - 2 Step 2
If ScheduleAll(i) <> "" Then
For j = i + 2 To t - 2 Step 2
If ScheduleAll(i) = ScheduleAll(j) And IsNumeric(ScheduleAll(j)) = False Then
ScheduleAll(i + 1) = VBA.CDbl(ScheduleAll(i + 1)) + VBA.CDbl(ScheduleAll(j + 1))
OutPutLucas(k, 2) = ScheduleAll(i)
OutPutLucas(k, 3) = ScheduleAll(i + 1)
ScheduleAll(j) = ScheduleAll(j + 1) = ""
Else
OutPutLucas(k, 2) = ScheduleAll(i)
OutPutLucas(k, 3) = ScheduleAll(i + 1)
End If
Next j
k = k + 1
End If
Next i
OutPutLucas(1, 1) = CriticalValue
ThisWorkbook.Worksheets(ActivesheetLucas).Range("I12:K" & 9 + t / 2).Value = OutPutLucas
End Sub
Tối qua không thấy bạn phản hồi nên tôi không giám viết code. T phải đợi bạn phản hồi tôi mới làm code cho bạn được =)).
Ưu điểm của code này.
- Cơ bản code này chạy với n giai đoạn. dữ liệu đầu vào là cái bảng định mức tổng hợp. Điều kiện tra là cái mã thành phẩm hoặc bán thành phẩm bạn nhập vào ô "i12".
- Tự động cộng dồn các nguyên liệu đầu vào nếu chúng có trong ở các bán thành phẩm khác nhau.
Nhược điểrm của bảng này:
- Nó sẽ không sắp xếp các nguyên liệu đầu vào theo thứ tự từ 1 đến 29 đâu.
Luu ý bạn có thể thay các dữ liệu đầu vào trực tiếp vào code bên dưới những cái tôi bôi đậm để tương thích với từng cách bố trí của từng người. Mình có file đính kèm. bên trong có 1 function phụ.
Sub ExtractDataLucas()
Dim ImportData() As Variant
Dim CriticalValue As String
Dim ActivesheetLucas As String
Dim BTPorTP, BTPorTPDraft As String
Dim ScheduleAll() As String
Dim OutPutLucas() As Variant
Dim i, j, k, t As Double
ActivesheetLucas = Application.ActiveSheet.Name
'Define Input data
ImportData = ThisWorkbook.Worksheets(ActivesheetLucas).Range("C11:F50").Value
CriticalValue = ThisWorkbook.Worksheets(ActivesheetLucas).Range("I12").Value
For i = 1 To UBound(ImportData)
If ImportData(i, 1) = "" And i > 1 Then ImportData(i, 1) = ImportData(i - 1, 1)
Next i
k = 0
BTPorTP = BTPorTP & "*\" & CriticalValue & "*\"
Do
k = 0
ScheduleAll = VBA.Split(BTPorTP, "*\")
For i = 1 To UBound(ScheduleAll)
BTPorTPDraft = ""
If ScheduleAll(i) <> "" And IsNumeric(ScheduleAll(i)) = False Then
If ScheduleAll(i + 1) = "" Then
t = 1
ElseIf IsNumeric(ScheduleAll(i + 1)) = True Then
t = ScheduleAll(i + 1)
End If
For j = 1 To UBound(ImportData)
If ScheduleAll(i) = ImportData(j, 1) Then
BTPorTPDraft = BTPorTPDraft & ImportData(j, 3) & "*\" & VBA.CDbl(ImportData(j, 4)) * t & "*\"
k = 1
End If
Next j
If BTPorTPDraft <> "" Then
BTPorTP = VBA.Replace(BTPorTP, ScheduleAll(i) & "*\" & ScheduleAll(i + 1), BTPorTPDraft)
BTPorTP = VBA.Replace(BTPorTP, "*\*\", "*\")
End If
End If
Next i
Loop While k = 1
'Write data to activesheet
ScheduleAll = VBA.Split(BTPorTP, "*\")
t = Application.WorksheetFunction.RoundDown((UBound(ScheduleAll) + 3) / 2, 0) * 2
ReDim OutPutLucas(2, 4) As Variant
OutPutLucas = ReDimPreserve(OutPutLucas, t / 2, 3)
k = 1
For i = 1 To t - 2 Step 2
If ScheduleAll(i) <> "" Then
For j = i + 2 To t - 2 Step 2
If ScheduleAll(i) = ScheduleAll(j) And IsNumeric(ScheduleAll(j)) = False Then
ScheduleAll(i + 1) = VBA.CDbl(ScheduleAll(i + 1)) + VBA.CDbl(ScheduleAll(j + 1))
OutPutLucas(k, 2) = ScheduleAll(i)
OutPutLucas(k, 3) = ScheduleAll(i + 1)
ScheduleAll(j) = ScheduleAll(j + 1) = ""
Else
OutPutLucas(k, 2) = ScheduleAll(i)
OutPutLucas(k, 3) = ScheduleAll(i + 1)
End If
Next j
k = k + 1
End If
Next i
OutPutLucas(1, 1) = CriticalValue
ThisWorkbook.Worksheets(ActivesheetLucas).Range("I12:K" & 9 + t / 2).Value = OutPutLucas
End Sub