Chào các anh em, dạo này mình hay phải làm báo cáo tổng hợp từ nhiều file Excel khác nhau, mỗi file lại có nhiều sheet. Việc copy-paste thủ công mất rất nhiều thời gian và dễ sai sót. Sau một hồi mày mò, mình đã viết được một đoạn code VBA khá hay để tự động hóa việc này. Hôm nay chia sẻ lên đây để anh em tham khảo và góp ý.
Mục đích của code:
- Tự động gom dữ liệu từ tất cả các sheet trong một file Excel đang mở (hoặc một file chỉ định) vào một sheet mới có tên là 'BaoCaoTongHop'.
- Giả định rằng các sheet cần gom dữ liệu có cấu trúc cột giống nhau.
- Bỏ qua sheet 'BaoCaoTongHop' nếu nó đã tồn tại để tránh lặp lại.
Code VBA:
Sub GopDuLieuTuNhieuSheet()
Dim ws As Worksheet
Dim wsDest As Worksheet
Dim rng As Range
Dim lastRow As Long
Dim firstRow As Boolean
On Error Resume Next
Set wsDest = ThisWorkbook.Sheets("BaoCaoTongHop")
If wsDest Is Nothing Then
Set wsDest = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDest.Name = "BaoCaoTongHop"
Else
wsDest.Cells.ClearContents ' Xóa dữ liệu cũ nếu sheet đã tồn tại
End If
On Error GoTo 0
firstRow = True
For Each ws In ThisWorkbook.Worksheets
If ws.Name wsDest.Name Then ' Bỏ qua sheet đích
Set rng = ws.UsedRange
If Not rng Is Nothing Then
If firstRow Then
rng.Copy Destination:=wsDest.Range("A1")
firstRow = False
Else
lastRow = wsDest.Cells(Rows.Count, "A").End(xlUp).Row + 1
rng.Offset(1, 0).Resize(rng.Rows.Count - 1, rng.Columns.Count).Copy Destination:=wsDest.Range(wsDest.Cells(lastRow, "A"), wsDest.Cells(lastRow + rng.Rows.Count - 2, rng.Columns.Count))
End If
End If
End If
Next ws
MsgBox "Đã gom dữ liệu xong vào sheet BaoCaoTongHop!", vbInformation
End Sub
Lưu ý:
- Code này sẽ copy toàn bộ dữ liệu từ các sheet khác vào sheet 'BaoCaoTongHop'. Nếu bạn muốn bỏ qua dòng tiêu đề của các sheet nguồn, cần chỉnh sửa lại phần copy cho phù hợp.
- Nếu các sheet có cấu trúc cột khác nhau, bạn cần xử lý thêm để đảm bảo dữ liệu được gom đúng.
Hy vọng chia sẻ này hữu ích cho mọi người. Nếu có cách nào tối ưu hơn, rất mong được chỉ giáo!