Chào các bạn, mình là thành viên mới của diễn đàn. Hôm nay mình muốn chia sẻ một đoạn code VBA nhỏ mình tự viết để giải quyết bài toán tổng hợp dữ liệu từ nhiều file Excel con thành một file báo cáo duy nhất. Tình huống của mình là có nhiều file excel báo cáo bán hàng theo từng tháng, và mình cần tổng hợp tất cả lại vào một file báo cáo tổng kết quý.
Trước đây, mình thường phải copy từng file rồi paste thủ công, rất mất thời gian và dễ sai sót. Sau khi tìm hiểu VBA, mình đã tạo ra một macro có thể tự động mở từng file trong một thư mục chỉ định, copy dữ liệu từ một sheet cụ thể (ví dụ: Sheet1) và paste vào một sheet mới trong file báo cáo chính. Các bạn có thể tùy chỉnh tên sheet, phạm vi dữ liệu cần copy và đường dẫn thư mục cho phù hợp với nhu cầu của mình.
Đây là đoạn code cơ bản:
Sub TongHopDuLieu()
Dim folderPath As String
Dim fileName As String
Dim wbSource As Workbook
Dim wsSource As Worksheet
Dim wsTarget As Worksheet
Dim lastRowTarget As Long
' Thiết lập đường dẫn thư mục chứa các file Excel con
folderPath = Application.InputBox("Nhập đường dẫn thư mục chứa các file Excel con:", "Chọn thư mục", Type:=2)
If folderPath = "False" Or folderPath = "" Then Exit Sub
' Thiết lập sheet đích trong file báo cáo chính
Set wsTarget = ThisWorkbook.Sheets("BaoCaoTongHop") ' Đổi tên sheet nếu cần
' Xóa dữ liệu cũ trên sheet đích trước khi tổng hợp mới (tùy chọn)
wsTarget.Cells.ClearContents
' Lấy tên file đầu tiên trong thư mục
fileName = Dir(folderPath & "*.xls*") ' Thay f*.xls* nếu tên file có quy luật khác
Do While fileName <> ""
' Bỏ qua chính file báo cáo tổng hợp nếu nó nằm trong thư mục
If fileName <> ThisWorkbook.Name Then
' Mở file Excel con
Set wbSource = Workbooks.Open(folderPath & "" & fileName)
Set wsSource = wbSource.Sheets("Sheet1") ' Đổi tên sheet nguồn nếu cần
' Tìm dòng cuối cùng có dữ liệu trên sheet nguồn
Dim lastRowSource As Long
lastRowSource = wsSource.Cells(Rows.Count, "A").End(xlUp).Row
' Tìm dòng trống tiếp theo trên sheet đích
lastRowTarget = wsTarget.Cells(Rows.Count, "A").End(xlUp).Row + 1
' Copy dữ liệu từ sheet nguồn sang sheet đích (từ dòng 2 để bỏ qua tiêu đề)
wsSource.Range("A2:Z" & lastRowSource).Copy _
Destination:=wsTarget.Range("A" & lastRowTarget) ' Điều chỉnh phạm vi A2:Z cho phù hợp
' Đóng file Excel con mà không lưu thay đổi
wbSource.Close SaveChanges:=False
End If
' Lấy tên file tiếp theo
fileName = Dir
Loop
MsgBox "Đã tổng hợp dữ liệu xong!"
End SubCác bạn chỉ cần lưu đoạn code này vào một module trong file Excel báo cáo chính, sau đó chạy macro TongHopDuLieu. Đừng quên điều chỉnh tên sheet nguồn, tên sheet đích và phạm vi dữ liệu trong code cho khớp với file của bạn nhé.
Hy vọng chia sẻ này hữu ích cho các bạn đang gặp vấn đề tương tự. Nếu có thắc mắc hoặc cách làm hay hơn, mọi người cùng thảo luận nhé!