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 thống kê đơn giản bằng VBA

Lường Nghĩa Quỳnh 12/04/2026 16:15 195 lượt xem 2 trả lời

Chào các bác, hôm nay em muốn chia sẻ một chút kinh nghiệm nhỏ về việc tự động hóa tạo báo cáo thống kê đơn giản bằng VBA. Tình huống của em là thường xuyên phải làm các báo cáo tổng hợp số liệu từ nhiều file excel nhỏ, mỗi file lại có cấu trúc gần giống nhau. Thay vì ngồi copy paste thủ công, em đã viết một đoạn code VBA để xử lý việc này.

Về cơ bản, code sẽ:

  • Mở lần lượt các file excel trong một thư mục chỉ định.
  • Sao chép dữ liệu từ một sheet cụ thể (ví dụ: 'Data') trong mỗi file.
  • Dán vào một sheet tổng hợp trong file chính.
  • Đóng file con lại sau khi sao chép.

Đoạn code minh họa cho việc lấy dữ liệu từ sheet 'Sheet1' của các file trong thư mục 'DataFiles':

Sub CombineData() 
    Dim FolderPath As String
    Dim FileName As String
    Dim wsDest As Worksheet
    Dim wsSource As Worksheet
    Dim LastRowDest As Long
    Dim LastRowSource As Long

    Set wsDest = ThisWorkbook.Sheets("Summary") ' Sheet đích để dán dữ liệu
    FolderPath = ThisWorkbook.Path & "\DataFiles\" ' Đường dẫn đến thư mục chứa file excel con

    FileName = Dir(FolderPath & "*.xls*") ' Lấy tên file đầu tiên

    Application.ScreenUpdating = False ' Tắt cập nhật màn hình để code chạy nhanh hơn

    Do While FileName  ""
        If FileName  ThisWorkbook.Name Then ' Tránh mở chính file đang chạy code
            Workbooks.Open FolderPath & FileName
            Set wsSource = ActiveWorkbook.Sheets("Sheet1") ' Sheet nguồn cần lấy dữ liệu

            LastRowDest = wsDest.Cells(Rows.Count, "A").End(xlUp).Row + 1 ' Tìm dòng cuối cùng ở sheet đích
            LastRowSource = wsSource.Cells(Rows.Count, "A").End(xlUp).Row ' Tìm dòng cuối cùng ở sheet nguồn

            ' Copy dữ liệu từ sheet nguồn sang sheet đích
            wsSource.Range("A2:Z" & LastRowSource).Copy wsDest.Range("A" & LastRowDest)

            ActiveWorkbook.Close SaveChanges:=False ' Đóng file con mà không lưu
        End If
        FileName = Dir ' Lấy tên file tiếp theo
    Loop

    Application.ScreenUpdating = True ' Bật lại cập nhật màn hình
    MsgBox "Đã tổng hợp xong dữ liệu!", vbInformation
End Sub

Lưu ý: Các bạn cần chỉnh sửa tên sheet đích ("Summary"), sheet nguồn ("Sheet1"), đường dẫn thư mục (FolderPath) và phạm vi dữ liệu ("A2:Z") cho phù hợp với file của mình.

Cách này rất tiện lợi cho việc gom dữ liệu hàng ngày, hàng tuần. Có bác nào có cách làm hay hơn hoặc muốn thảo luận thêm về phần này không ạ?

0

Hay quá bạn ơi! Mình cũng đang "vật lộn" với việc tổng hợp số liệu từ nhiều file tương tự. Code của bạn có vẻ giải quyết được đúng "nỗi đau" này.

Cho mình hỏi thêm một chút nhé: Bạn xử lý trường hợp các file có cấu trúc "gần giống nhau" nhưng có thể thiếu/thừa một vài cột ở các vị trí khác nhau không? Hay là bạn chỉ áp dụng cho các file có cấu trúc hoàn toàn giống nhau?

Nếu được, bạn có thể chia sẻ thêm về cách bạn xác định sheet 'Data' trong mỗi file không? Có phải sheet đó luôn có tên cố định, hay bạn tìm theo một tiêu chí nào khác?

3

Chào bạn,

Cảm ơn bạn đã chia sẻ kinh nghiệm rất hữu ích này! Việc tự động hóa tổng hợp số liệu từ nhiều file là một vấn đề mà rất nhiều người gặp phải. Đoạn code VBA của bạn chắc chắn sẽ giúp tiết kiệm kha khá thời gian và công sức.

Mình cũng rất tò mò về cách bạn xử lý các trường hợp file có cấu trúc "gần giống nhau" như bạn đề cập. Cụ thể, nếu có file bị thiếu một vài cột hoặc các cột đó bị sắp xếp lộn xộn thì code của bạn có xử lý được không? Hay bạn chỉ áp dụng cho những file có cấu trúc cột hoàn toàn giống nhau?

Nếu có thể, bạn có thể chia sẻ thêm về cách bạn xác định sheet 'Data' trong mỗi file không? Có phải sheet đó luôn có tên cố định, hay bạn tìm theo một tiêu chí nào khác (ví dụ: sheet đầu tiên, sheet có tên chứa từ khóa nào đó...)?

Mong nhận được phản hồi từ bạn!

5

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

Đăng nhập Đăng ký