Tin tức mới

    Đăng ký nhận báo giá 2026

    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:

    
    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”

    Yêu cầu tư vấn

      Tư vấn sản phẩm phù hợp

      Yêu cầu báo giá

      Yêu cầu tư vấn kỹ thuật

      Leave a Reply

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

      Gọi ngay 24/7 Zalo Messenger Support
      Gọi ĐT tư vấn ngay Chat ngay qua Messenger Chat ngay qua Zalo
      Yêu cầu tư vấn

        Tư vấn sản phẩm phù hợp

        Yêu cầu báo giá

        Yêu cầu tư vấn kỹ thuật