Xin giúp đỡ code tổng hợp dữ liệu từ bảng có sẵn

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

timeflies0410

Thành viên mới
Tham gia
21/4/21
Bài viết
5
Được thích
1
Dạ xin chào các anh/ chị,

Em có file excel tổng hợp lỗi kiểm hàng hằng tháng của chuyền may, dữ liệu hiện tại như hình bên dưới, giờ em muốn chuyển sang dạng chi tiết theo từng ngày của từng chuyền nhưng em chưa suy nghĩ ra code (hiện tại thì em đang dùng hàm sumifs để tổng hợp). Nhờ các anh/chị trợ giúp thêm.

1709782419895.png

Cảm ơn các anh/chị ạ.
 

File đính kèm

  • LoiTheoThang.xlsb
    32.3 KB · Đọc: 12
Dùng SUMIFS là chuẩn rồi, sao bạn cần code vậy?
 
Upvote 0
Dùng SUMIFS là chuẩn rồi, sao bạn cần code vậy?
Dạ, do đặc thù công việc mình cũng hay phải tổng hợp các file có tính chất giống như vầy, dữ liệu triết xuất ra từ phần mềm nhiều dòng & cột, add công thức vào thì file sẽ nặng và load lâu, nên mình cũng muốn có code để rút gọn thời gian, cho file nhẹ hơn và học hỏi thêm được code.
 
Upvote 0
Bạn có muốn tự động cả tiêu đề cột (chuyền) và dòng (2-31) luôn không, hay đó là điền tay cố định?
Bài đã được tự động gộp:

Theo bảng này của bạn thì dùng cho 24 chuyền và trong 1 tháng 30-31 ngày, nghĩa là data không nhiều ( maximum 24*31=744 ô kết quả)
Còn nếu căn cứ theo tinh thần của bài 3, file thực có nhiều dòng nhiều cột, nghĩa là thời gian trải qua nhiều tháng, nhiều năm?
Nếu đúng vậy thì bạn post file thực tế, và ngày sẽ là ngày tháng năm đầy đủ. Ví dụ: số 2 sẽ là ngày 02/03/2024 chẳng hạn
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ xin chào các anh/ chị,

Em có file excel tổng hợp lỗi kiểm hàng hằng tháng của chuyền may, dữ liệu hiện tại như hình bên dưới, giờ em muốn chuyển sang dạng chi tiết theo từng ngày của từng chuyền nhưng em chưa suy nghĩ ra code (hiện tại thì em đang dùng hàm sumifs để tổng hợp). Nhờ các anh/chị trợ giúp thêm.

View attachment 299430

Cảm ơn các anh/chị ạ.
Tham khảo hàm sau (là theo dữ liệu đã cho)-Không biết có đúng ý không.
I5=IFNA(LOOKUP(2;1/($A$5:$A$540=I$4)/($B$5:$B$540=$H5);$F$5:$F$540);"")
Copy cho các ô còn lại
 
Upvote 0
Bạn có muốn tự động cả tiêu đề cột (chuyền) và dòng (2-31) luôn không, hay đó là điền tay cố định?
Bài đã được tự động gộp:

Theo bảng này của bạn thì dùng cho 24 chuyền và trong 1 tháng 30-31 ngày, nghĩa là data không nhiều ( maximum 24*31=744 ô kết quả)
Còn nếu căn cứ theo tinh thần của bài 3, file thực có nhiều dòng nhiều cột, nghĩa là thời gian trải qua nhiều tháng, nhiều năm?
Nếu đúng vậy thì bạn post file thực tế, và ngày sẽ là ngày tháng năm đầy đủ. Ví dụ: số 2 sẽ là ngày 02/03/2024 chẳng hạn
Dạ, theo file hiện tại thì em chỉ trích dẫn dữ liệu trong tháng 2 thôi, ở dòng ngày và cột chuyền em đã có code VBA dùng dictionary để lấy dữ liệu từ bảng gốc sang. Giả sử về sau cần tổng hợp theo quý hoặc năm thì dữ liệu chi tiết % lỗi hằng ngày sẽ dài ra hơn (theo số ngày của từng tháng, sử dụng nhiều cột hơn, và ngày sẽ được định dạng đầy đủ: 01/02/2024 - 31/03/2024).
Bài đã được tự động gộp:

Tham khảo hàm sau (là theo dữ liệu đã cho)-Không biết có đúng ý không.
I5=IFNA(LOOKUP(2;1/($A$5:$A$540=I$4)/($B$5:$B$540=$H5);$F$5:$F$540);"")
Copy cho các ô còn lại
Dạ công thức này em copy vào thì kết quả vẫn đúng. Cảm ơn anh nhiều ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì mình đã lường trước data của bạn và nhờ bạn post file thực tế lên mới làm được.
Khoảng vài trăm dòng của 2-3 tháng là được rồi
 
Upvote 0
Thì mình đã lường trước data của bạn và nhờ bạn post file thực tế lên mới làm được.
Khoảng vài trăm dòng của 2-3 tháng là được rồi
Dạ, em đính kèm lại file, có dữ liệu của tháng 01/24 & 02/24, nhờ anh xem giúp nha.
 

File đính kèm

  • LoiTheoThang.xlsb
    39.5 KB · Đọc: 17
Upvote 0
Thì dùng hàm Sumifs là được rồi, cần gì phải dùng code
Dạ, em đính kèm lại file, có dữ liệu của tháng 01/24 & 02/24, nhờ anh xem giúp nha.
Mã:
Sub Test3()
Dim sArr(), dArr(), i As Long, sNgay(), n As Long, k As Long, Tmp As String
Dim DicNgay As Object, Dic As Object, Col As Long, x As Long
Set Dic = CreateObject("scripting.dictionary")
Set DicNgay = CreateObject("scripting.dictionary")
With Sheets("Sheet1")
    sArr = .Range("A5", .Range("A" & Rows.Count).End(3)).Resize(, 6).Value
End With
For i = 1 To UBound(sArr)
    Tmp = CStr(sArr(i, 1))
    If Not DicNgay.exists(Tmp) Then
        n = n + 1
        DicNgay.Add Tmp, n
        ReDim Preserve sNgay(1 To n)
        sNgay(n) = sArr(i, 1)
    End If
Next
ReDim dArr(1 To UBound(sArr), 1 To 1 + UBound(sNgay))
For i = 1 To UBound(sArr)
    Tmp = CStr(sArr(i, 2))
    If Not Dic.exists(Tmp) Then
        k = k + 1
        Dic.Add Tmp, k
        dArr(k, 1) = sArr(i, 2)
        Tmp = CStr(sArr(i, 1))
        Col = DicNgay.Item(Tmp)
        dArr(k, Col + 1) = sArr(i, 6)
    Else
        x = Dic.Item(Tmp)
        Tmp = CStr(sArr(i, 1))
        Col = DicNgay.Item(Tmp)
        dArr(x, Col + 1) = sArr(i, 6)
    End If
Next
With Sheets("Sheet1")
    .Range("I4").Resize(, n) = sNgay
    .Range("H5").Resize(k, UBound(dArr, 2)) = dArr
End With
End Sub
Bạn thử code này. Chạy 1 Sub là được rồi
 
Upvote 0
Dạ, do đặc thù công việc mình cũng hay phải tổng hợp các file có tính chất giống như vầy, dữ liệu triết xuất ra từ phần mềm nhiều dòng & cột, add công thức vào thì file sẽ nặng và load lâu, nên mình cũng muốn có code để rút gọn thời gian, cho file nhẹ hơn và học hỏi thêm được code.
Học hỏi kiểu này là học kiểu lười biếng. Người giỏi VBA sẽ có khuynh hướng lười học các chức năng của Excel.
Mà vấn đề nặng file (*) đáng lẽ phải được thử giải quyết bằng cách thiết kế lại bảng tính, dùng các công cụ Query,...

(*) một trăm tay muốn dùng code hết 99 đưa ra cớ "nặng file". Thực tế chỉ là họ biết dân GPE thích code cho nên cố tình gãi đúng chỗ ngứa, giải quyết vấn đề nhanh cái vèo.
 
Upvote 0
Thì dùng hàm Sumifs là được rồi, cần gì phải dùng code

Mã:
Sub Test3()
Dim sArr(), dArr(), i As Long, sNgay(), n As Long, k As Long, Tmp As String
Dim DicNgay As Object, Dic As Object, Col As Long, x As Long
Set Dic = CreateObject("scripting.dictionary")
Set DicNgay = CreateObject("scripting.dictionary")
With Sheets("Sheet1")
    sArr = .Range("A5", .Range("A" & Rows.Count).End(3)).Resize(, 6).Value
End With
For i = 1 To UBound(sArr)
    Tmp = CStr(sArr(i, 1))
    If Not DicNgay.exists(Tmp) Then
        n = n + 1
        DicNgay.Add Tmp, n
        ReDim Preserve sNgay(1 To n)
        sNgay(n) = sArr(i, 1)
    End If
Next
ReDim dArr(1 To UBound(sArr), 1 To 1 + UBound(sNgay))
For i = 1 To UBound(sArr)
    Tmp = CStr(sArr(i, 2))
    If Not Dic.exists(Tmp) Then
        k = k + 1
        Dic.Add Tmp, k
        dArr(k, 1) = sArr(i, 2)
        Tmp = CStr(sArr(i, 1))
        Col = DicNgay.Item(Tmp)
        dArr(k, Col + 1) = sArr(i, 6)
    Else
        x = Dic.Item(Tmp)
        Tmp = CStr(sArr(i, 1))
        Col = DicNgay.Item(Tmp)
        dArr(x, Col + 1) = sArr(i, 6)
    End If
Next
With Sheets("Sheet1")
    .Range("I4").Resize(, n) = sNgay
    .Range("H5").Resize(k, UBound(dArr, 2)) = dArr
End With
End Sub
Bạn thử code này. Chạy 1 Sub là được rồi
Dạ code chạy được rồi, em cảm ơn anh Hải nhiều.
 
Upvote 0
Web KT
Back
Top Bottom