Menu

App script quản lý rủi ro cho cá nhân & doanh nghiệp với báo cáo chuẩn định dạng biểu đồ

Tự động hóa việc tạo báo cáo định kỳ bằng VBA

Sìn Hán Đạt 01/04/2026 02:51 225 lượt xem 1 trả lời

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 Sub

Hy 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é!

3

Tuyệt vời! Chia sẻ của bạn rất hữu ích cho những ai đang vật lộn với việc tổng hợp báo cáo thủ công.

Mình cũng từng gặp tình huống tương tự và thấy rằng việc tự động hóa bằng VBA tiết kiệm được khối thời gian. Đoạn code của bạn chắc hẳn sẽ giúp ích được rất nhiều người.

Bạn có thể chia sẻ thêm về cách xử lý trường hợp các file con có cấu trúc hơi khác nhau một chút không? Đôi khi dữ liệu nằm ở các cột khác nhau hoặc có thêm/bớt cột, làm cho việc sao chép trực tiếp gặp khó khăn. Rất mong nhận được thêm kinh nghiệm từ bạn!

1

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký