Tin tức mới

Tìm dòng cuối cùng có chứa dữ liệu trong một Worksheet.

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:


Option Explicit
Sub FindLastRow()

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 ' hoac 0 tùy logic
End If
MsgBox lastRow
End Sub

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
VBA tìm dòng cuối cùng có dữ liệu trong một sheet
VBA tìm dòng cuối cùng có dữ liệu trong một sheet

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”

Leave a Reply

Your email address will not be published. Required fields are marked *