1. Cú pháp
Dim lastRow As Long
lastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Đây là một “cú pháp kinh điển” trong VBA Excel dùng để xác định dòng cuối cùng có chứa dữ liệu trong một Worksheet.
Nếu bạn chỉ dùng Range(“A65536”).End(xlUp).Row, bạn sẽ bị giới hạn ở cột A. Nhưng công thức này quét toàn bộ bảng tính để tìm hàng cuối cùng thực sự.
2. Phân tích chi tiết từng thành phần
1. Cells.Find(…)
Hàm Find được dùng để tìm kiếm một giá trị cụ thể trong một phạm vi (ở đây là Cells – toàn bộ các ô trong Sheet).
2. Các tham số bên trong:
” * ” (What): Dấu sao là ký tự đại diện (wildcard), tượng trưng cho bất kỳ nội dung nào. Nghĩa là chúng ta đang bảo VBA: “Hãy tìm ô nào có chứa cái gì đó, bất kể là chữ hay số”.
SearchOrder:=xlByRows: Chỉ định thứ tự tìm kiếm. Thay vì tìm theo từng cột, VBA sẽ quét qua từng hàng một. Điều này cực kỳ quan trọng để xác định vị trí dòng.
SearchDirection:=xlPrevious: Đây là “bí mật” của công thức. Thông thường Find sẽ tìm từ trên xuống dưới (xlNext). Nhưng xlPrevious bảo nó tìm ngược từ dưới lên trên.
➡️ Nghĩa là:
Bắt đầu từ ô cuối cùng (góc dưới bên phải)
Quét ngược lên trên
3. .Row
Sau khi hàm Find tìm thấy ô đó, thuộc tính .Row sẽ trả về số hàng của ô đó.
3. Tại sao công thức này lại “lợi hại”?
Hãy tưởng tượng bảng dữ liệu của bạn không đồng nhất: cột A có 10 dòng, nhưng cột C lại có tới 20 dòng.
Nếu dùng Range(“A” & Rows.Count).End(xlUp).Row, bạn chỉ nhận được kết quả là 10.
Dùng công thức Cells.Find(…) này, bạn sẽ nhận được kết quả chính xác là 20.
4. Lưu ý quan trọng:
1. Có thể bị lỗi nếu sheet trống
Công thức này sẽ bị lỗi runtime (Error 91) nếu Sheet của bạn trống không (không có một chút dữ liệu nào), vì khi đó hàm Find không tìm thấy gì và không thể trả về số hàng.
Cách fix an toàn:
Dim lastRow As Long
Dim cell As Range
Set cell = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not cell Is Nothing Then
lastRow = cell.Row
Else
lastRow = 1 ' hoặc 0 tùy logic
End If
Giải thich dòng code: lastRow = 1 ‘ hoặc 0 tùy logic
| Giá trị | Ý nghĩa | Khi dùng |
|---|---|---|
1 |
Có ít nhất 1 dòng (thường là header) | Data có cấu trúc |
0 |
Không có dữ liệu | Data có thể rỗng hoàn toàn |
2. Bị ảnh hưởng bởi format (đôi khi)
Một số trường hợp ô có format → vẫn bị tính là “used”


Bảo vệ Workbook (Sổ làm việc) trong Excel21-03-2026 18:14
Workbook21-03-2026 17:43
Status Bar (Thanh trạng thái)21-03-2026 15:40