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 sao chép dữ liệu từ nhiều Sheet vào một Sheet duy nhất bằng VBA

Huỳnh Trọng Đào 08/04/2026 11:06 121 lượt xem 3 trả lời

Chào mọi người, mình là dân văn phòng và thường xuyên phải làm việc với Excel. Dạo gần đây mình có một task khá đau đầu là phải tổng hợp dữ liệu từ rất nhiều file Excel khác nhau, mỗi file lại có nhiều sheet chứa thông tin tương tự. Việc copy paste thủ công từng sheet vào một file tổng hợp tốn rất nhiều thời gian và dễ sai sót.

Sau một thời gian mày mò, mình đã viết được một đoạn code VBA nhỏ để tự động hóa việc này. Code sẽ duyệt qua tất cả các sheet trong một file Excel mở lên, sau đó sao chép toàn bộ dữ liệu (trừ dòng tiêu đề nếu có) và dán vào một sheet đích đã được chỉ định. Các bạn có thể tùy chỉnh tên sheet đích cho phù hợp.

Đây là đoạn code mình dùng:

Sub CopyDataFromMultipleSheets() 
    Dim wsSource As Worksheet
    Dim wsTarget As Worksheet
    Dim lRow As Long
    Dim nextRow As Long

    ' Đặt tên Sheet đích
    Const TARGET_SHEET_NAME As String = "TongHopData"

    ' Kiểm tra xem Sheet đích đã tồn tại chưa, nếu chưa thì tạo mới
    On Error Resume Next
    Set wsTarget = ThisWorkbook.Sheets(TARGET_SHEET_NAME)
    On Error GoTo 0

    If wsTarget Is Nothing Then
        Set wsTarget = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        wsTarget.Name = TARGET_SHEET_NAME
    End If

    ' Xóa dữ liệu cũ trên Sheet đích (tùy chọn)
    wsTarget.Cells.ClearContents

    ' Duyệt qua từng Sheet trong file hiện tại
    For Each wsSource In ThisWorkbook.Worksheets
        ' Bỏ qua Sheet đích
        If wsSource.Name  TARGET_SHEET_NAME Then
            ' Tìm dòng cuối cùng có dữ liệu trên Sheet nguồn (bỏ qua dòng tiêu đề)
            lRow = wsSource.Cells(Rows.Count, "A").End(xlUp).Row
            If lRow > 1 Then ' Chỉ copy nếu có dữ liệu ngoài tiêu đề
                ' Tìm dòng trống tiếp theo trên Sheet đích
                nextRow = wsTarget.Cells(Rows.Count, "A").End(xlUp).Row + 1

                ' Copy dữ liệu từ Sheet nguồn (từ dòng 2 để bỏ qua tiêu đề) đến Sheet đích
                wsSource.Range("A2:Z" & lRow).Copy Destination:=wsTarget.Cells(nextRow, "A") ' Điều chỉnh cột Z nếu cần
            End If
        End If
    Next wsSource

    MsgBox "Đã tổng hợp dữ liệu xong!", vbInformation
End Sub

Lưu ý:

  • Bạn cần thay đổi TARGET_SHEET_NAME nếu muốn đặt tên khác cho Sheet tổng hợp.
  • Dòng wsSource.Range("A2:Z" & lRow).Copy Destination:=wsTarget.Cells(nextRow, "A") có thể cần điều chỉnh phạm vi cột (ví dụ: A2:AZ) tùy thuộc vào số lượng cột dữ liệu thực tế của bạn.
  • Đoạn code này sẽ xóa sạch dữ liệu cũ trên Sheet đích trước khi copy dữ liệu mới. Nếu bạn muốn thêm dữ liệu vào cuối, hãy bỏ dòng wsTarget.Cells.ClearContents.

Hy vọng chia sẻ này hữu ích cho những ai đang gặp phải vấn đề tương tự. Nếu có cách nào tốt hơn hoặc cần chỉnh sửa gì, mọi người cho ý kiến nhé!

0

Hay quá bạn ơi! Mình cũng đang "vật lộn" với việc tổng hợp dữ liệu tương tự. Bạn có thể chia sẻ đoạn code VBA đó không? Mình muốn xem cách bạn xử lý các sheet khác nhau trong cùng một file. Cảm ơn bạn nhiều!

2
Hay quá bạn ơi! Mình cũng đang "vật lộn" với việc tổng hợp dữ liệu tương tự. Bạn có thể chia sẻ đoạn code VBA đó không? Mình muốn xem cách bạn xử lý các sheet khác nhau trong cùng một file. Cảm ơn bạn nhiều!
5
Mình cũng từng bị "ám ảnh" với việc tổng hợp dữ liệu thủ công như bạn vậy. Đúng là tốn công mà lại dễ sai sót thật. Code VBA của bạn nghe hay quá, bạn có thể cho mọi người cùng xem để học hỏi thêm không? Đặc biệt là phần xử lý các sheet khác nhau, mình tò mò xem bạn làm thế nào để tự động hóa nó.
2

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

Đăng nhập Đăng ký