Giả sử bạn muốn hợp nhất dữ liệu trong nhiều trang tính khác nhau vào một trang tính duy nhất với mã VBA. Bạn có thể sử dụng hàm LastRow (như trong ví dụ 1) hoặc LastCol (ở ví dụ 2).
Sub CopyRangeFromMultiWorksheets()
Dim sh As Worksheet
Dim DestSh As Worksheet
Dim Last As Long
Dim CopyRng As Range
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
'Delete the sheet "GitihoMergeSheet" if it exist
Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Worksheets("GitihoMergeSheet").Delete
On Error GoTo 0
Application.DisplayAlerts = True
'Add a worksheet with the name "GitihoMergeSheet"
Set DestSh = ActiveWorkbook.Worksheets.Add
DestSh.Name = "GitihoMergeSheet"
'loop through all worksheets and copy the data to the DestSh
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> DestSh.Name Then
'Find the last row with data on the DestSh
Last = LastRow(DestSh)
'Fill in the range that you want to copy
Set CopyRng = sh.Range("A1:G1")
'Test if there enough rows in the DestSh to copy all the data
If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
MsgBox "There are not enough rows in the Destsh"
GoTo ExitTheSub
End If
'This example copies values/formats, if you only want to copy the
'values or want to copy everything look at the example below this macro
CopyRng.Copy
With DestSh.Cells(Last + 1, "A")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
'Optional: This will copy the sheet name in the H column
DestSh.Cells(Last + 1, "H").Resize(CopyRng.Rows.Count).Value = sh.Name
End If
Next
ExitTheSub:
Application.Goto DestSh.Cells(1)
'AutoFit the column width in the DestSh sheet
DestSh.Columns.AutoFit
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Vui lòng xem thêm khóa học Tuyệt đỉnh VBA - Viết code trong tầm tay để tăng ít nhất 200% năng suất làm việc. Tự động hóa thao tác và nghiệp vụ trên Excel giúp bạn có thể tiết kiệm hàng giờ liền khi phải làm việc với các bảng tính nhàm chán.
Đoạn mã VBA để hợp nhất các trang tính excel ở trên đang chạy lệnh sao chép giá trị và định dạng của dữ liệu. Bạn hoàn toàn có thể tùy chỉnh chúng theo nhu cầu của mình.
Trong trường hợp bạn chỉ muốn sao chép giá trị, hãy thay thế đoạn
CopyRng.Copy
With DestSh.Cells(Last + 1, "A")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
Bằng đoạn code sau:
With CopyRng
DestSh.Cells(Last + 1, "A").Resize(.Rows.Count, _
.Columns.Count).Value = .Value
End With
Hoặc thay thế bằng đoạn code
CopyRng.Copy DestSh.Cells (Last + 1, "A")
1. Nếu bạn chỉ muốn sao chép các trang tính với tên bắt đầu bằng Tuần. Hãy thay thế dòng
If sh.Name <> DestSh.Name Then
bằng dòng
If LCase(Left(sh.Name, 4)) = "week" Then
2. Nếu bạn chỉ muốn sao chép những trang tính đang hiểu hiện trong cửa số làm việc của mình. Hay thay thế dòng này:
For Each sh In ActiveWorkbook.Worksheets
bằng dòng
For Each sh In ActiveWorkbook.Sheets (Array ("Sheet1", "Sheet3"))
3. Nếu bạn chỉ muốn sao chép từ các trang trong một Mảng nhất định. Hãy thay thế dòng
For Each sh In ActiveWorkbook.Worksheets
bằng dòng
For Each sh In ActiveWorkbook.Sheets(Array("Sheet1", "Sheet3"))
và xóa dòng
If sh.Name <> DestSh.Name Then
và dòng
End If trước dòng Next
4. Nếu bạn muỗn bỏ qua nhiều trang tính hơn nữa, hãy thay thể đoạn code
If sh.Name <> DestSh.Name Then
bằng đoạn code sau
If IsError(Application.Match(sh.Name, _ Array(DestSh.Name, "Total Sheet", "Menu Sheet"), 0)) ThenChỉ sao chép dữ liệu từ hàng 2 tới hàna cuối cùng trong trang tính
Ví dụ này sẽ sử dụng hàm LastRow, tuy nhiên bạn có thể áp dụng các mẹo như đã trình bày ở phần trên để tùy chỉnh đoạn code bên dưới theo nhu cầu của mình.
Mã VBA Sao chép trang tính từ hàng 2 cho đến hàng cuối cùng với dữ liệu
Thực hiện các bước từ 1 tới 3 như trong ví dụ 1, tuy nhiên thay thế đoạn code trong bước 2 bằng đoạn code bên dưới
Sub CopyDataWithoutHeaders()
Dim sh As Worksheet
Dim DestSh As Worksheet
Dim Last As Long
Dim shLast As Long
Dim CopyRng As Range
Dim StartRow As Long
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
'Delete the sheet "GitihoMergeSheet" if it exist
Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Worksheets("GitihoMergeSheet").Delete
On Error GoTo 0
Application.DisplayAlerts = True
'Add a worksheet with the name "GitihoMergeSheet"
Set DestSh = ActiveWorkbook.Worksheets.Add
DestSh.Name = "GitihoMergeSheet"
'Fill in the start row
StartRow = 2
'loop through all worksheets and copy the data to the DestSh
For Each sh In ActiveWorkbook.Worksheets
If sh.Name <> DestSh.Name Then
'Find the last row with data on the DestSh and sh
Last = LastRow(DestSh)
shLast = LastRow(sh)
'If sh is not empty and if the last row >= StartRow copy the CopyRng
If shLast > 0 And shLast >= StartRow Then
'Set the range that you want to copy
Set CopyRng = sh.Range(sh.Rows(StartRow), sh.Rows(shLast))
'Test if there enough rows in the DestSh to copy all the data
If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
MsgBox "There are not enough rows in the Destsh"
GoTo ExitTheSub
End If
'This example copies values/formats, if you only want to copy the
'values or want to copy everything look below example 1 on this page
CopyRng.Copy
With DestSh.Cells(Last + 1, "A")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End If
End If
Next
ExitTheSub:
Application.Goto DestSh.Cells(1)
'AutoFit the column width in the DestSh sheet
DestSh.Columns.AutoFit
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
Bạn có thể thấy trong ví dụ 1, chúng ta sao chép trang tính với dòng lệnh Set CopyRng = sh.UsedRange thì ở ví dụ 2 này, chúng ta bắt đầu với
'Fill in the start row
StartRow = 2
Nếu bạn muốn sao chép hàng tiêu đề trong hàng đầu tiên của GitihoMergeSheet thì hãy sao chép mã bên dưới (nếu mỗi trang tính có cùng tiêu đề) và dán chúng sau dòng If sh.Name <> DestSh.Name Then
'Copy header row, change the range if you use more columns
If WorksheetFunction.CountA(DestSh.UsedRange) = 0 Then
sh.Range("A1:Z1").Copy DestSh.Range("A1")
End If
Hy vọng qua hướng dẫn này, bạn đã biết được cách sao chép và hợp nhất dữ liệu từ nhiều bảng tính thành một bảng tính duy nhất trong Excel. Phương pháp này giúp bạn tự động hóa quy trình làm việc của mình, chấm dứt hàng giờ copy và dán thủ công nhàm chán. Hơn nữa, mỗi lần bạn chạy mã, dữ liệu của bạn sẽ được cập nhật.
Xem thêm: Tự học lập trình VBA tại nhà
Bên cạnh đó, để không bỏ lỡ những mẹo và thủ thuật tin học văn phòng hữu ích khác, hãy tham gia Gitiho ngay hôm nay.
Khóa học phù hợp với bất kỳ ai đang muốn tìm hiểu lại Excel từ con số 0. Giáo án được Gitiho cùng giảng viên thiết kế phù hợp với công việc thực tế tại doanh nghiệp, bài tập thực hành xuyên suốt khóa kèm đáp án và hướng dẫn giải chi tiết. Tham khảo ngay bên dưới!