Bài này dùng thủ công nhanh hơn viết code.Chào các bác!
Em đang cần tổng hợp dữ liệu từ nhiều bảng trong cùng một sheet lại với nhau và lấy giá trị duy nhất
Chi tiết như em gửi file đính kèm
Nhờ các bác giúp em với ạ
Em chỉ lấy ví dụ thôi ạ, dữ liệu của em rất nhiều nên làm thủ công rất mất thời gian bác ạBài này dùng thủ công là cũng được rồi, cần gì đến lập trình nhỉ?
Làm chậm cũng không đến hai phút.làm thủ công rất mất thời gian bác ạ
Bác hướng dẫn em với ạLàm chậm cũng không đến hai phút.
Anh Tuấn nói đúng mà bạn, trong 1 sheet mà có tới 18-25 bảng nhỏ như vậy thì viết luôn mấy công thức đơn giản, gắp dữ liệu cho vào bảng tổng hợp là được thôi, chứ code làm gì cho mất thời gian trong khi không hiệu quả bằng công thức. Có lẽ nào ngay cả hàm Vlookup và Iferror mà bạn cũng không sử dụng được ?trong 1 sheet có khoảng 18 - 25 bảng nhỏ như vậy ạ
Cảm ơn bác, mỗi bảng của em có nhiều dòng dữ liệu, gắp vào chung rồi remove duplicates sau đó vlookup lấy dữ liệu từ nhiều bảng thì cũng mất không ít thời gian bác ạAnh Tuấn nói đúng mà bạn, trong 1 sheet mà có tới 18-25 bảng nhỏ như vậy thì viết luôn mấy công thức đơn giản, gắp dữ liệu cho vào bảng tổng hợp là được thôi, chứ code làm gì cho mất thời gian trong khi không hiệu quả bằng công thức. Có lẽ nào ngay cả hàm Vlookup và Iferror mà bạn cũng không sử dụng được ?
Bạn có thể up file có cấu trúc thật của bạn lên được không, không cần chứa dữ liệu thật.Cảm ơn bác, mỗi bảng của em có nhiều dòng dữ liệu, gắp vào chung rồi remove duplicates sau đó vlookup lấy dữ liệu từ nhiều bảng thì cũng mất không ít thời gian bác ạ
chưa kể là em còn phải làm nhiều khi dữ liệu cập nhật mới, nên em muốn nhờ các bác ở đây viết code giúp em ạ
Làm cho bạn 3 bảng theo mẫu, nhiều bảng thì bạn có thể dùng vòng lặp để nối vào:Bác hướng dẫn em với ạ
dữ liệu của em trong 1 sheet có khoảng 18 - 25 bảng nhỏ như vậy ạ
Bài đã được tự động gộp:
Các bác ơi,
Em muốn tổng hợp thêm cả số lượng của từng bảng nhỏ vào bên cạnh nữa ạ
Sub Gop_HLMT()
Dim strSQL As String
strSQL = "SELECT 'Bang 1' as Rng, * From [A2:B5] Where F1 Is Not Null UNION ALL SELECT 'Bang 2' as Rng, * From [D2:E7] Where F1 Is Not Null UNION ALL SELECT 'Bang 3' as Rng, * From [H2:I9] Where F1 Is Not Null"
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
Sheet1.Range("M2").CopyFromRecordset .Execute("TRANSFORM Sum(a.F2) SELECT a.F1 FROM (" & strSQL & ") a GROUP BY a.F1 PIVOT a.Rng")
End With
End Sub
Em cảm ơn bác ạ,Làm cho bạn 3 bảng theo mẫu, nhiều bảng thì bạn có thể dùng vòng lặp để nối vào:
Mã:Sub Gop_HLMT() Dim strSQL As String strSQL = "SELECT 'Bang 1' as Rng, * From [A2:B5] Where F1 Is Not Null UNION ALL SELECT 'Bang 2' as Rng, * From [D2:E7] Where F1 Is Not Null UNION ALL SELECT 'Bang 3' as Rng, * From [H2:I9] Where F1 Is Not Null" With CreateObject("ADODB.Connection") .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No""" Sheet1.Range("M2").CopyFromRecordset .Execute("TRANSFORM Sum(a.F2) SELECT a.F1 FROM (" & strSQL & ") a GROUP BY a.F1 PIVOT a.Rng") End With End Sub
Lỗi thế nào bạn chụp màn hình tôi xem thử nhé.Em cảm ơn bác ạ,
Excel của em đang không chạy được code trên
Em dùng excel 2016 bác ạ
Đây là ví dụ với 6 bảng bác nhé.Bạn có thể up file có cấu trúc thật của bạn lên được không, không cần chứa dữ liệu thật.
Mình nghĩ nếu chỉ thao tác trong 1 sheet của 1 file thôi thì xài công thức vô tư.
Anh HLMT là đỉnh cao về ADO rồi.Ô, code này ngắn gọn mà nó chạy nhanh thật. Mặc dù em không hiểu nó là gì nhưng nhanh. 0.19s cho 6000 dòng.
Modify Code anh HLMT:Đây là ví dụ với 6 bảng bác nhé.
Mỗi lần dữ liệu sẽ làm mới toàn bộ dữ liệu
Làm bằng công thức cũng được bác ơi, nhưng nó mất nhiều thời gian và nặng nếu lưu công thức sẵn
Sub Gop_HLMT()
Dim strSQL As String
strSQL = "SELECT 'Bang 1' as Rng, * From [I4:J1001] Where F1 Is Not Null UNION ALL SELECT 'Bang 2' as Rng,* From [L4:M1001] Where F1 Is Not Null UNION ALL SELECT 'Bang 3' as Rng,* From [O4:P1001] Where F1 Is Not Null UNION ALL SELECT 'Bang 4' as Rng,* From [R4:S1001] Where F1 Is Not Null UNION ALL SELECT 'Bang 5' as Rng,* From [U4:V1001] Where F1 Is Not Null UNION ALL SELECT 'Bang 6' as Rng, * From [X4:Y1001] Where F1 Is Not Null"
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=No"""
Sheet1.Range("a4").CopyFromRecordset .Execute("TRANSFORM Sum(a.F2) SELECT a.F1 FROM (" & strSQL & ") a GROUP BY a.F1 PIVOT a.Rng")
End With
End Sub
Dữ liệu trong các bảng nhỏ của bạn mình thấy có 1 số cái trùng nhau, nên tham chiếu bằng công thức khá nặng và mất nhiều bước, mình không biết là bạn sẽ lấy cả 2 hay gộp chung lấy tổng lại.Đây là ví dụ với 6 bảng bác nhé.
Mỗi lần dữ liệu sẽ làm mới toàn bộ dữ liệu
Làm bằng công thức cũng được bác ơi, nhưng nó mất nhiều thời gian và nặng nếu lưu công thức sẵn
Nếu bài #1 mà nói luôn điều này và đưa dữ liệu sát thực tế hơn thì chắc không kéo dài nhiều bài thế này.dữ liệu của em rất nhiều
Chủ bài lại đợi lâu anh ạ.Kéo càng dài thì chủ đề càng sôi động, rôm rả.