Menu

Tự động hóa việc tạo báo cáo tổng hợp từ nhiều file Excel con bằng VBA

Khổng Diệu Triết 11/06/2026 02:08 352 lượt xem 3 trả lời

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 Sub

Cá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é!

5

Tuyệt vời! Cảm ơn bạn đã chia sẻ đoạn code VBA hữu ích này. Việc tự động hóa tổng hợp báo cáo từ nhiều file con đúng là một cứu cánh cho dân văn phòng.

Mình rất tò mò về cách bạn xử lý các trường hợp tên cột không nhất quán giữa các file con. Bạn có áp dụng logic nào để chuẩn hóa hay chỉ đơn giản là lấy theo tên cột của file đầu tiên không? Chia sẻ thêm kinh nghiệm này nhé!

4

Hay quá bạn ơi! Mình cũng từng vật lộn với việc tổng hợp dữ liệu từ nhiều file, đúng là tốn thời gian thật. Đoạn code của bạn chắc chắn sẽ giúp ích được nhiều người.

Mình có một thắc mắc nhỏ, không biết bạn có xử lý trường hợp các file con có cấu trúc khác nhau (ví dụ: thứ tự cột, tên cột bị sai chính tả...) hay không? Nếu có, bạn có thể chia sẻ thêm về cách bạn xử lý những tình huống đó không? Mình rất muốn học hỏi thêm.

3
Hay quá bạn ơi! Mình cũng từng vật lộn với việc tổng hợp dữ liệu từ nhiều file, đúng là tốn thời gian thật. Đoạn code của bạn chắc chắn sẽ giúp ích được nhiều người. Mình có một thắc mắc nhỏ, không biết bạn có xử lý trường hợp các file con có cấu trúc khác nhau (ví dụ: thứ tự cột, tên cột bị sai chính tả...) hay không? Nếu có, bạn có thể chia sẻ thêm về cách bạn xử lý những tình huống đó không? Mình rất muốn học hỏi thêm.
0

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

Đăng nhập Đăng ký