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_NAMEnế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é!