Chào mọi người, 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 mình vừa viết xong để tự động hóa việc tạo báo cáo định kỳ. Tình huống của mình là mỗi tháng đều phải tổng hợp số liệu từ nhiều file Excel con để tạo ra một báo cáo tổng hợp duy nhất. Trước đây mình làm thủ công mất khá nhiều thời gian, nhưng từ khi có đoạn code này thì mọi thứ trở nên đơn giản hơn rất nhiều.
Code này sẽ giúp bạn:
- Tự động mở tất cả các file Excel trong một thư mục chỉ định.
- Sao chép dữ liệu từ một sheet cụ thể trong mỗi file đó.
- Dán dữ liệu vào một sheet tổng hợp trong file báo cáo chính.
- Tự động xóa các dòng trống và định dạng lại bảng.
Dưới đây là đoạn code cơ bản, các bạn có thể tùy chỉnh cho phù hợp với nhu cầu của mình:
Sub TaoBaoCaoDinhKy()
Dim folderPath As String
Dim fileName As String
Dim wbSource As Workbook
Dim wsSource As Worksheet
Dim wbTarget As Workbook
Dim wsTarget As Worksheet
Dim lastRowTarget As Long
' Chỉ định thư mục chứa các file cần tổng hợp
folderPath = "C:\DuLieuBaoCao\" ' Thay đổi đường dẫn này
' Chỉ định file báo cáo chính và sheet đích
Set wbTarget = ThisWorkbook
Set wsTarget = wbTarget.Sheets("TongHop") ' Thay đổi tên sheet đích nếu cần
' Xóa dữ liệu cũ trên sheet đích
wsTarget.Cells.ClearContents
' Lấy tên file đầu tiên
fileName = Dir(folderPath & "*.xls*")
Do While fileName ""
' Bỏ qua chính file báo cáo hiện tại
If fileName wbTarget.Name Then
Set wbSource = Workbooks.Open(folderPath & fileName)
' Chỉ định sheet nguồn trong các file con
Set wsSource = wbSource.Sheets("Sheet1") ' Thay đổi tên sheet nguồn nếu cần
' Tìm dòng cuối cùng trên sheet đích
lastRowTarget = wsTarget.Cells(Rows.Count, "A").End(xlUp).Row
' Sao chép dữ liệu từ sheet nguồn
wsSource.UsedRange.Copy
' Dán dữ liệu vào sheet đích
wsTarget.Cells(lastRowTarget + 1, "A").PasteSpecial xlPasteValues
' Đóng file nguồn mà không lưu
wbSource.Close SaveChanges:=False
End If
fileName = Dir
Loop
' Tự động xóa dòng trống (nếu có)
On Error Resume Next
wsTarget.AutoFilterMode = False
wsTarget.Columns("A:Z").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
On Error GoTo 0
' Tự động định dạng bảng (tùy chọn)
With wsTarget.ListObjects.Add(xlSrcRange, wsTarget.UsedRange, , xlYes)
.Name = "BaoCao" ' Đặt tên cho bảng
.TableStyle = "TableStyleMedium9" ' Chọn kiểu bảng
End With
MsgBox "Đã tạo báo cáo thành công!", vbInformation
End SubHy vọng chia sẻ này hữu ích với mọi người. Nếu có thắc mắc hoặc cần tùy chỉnh gì, cứ comment bên dưới nhé!