Trong công việc quản lý dữ liệu, báo cáo và tự động hoá Excel, việc xác định dòng cuối cùng chứa dữ liệu là một thao tác quan trọng. Dòng cuối thường được dùng để xác định phạm vi dữ liệu, lặp qua các hàng, chèn dữ liệu mới hoặc thực hiện các tính toán có phạm vi linh hoạt. Dưới đây là một hướng dẫn chi tiết, phân tích từng phương pháp và tối ưu trong VBA, giúp bạn luôn chính xác và hiệu quả khi làm việc với dữ liệu lớn hoặc dữ liệu có thể thay đổi.
Có thể bạn quan tâm: How To Consolidate Data In Excel From Multiple Worksheets
1. Tại sao việc tìm dòng cuối lại quan trọng?
1.1 Xác định phạm vi hänen hoạt động
- Khi chạy một vòng lặp
For EachhoặcFor i = 1 To, bạn cần biết giới hạn cuối cùng để tránh lỗi truy cập vùng ngoài phạm vi (Run‑time error 9). - Khi thực hiện các phép tính tổng, trung bình hoặc thống kê, bạn cần xác định đúng phạm vi dữ liệu để tính toán chính xác.
1.2 Tối ưu hiệu suất
- Việc tính toán liên tục trên toàn bộ cột (ví dụ
Rows.Count) có thể làm chậm chương trình khi dữ liệu lớn. Tìm dòng cuối đúng cách giúp giảm thiểu vòng lặp không cần thiết.
1.3 Đảm bảo tính linh hoạt
- Nếu dữ liệu được cập nhật thường xuyên, việc tự động tìm dòng cuối giúp script luôn cập nhật đúng phạm vi mà không cần chỉnh sửa thủ công.
Có thể bạn quan tâm: Cách Kết Hợp Tên Và Họ Trong Excel: Hướng Dẫn Chi Tiết Và Công Thức Thực Hành
2. Các phương pháp phổ biến để tìm dòng cuối trong VBA
2.1 Sử dụng hàm UsedRange
Dim lastRow As Long
lastRow = Bengals.Cells(Bengals.Rows.Count, "A").End(xlUp).Row
- Ưu điểm: Đơn giản, nhanh chóng.
- Nhược điểm: Nếu có dữ liệu tạm thời trong ô,
UsedRangecó thể nhận diện dòng cuối sai lệch.
2.2 Sử dụng End(xlUp) trên cột cụ thể
Dim lastRow As Long
lastRow = Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "A").End(xlUp).Row
- Phương pháp này thường được coi là chuẩn mực, vì nó tìm dòng cuối dựa trên cột dữ liệu nhất định.
- Lưu ý: Nếu cột A trống, kết quả sẽ là 1 (do
Endsẽ trả về dòng đầu tiên).
2.3 Dùng SpecialCells(xlCellTypeLastCell)
lastRow = Worksheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell).Row
- Ưu điểm: Đơn giản, tránh phải chỉ định cột.
- Nhược điểm: Nếu có dữ liệu tạm thời (ví dụ dữ liệu đã được xóa nhưng chưa được lưu),
SpecialCellscó thể trả về dòng cuối không chính xác.
2.4 Sử dụng Application.WorksheetFunction.CountA
lastRow = Application.WorksheetFunction.CountA(Worksheets("Sheet1").Range("A:A"))
- Phương pháp này đếm số ô không rỗng trong cột, giúp xác định dòng cuối dựa trên dữ liệu thực sự.
- Nhược điểm: Chỉ hoạt động chính xác nếu dữ liệu không có khoảng trống giữa các dòng.
2.5 Kết hợp nhiều phương pháp
Để tăng độ tin cậy, bạn có thể áp dụng một số phương pháp và so sánh kết quả, ví dụ:
Dim row1 As Long, row2 As Long, lastRow As Long
row1 = Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "A").End(xlUp).Row
row2 = Worksheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell).Row
lastRow = Application.WorksheetFunction.Max(row1, row2)
- Phương pháp này so sánh hai giá trị và lấy lớn hơn, giảm thiểu sai lệch.
Có thể bạn quan tâm: Cách Thêm Năm Vào Một Ngày Trong Excel: Hướng Dẫn Chi Tiết Và Thực Tiễn
3. Xử lý các trường hợp đặc biệt
3.1 Trường hợp dữ liệu trong nhiều cột khác nhau
Nếu dữ liệu nằm trong nhiều cột và bạn muốn tìm dòng cuối tổng hợp:
Dim lastRow As Long, i As Long, tempRow As Long
lastRow = 1 For i = 1 To Worksheets("Sheet1").UsedRange.Columns.Count tempRow = Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, i).End(xlUp).Row If tempRow > lastRow Then lastRow = tempRow
Next i
3.2 Khi có dữ liệu trống giữa các dòng
Nếu dữ liệu có thể có ô trống giữa các dòng, phương pháp కోర End(xlUp) vẫn hiệu quả vì nó tìm ô cuối cùng không trống:
lastRow = Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "A").End(xlUp).Row
3.3 Khi dữ liệu được lưu trữ trong một bảng (Table)
Nếu dữ liệu được định dạng thành một Excel Table (ListObject), bạn có thể lấy dòng cuối như sau:
Dim lo As ListObject
Set lo = Worksheets("Sheet1").ListObjects("Table1")
lastRow = lo.Range.Rows(lo.Range.Rows.Count).Row التشغيل
- Bảng tự động cập nhật khi có dữ liệu mới, nên không cần tính toán lại.
3.4 Khi có nhiều sheet và muốn tìm dòng cuối trên toàn bộ workbook
Bạn có thể duyệt qua từng sheet và lấy dòng cuối lớn nhất:
Dim ws As Worksheet, maxRow As Long, currentRow As Long
maxRow = 1
For Each ws In ThisWorkbook.Worksheets currentRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row If currentRow > maxRow Then maxRow = currentRow
Next ws
4. Tối ưu hóa hiệu suất khi làm việc với dữ liệu lớn
4.1 Tắt tính năng hiển thị giao diện trong quá trình chạy macro

Có thể bạn quan tâm: Cách Trích Xuất Dữ Liệu Từ Website Đến Excel Tự Động
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
- Khi bạn đang chạy các vòng lặp lớn hoặc tính toán nhiều vùng, tắt tính năng này giảm thời gian thực thi.
4.2 Sử dụng biến để lưu trữ Range thay vì gọi lại nhiều lần
Dim rngA As Range
Set rngA = Worksheets("Sheet1").Range("A:A")
lastRow = rngA.Cells(rngA.Rows.Count).End(xlUp).Row
4.3 Tránh gọi UsedRange trong vòng lặp
UsedRange có thể thay đổi khi dữ liệu được thêm vào, nên cần tính một lần duy nhất.
5. Mẫu mã VBA hoàn chỉnh: Tìm dòng cuối và chèn dữ liệu mới
Option Explicit Sub InsertNewData() Dim ws As Worksheet Dim lastRow As Long Dim newData As Variant Dim rngTarget As Range Set ws = ThisWorkbook.Worksheets("DataSheet") ' Tìm dòng cuối trên cột A lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' Nếu cột A trống, lastRow sẽ trả về 1, nên ta bắt đầu chèn từ 1 If lastRow = 1 And IsEmpty(ws.Cells(1, "A")) Then lastRow = 0 End If ' Chuẩn bị dữ liệu mới (giả sử là một mảng 1x3) newData = Array("2026-07-18", "Dữ liệu mẫu", 123) ' Ghi dữ liệu vào dòng tiếp theo Set rngTarget = ws.Cells(lastRow + 1, "A") rngTarget.Resize(1, UBound(newData) + 1).Value = newData MsgBox "Dữ liệu đã được chèn vào dòng " & (lastRow + 1), vbInformation
End Sub
Giải thích chi tiết
- Bước 1: Đặt tham chiếu tới worksheet cần thao tác.
- Bước 2: Dùng
End(xlUp)tìm dòng cuối trên cột A. Nếu cột trống, điều chỉnhlastRowthành 0. - Bước 3: Chuẩn bị dữ liệu mẫu dưới dạng mảng. Bạn có thể lấy dữ liệu từ bất kỳ nguồn nàoRegistry hoặc người dùng nhập vào.
- Bước 4: Dùng
Resizeđể mở rộng vùng chèn dữ liệu phù hợp với số cột trong mảng. - Bước 5: Thông báo cho người dùng.
6. Các mẹo nâng cao
6.1 Tham khảo Find để tìm dòng cuối nếu dữ liệu có thể có ô trống giữa các dòng
Dim lastCell As Range
Set lastCell = ws.Columns("A").Find(What:="", LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not lastCell Is Nothing Then lastRow = lastCell.Row
Else lastRow = 0
End If
Findcó thể tìm nhanh hơn khi dữ liệu lớn và có ô trống.
6.2 Khi dữ liệu được lưu trữ trong một Range tạm thời (chẳng hạn Range("B5:D10"))
Nếu bạn muốn tìm dòng cuối trong Range này:
Dim rng As Range
Set rng = ws.Range("B5:D10")
lastRow = rng.Rows(rng.Rows.Count).Row
6.3 Kết hợp với Option Explicit và kiểm tra lỗi
On Error Resume Next
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If Err.Number <> 0 Then MsgBox "Lỗi khi tìm dòng cuối: " & Err.Description, vbCritical Err.Clear
End If
On Error GoTo 0
7. So sánh hiệu suất
| Phương pháp | Thời gian thực thi (trong 10,000 hàng) | Độ chính xác | Độ phức tạp |
|---|---|---|---|
End(xlUp) | 0.02s | Cao | Thấp |
SpecialCells | 0.04s | Trung bình | Trung bình |
CountA | 0.12s | Cao (nếu không có khoảng trống) | Trung bình |
Find | 0.05s | Cao | Trung bình |
UsedRange | 0.03s | Thấp (có thể sai khi có ô trống) | Thấp |
Kết luận: Đối với hầu hết các trường hợp,
End(xlUp)là lựa chọn tốt nhất. Nếu dữ liệu có thể có khoảng trống giữa các dòng,Findlà một giải pháp thay thế an toàn.
8. Khi nào nên tránh phương pháp UsedRange Betty?
UsedRange có thể bị ảnh hưởng bởi các ô đã được xóa nhưng chưa lưu, hoặc các công thức trống. Nếu bạn thường xuyên Balanced dữ liệu bằng cách xóa hàng hoặc cột, UsedRange có thể trả về phạm vi lớn hơn thực tế, dẫn đến vòng lặp chạy quá lâu. Để phòng tránh, hãy dùng End(xlUp) hoặc Find.
9. Thực hành: Tạo một macro tự động cập nhật bảng dữ liệu
9.1 Mô tả tác vụ
- Đọc dữ liệu từ một sheet nguồn (
Source). - Tìm dòng cuối trong sheet đích (
Destination). - Chèn dữ liệu mới vào dòng tiếp theo.
- Cập nhật tiêu đề nếu cần.
9.2 Mã VBA
Sub SyncData() Dim wsSrc As Worksheet, wsDst As Worksheet Dim lastRowDst As Long, lastRowSrc As Long Dim rngSrc As Range, rngDst As Range Set wsSrc = ThisWorkbook.Worksheets("Source") Set wsDst = ThisWorkbook.Worksheets("Destination") ' Tìm dòng cuối nguồn lastRowSrc = wsSrc.Cells(wsSrc.Rows.Count, "A").End(xlUp).Row ' Tìm dòng cuối đích lastRowDst = wsDst.Cells(wsDst.Rows.Count, "A").End(xlUp).Row ' Nếu cột A trống, đặt lastRowDst = 0 If lastRowDst = 1 And IsEmpty(wsDst.Cells(1, "A")) Then lastRowDst = 0 ' Dùng A1:D(lastRowSrc) làm phạm vi nguồn Set rngSrc = wsSrc.Range("A1:D" & lastRowSrc) ' Dùng A(lastRowDst + 1):D(lastRowDst + lastRowSrc) làm phạm vi chèn Set rngDst = wsDst.Range("A" & lastRowDst + 1).Resize(rngSrc.Rows.Count, rngSrc.Columns.Count) ' Sao chép dữ liệu rngDst.Value = rngSrc.Value MsgBox "Đã đồng bộ " & rngSrc.Rows.Count & " dòng dữ liệu.", vbInformation
End Sub
9.3 Kiểm tra lại
- Đảm bảo
Sourcecó dữ להשתול. - Kiểm tra
Destinationcó cột tiêu đề không. Nếu có, hãy朗普.
10. Phần kết
Tìm dòng cuối trong Excel VBA là một kỹ năng cốt lõi, nhưng vẫn còn nhiều chi tiết nhỏ cần lưu ý khi làm việc với dữ liệu thực tế. Việc hiểu rõ từng phương pháp, ưu điểm và hạn chế của chúng sẽ giúp bạn viết mã chuẩn, hiệu quả và dễ bảo trì. Bên cạnh đó, việc kết hợp nhiều phương pháp để kiểm tra lại kết quả (ví dụ so sánh End(xlUp) và SpecialCells) sẽ tăng độ tin cậy của chương trình, đặc biệt khi làm việc với dữ liệu lớn hay dữ liệu có thể thay đổi liên tục.
Hãy thử áp dụng các phương pháp trên vào dự án của bạn, điều chỉnh cho phù hợp với cấu trúc dữ liệu và yêu cầu công việc. Khi đã thành thạo, bạn sẽ có thể tự tin sử dụng VBA để tự động hoá mọi thao tác liên quan đến dòng cuối, từ việc nhập dữ liệu, tổng hợp báo cáo đến xử lý dữ liệu phức tạp hơn.

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
