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 copy dữ liệu từ nhiều file Excel về một file duy nhất bằng VBA

Lỗ Quang Bích 10/03/2026 01:51 263 lượt xem 3 trả lời

Chào các anh em trong diễn đàn,

Dạo này mình đang phải xử lý một đống báo cáo từ các phòng ban gửi về, mỗi phòng một file Excel. Việc copy thủ công từng sheet một sang file tổng hợp tốn rất nhiều thời gian và dễ sai sót. Mình nghĩ chắc chắn phải có cách nào đó dùng VBA để tự động hóa việc này.

Hiện tại, mình đã thử tìm hiểu trên mạng nhưng chủ yếu là copy dữ liệu từ một file sang file khác, hoặc copy toàn bộ sheet. Yêu cầu của mình phức tạp hơn một chút là:

  • Mở lần lượt từng file Excel trong một thư mục chỉ định.
  • Copy một sheet cụ thể (ví dụ sheet tên là 'KetQua') từ mỗi file đó.
  • Dán dữ liệu vào cuối cùng của một sheet trong file tổng hợp (file đang chạy code).
  • Đóng file nguồn mà không lưu thay đổi.

Mình đã thử viết một đoạn code đơn giản nhưng gặp khó khăn ở chỗ làm sao để lặp qua tất cả các file trong thư mục và chỉ định đúng sheet cần copy. Có ai đã từng làm qua hoặc có kinh nghiệm xử lý dạng này không, chỉ giúp mình với ạ? Một đoạn code mẫu hoặc gợi ý về cách xử lý vòng lặp và đường dẫn file sẽ rất hữu ích.

Cảm ơn mọi người!

3

Chào bạn,

Việc xử lý "đống" báo cáo này đúng là đau đầu thật! Mình cũng từng gặp tình huống tương tự, tốn cả buổi sáng chỉ để copy paste.

Bạn đã thử copy dữ liệu từ một file sang file khác rồi, vậy bạn có thể cho mình biết bạn muốn copy dữ liệu cụ thể nào từ mỗi file báo cáo không? Ví dụ: chỉ copy một vùng nhất định, hay copy toàn bộ sheet trừ một vài cột? Điều này sẽ giúp mọi người hình dung rõ hơn và đưa ra giải pháp tối ưu hơn cho bạn.

Nếu các file báo cáo nằm chung trong một thư mục và bạn chỉ cần copy toàn bộ dữ liệu từ một sheet có tên cố định (ví dụ "Data") của mỗi file, thì cách làm của bạn kia cũng là một hướng đi tốt. Tuy nhiên, để xử lý trường hợp phức tạp hơn, ví dụ cần chọn lọc cột hoặc dòng, thì có thể cân nhắc dùng thêm vòng lặp For Each hoặc các phương thức đọc dữ liệu trực tiếp thay vì copy/paste.

1

Chào bạn,

Vấn đề bạn đang gặp phải khá phổ biến khi làm việc với nhiều file Excel. Việc tự động hóa copy dữ liệu từ nhiều file về một file tổng hợp bằng VBA là hoàn toàn khả thi.

Bạn đã thử tìm hiểu các giải pháp copy từ một file sang file khác rồi, vậy bạn có thể chia sẻ cụ thể hơn về cấu trúc thư mục chứa các file báo cáo đó không? Ví dụ: các file có cùng tên theo một quy luật nào đó, hay chúng nằm trong các thư mục con khác nhau? Thông tin này sẽ giúp mình đưa ra gợi ý chính xác hơn.

Nếu các file nằm chung trong một thư mục và bạn chỉ cần copy dữ liệu từ một sheet nhất định (ví dụ Sheet1) của mỗi file đó sang file tổng hợp, thì đoạn code sau có thể là một điểm khởi đầu tốt:


Sub CopyDataFromMultipleFiles()
    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

    ' Đặt đường dẫn đến thư mục chứa các file Excel
    folderPath = "C:\Your\Folder\Path\" ' Thay bằng đường dẫn thực tế

    ' Đặt tên file Excel đích (file tổng hợp)
    Set wbTarget = ThisWorkbook
    Set wsTarget = wbTarget.Sheets("Sheet1") ' Thay "Sheet1" bằng tên sheet bạn muốn dán dữ liệu vào

    fileName = Dir(folderPath & ".xls") ' Lấy tất cả các file có đuôi .xls, .xlsx, .xlsm

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

    Do While fileName  ""
        ' Bỏ qua file tổng hợp hiện tại nếu nó nằm trong thư mục
        If fileName  wbTarget.Name Then
            Set wbSource = Workbooks.Open(folderPath & fileName)
            Set wsSource = wbSource.Sheets("Sheet1") ' Thay "Sheet1" bằng tên sheet bạn muốn copy

            ' Tìm dòng cuối cùng ở file đích để dán dữ liệu tiếp theo
            lastRowTarget = wsTarget.Cells(Rows.Count, "A").End(xlUp).Row + 1

            ' Copy dữ liệu từ sheet nguồn sang sheet đích
            wsSource.UsedRange.Copy wsTarget.Cells(lastRowTarget, 1)

            wbSource.Close False ' Đóng file nguồn 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 "Đã copy dữ liệu thành công!", vbInformation
End Sub

Bạn nhớ thay thế đường dẫn thư mục và tên sheet cho phù hợp nhé.

2

Chào bạn,

Hiểu được nỗi khổ khi phải xử lý "đống" báo cáo thủ công! Việc này đúng là tốn thời gian và dễ sai sót thật.

Bạn đã thử tìm hiểu cách copy từ một file sang file khác, vậy cho mình hỏi bạn muốn copy cụ thể phần dữ liệu nào từ mỗi file báo cáo vậy? Ví dụ, bạn chỉ lấy một vài cột nhất định, hay lấy toàn bộ dữ liệu nhưng bỏ qua dòng tiêu đề chẳng hạn?

Nếu các file báo cáo nằm chung trong một thư mục và bạn chỉ cần copy toàn bộ dữ liệu từ một sheet có tên cố định (ví dụ "Sheet1") của mỗi file, thì cách làm bạn kia đưa ra là một hướng đi tốt. Còn nếu muốn xử lý linh hoạt hơn, ví dụ chọn lọc cột/dòng, thì có thể cần tới vòng lặp For Each hoặc các phương thức đọc dữ liệu trực tiếp thay vì copy/paste để tối ưu hơn.

5

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

Đăng nhập Đăng ký