Chèn dữ liệu và tính toán năng lực của máy trên dây chuyền sản xuất so với kế hoạch bằng VBA

Liên hệ QC

th7

Thành viên thường trực
Tham gia
3/3/15
Bài viết
215
Được thích
52
Giới tính
Nam
Chào Các Bạn ,
Mình có tập tin dữ liệu, và cần xử lý chèn các dòng cho các sản phẩm và lấy dữ liệu để tính xem, năng lực của các máy trên dây chuyền có đáp ứng được nhu cầu hay không, mình có mô tả chi tiết trong tập tin đính kèm,
Mình xin được nhờ Code VBA hỗ trợ cho trường hợp này.
Mong các Bạn xem qua và có thể hỗ trợ mình được không.
Mình cảm ơn.
 

File đính kèm

  • Capacity-Utilization-OCT_NOV_DEC.xlsx
    1 MB · Đọc: 42
Chào Các Bạn ,
Mình có tập tin dữ liệu, và cần xử lý chèn các dòng cho các sản phẩm và lấy dữ liệu để tính xem, năng lực của các máy trên dây chuyền có đáp ứng được nhu cầu hay không, mình có mô tả chi tiết trong tập tin đính kèm,
Mình xin được nhờ Code VBA hỗ trợ cho trường hợp này.
Mong các Bạn xem qua và có thể hỗ trợ mình được không.
Mình cảm ơn.
Buổi sáng mà đọc bài của bạn nó cứ như là đi vào mê trận ấy.Đọc không hiểu gì.
 
  • Cười
Reactions: th7
Upvote 0
Buổi sáng mà đọc bài của bạn nó cứ như là đi vào mê trận ấy.Đọc không hiểu gì.
Chào Bạn snow25,
Bài viết này có 4 Sheet:
  1. Sheet "Sum"
  2. Sheet "Database_Engineer"
  3. Sheet "Data_Planner"
  4. Sheet "Result_VBA"
Sheet "Result_VBA" là kết quả của việc dò thông tin Material (Finished Material & Sub-Finished Material) trong sheet "Data_Planner", kiểm tra đối chiếu với với thông tin tại Cột "C", "D" trong sheet "Database_Engineer" và lấy dữ liệu qua, trong quá trình lấy dữ liệu thì sẽ có các trường hợp như mình có mô tả trong tệp.
Mình cũng có làm tay các dữ liệu để mô tả các trường hợp xảy ra, đây là dữ liệu thực tế.
Tại thông tin nào Bạn còn cần thêm, bạn chia sẻ nha.
Cảm ơn.
 
Upvote 0
Code cho file ở bài 1.
Mã:
Sub MergeData()
Const sShEngineer As String = "Database_Engineer"
Const sShPlanner As String = "Data_Planner"
Const sShResult As String = "Result_VBA"
Dim oDic As Object, aEngineer As Variant, aPlanner As Variant
aEngineer = Sheets(sShEngineer).Range("C3:AV" & CStr(Sheets(sShEngineer).Cells(&H100000, "D").End(xlUp).Row + 1)).Value
Set oDic = InitializeDic(aEngineer)
aPlanner = Sheets(sShPlanner).Range("A3:H" & CStr(Sheets(sShPlanner).Cells(&H100000, "A").End(xlUp).Row + 1)).Value2
Dim i As Long, ii As Long, j As Long, k As Long, aResult As Variant, u1 As Long, u2 As Long, aTmp As Variant
u1 = UBound(aPlanner, 2)
u2 = UBound(aEngineer, 2)
ReDim aResult(1 To 10000, 1 To u1 + u2 - 1)
For i = 1 To UBound(aPlanner) - 1
    If oDic.Exists(aPlanner(i, 3)) Then
        aTmp = oDic.Item(aPlanner(i, 3))
    ElseIf oDic.Exists("_" & aPlanner(i, 3)) Then
        aTmp = oDic.Item("_" & aPlanner(i, 3))
    Else
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        GoTo Next_i
    End If
    For ii = aTmp(0) To aTmp(1)
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        For j = 2 To u2
            aResult(k, u1 - 1 + j) = aEngineer(ii, j)
        Next
    Next
Next_i:
Next
Sheets(sShResult).UsedRange.Offset(3).Clear
Sheets(sShResult).Range("A3").Resize(, UBound(aResult, 2) + 1).ClearContents
If k > 0 Then
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2) + 2).FillDown
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2)).Value2 = aResult
End If
End Sub
Private Function InitializeDic(ByRef aEngineer As Variant) As Object
Dim i As Long, k As Long
Set InitializeDic = CreateObject("Scripting.Dictionary")
k = 1
For i = 1 To UBound(aEngineer, 1) - 1
    If aEngineer(i, 1) <> aEngineer(i + 1, 1) Then
        InitializeDic.Item(aEngineer(i, 1)) = Array(k, i)
        k = i + 1
    ElseIf aEngineer(i, 1) = "" And aEngineer(i, 2) <> aEngineer(i + 1, 2) Then
        InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        k = i + 1
    End If
Next
End Function
 
Upvote 0
Code cho file ở bài 1.
Mã:
Sub MergeData()
Const sShEngineer As String = "Database_Engineer"
Const sShPlanner As String = "Data_Planner"
Const sShResult As String = "Result_VBA"
Dim oDic As Object, aEngineer As Variant, aPlanner As Variant
aEngineer = Sheets(sShEngineer).Range("C3:AV" & CStr(Sheets(sShEngineer).Cells(&H100000, "D").End(xlUp).Row + 1)).Value
Set oDic = InitializeDic(aEngineer)
aPlanner = Sheets(sShPlanner).Range("A3:H" & CStr(Sheets(sShPlanner).Cells(&H100000, "A").End(xlUp).Row + 1)).Value2
Dim i As Long, ii As Long, j As Long, k As Long, aResult As Variant, u1 As Long, u2 As Long, aTmp As Variant
u1 = UBound(aPlanner, 2)
u2 = UBound(aEngineer, 2)
ReDim aResult(1 To 10000, 1 To u1 + u2 - 1)
For i = 1 To UBound(aPlanner) - 1
    If oDic.Exists(aPlanner(i, 3)) Then
        aTmp = oDic.Item(aPlanner(i, 3))
    ElseIf oDic.Exists("_" & aPlanner(i, 3)) Then
        aTmp = oDic.Item("_" & aPlanner(i, 3))
    Else
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        GoTo Next_i
    End If
    For ii = aTmp(0) To aTmp(1)
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        For j = 2 To u2
            aResult(k, u1 - 1 + j) = aEngineer(ii, j)
        Next
    Next
Next_i:
Next
Sheets(sShResult).UsedRange.Offset(3).Clear
Sheets(sShResult).Range("A3").Resize(, UBound(aResult, 2) + 1).ClearContents
If k > 0 Then
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2) + 2).FillDown
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2)).Value2 = aResult
End If
End Sub
Private Function InitializeDic(ByRef aEngineer As Variant) As Object
Dim i As Long, k As Long
Set InitializeDic = CreateObject("Scripting.Dictionary")
k = 1
For i = 1 To UBound(aEngineer, 1) - 1
    If aEngineer(i, 1) <> aEngineer(i + 1, 1) Then
        InitializeDic.Item(aEngineer(i, 1)) = Array(k, i)
        k = i + 1
    ElseIf aEngineer(i, 1) = "" And aEngineer(i, 2) <> aEngineer(i + 1, 2) Then
        InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        k = i + 1
    End If
Next
End Function
Chào Bạn huuthang_bd,
Cảm ơn Bạn rất nhiều đã hỗ trợ mình bài viết này, code chạy không có vấn đề gì,
Cảm ơn Bạn rất nhiều.
 
Upvote 0
Code cho file ở bài 1.
Mã:
Sub MergeData()
Const sShEngineer As String = "Database_Engineer"
Const sShPlanner As String = "Data_Planner"
Const sShResult As String = "Result_VBA"
Dim oDic As Object, aEngineer As Variant, aPlanner As Variant
aEngineer = Sheets(sShEngineer).Range("C3:AV" & CStr(Sheets(sShEngineer).Cells(&H100000, "D").End(xlUp).Row + 1)).Value
Set oDic = InitializeDic(aEngineer)
aPlanner = Sheets(sShPlanner).Range("A3:H" & CStr(Sheets(sShPlanner).Cells(&H100000, "A").End(xlUp).Row + 1)).Value2
Dim i As Long, ii As Long, j As Long, k As Long, aResult As Variant, u1 As Long, u2 As Long, aTmp As Variant
u1 = UBound(aPlanner, 2)
u2 = UBound(aEngineer, 2)
ReDim aResult(1 To 10000, 1 To u1 + u2 - 1)
For i = 1 To UBound(aPlanner) - 1
    If oDic.Exists(aPlanner(i, 3)) Then
        aTmp = oDic.Item(aPlanner(i, 3))
    ElseIf oDic.Exists("_" & aPlanner(i, 3)) Then
        aTmp = oDic.Item("_" & aPlanner(i, 3))
    Else
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        GoTo Next_i
    End If
    For ii = aTmp(0) To aTmp(1)
        k = k + 1
        For j = 1 To u1
            aResult(k, j) = aPlanner(i, j)
        Next
        For j = 2 To u2
            aResult(k, u1 - 1 + j) = aEngineer(ii, j)
        Next
    Next
Next_i:
Next
Sheets(sShResult).UsedRange.Offset(3).Clear
Sheets(sShResult).Range("A3").Resize(, UBound(aResult, 2) + 1).ClearContents
If k > 0 Then
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2) + 2).FillDown
    Sheets(sShResult).Range("A3").Resize(k, UBound(aResult, 2)).Value2 = aResult
End If
End Sub
Private Function InitializeDic(ByRef aEngineer As Variant) As Object
Dim i As Long, k As Long
Set InitializeDic = CreateObject("Scripting.Dictionary")
k = 1
For i = 1 To UBound(aEngineer, 1) - 1
    If aEngineer(i, 1) <> aEngineer(i + 1, 1) Then
        InitializeDic.Item(aEngineer(i, 1)) = Array(k, i)
        k = i + 1
    ElseIf aEngineer(i, 1) = "" And aEngineer(i, 2) <> aEngineer(i + 1, 2) Then
        InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        k = i + 1
    End If
Next
End Function
Chào Bạn nha,
Bạn ơi, cho mình hỏi vấn đề này,
1663908809460.png
dữ liệu này, trong Sheet "Database_Engineer" có dữ liệu, nhưng khi nhấn chạy thì Codel lại không lấy dữ liệu ra được,
Mình đã thay thế đổi giá trị, thêm bớt kí tự, chiều dài,... nhưng vẫn chưa được,
Nhờ bạn kiểm tra lại dùm cho mình được không,
Cảm ơn.
 

File đính kèm

  • Capacity-Utilization.xlsm
    1.9 MB · Đọc: 19
Upvote 0
Chào Bạn nha,
Bạn ơi, cho mình hỏi vấn đề này,
View attachment 281263
dữ liệu này, trong Sheet "Database_Engineer" có dữ liệu, nhưng khi nhấn chạy thì Codel lại không lấy dữ liệu ra được,
Mình đã thay thế đổi giá trị, thêm bớt kí tự, chiều dài,... nhưng vẫn chưa được,
Nhờ bạn kiểm tra lại dùm cho mình được không,
Cảm ơn.
Bạn sửa lại như sau:
Rich (BB code):
Private Function InitializeDic(ByRef aEngineer As Variant) As Object
Dim i As Long, k As Long
Set InitializeDic = CreateObject("Scripting.Dictionary")
k = 1
For i = 1 To UBound(aEngineer, 1) - 1
    If aEngineer(i, 1) <> aEngineer(i + 1, 1) Then
        If aEngineer(i, 1) = "" Then
            InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        Else
            InitializeDic.Item(aEngineer(i, 1)) = Array(k, i)
        End If
        k = i + 1
    ElseIf aEngineer(i, 1) = "" And aEngineer(i, 2) <> aEngineer(i + 1, 2) Then
        InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        k = i + 1
    End If
Next
End Function
 
Upvote 0
Bạn sửa lại như sau:
Rich (BB code):
Private Function InitializeDic(ByRef aEngineer As Variant) As Object
Dim i As Long, k As Long
Set InitializeDic = CreateObject("Scripting.Dictionary")
k = 1
For i = 1 To UBound(aEngineer, 1) - 1
    If aEngineer(i, 1) <> aEngineer(i + 1, 1) Then
        If aEngineer(i, 1) = "" Then
            InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        Else
            InitializeDic.Item(aEngineer(i, 1)) = Array(k, i)
        End If
        k = i + 1
    ElseIf aEngineer(i, 1) = "" And aEngineer(i, 2) <> aEngineer(i + 1, 2) Then
        InitializeDic.Item("_" & aEngineer(i, 2)) = Array(k, i)
        k = i + 1
    End If
Next
End Function
Cảm ơn Bạn nha, kết quả đúng hết rồi.:):1a:
 
Upvote 0
Web KT

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

Back
Top Bottom