Một nhiệm vụ phổ biến trong VBA là tìm hàng cuối cùng của tập dữ liệu. Có nhiều cách để làm và điều này vô tình gây ra nhiều sự nhầm lẫn. Hôm nay hãy cùng UniTrain tìm hiểu 5 cách tìm hàng cuối cùng bằng Excel VBA nhé!
Giải pháp 1: Range.End
Tương tự như cách sử dụng Ctrl + Phím mũi tên lên trong Excel. Chúng ta sẽ xem xét ở cột A. Ưu điểm của phương pháp này là đơn giản, ngắn gọn và trực quan. Tuy nhiên, hạn chế là chúng ta chỉ có thể tìm kiếm trong các cột đơn lẻ và hàng cuối cùng trong một cột có thể không đại diện cho toàn bộ tập dữ liệu.
Đây là kỹ thuật mà mọi người sử dụng thường xuyên nhất.
wsInv.Range("A" & wsInv.Rows.Count).End(xlUp).Row
Giải pháp 2: CurrentRegion
CurrentRegion của tập dữ liệu, là toàn bộ phạm vi dữ liệu đó được bao quanh bởi các hàng trống và cột trống. Và chúng ta có thể xác định Khu vực hiện tại, bằng cách chọn bất kỳ ô nào trong dữ liệu đó và nhấn Ctrl + A.
Nếu dữ liệu của bạn bắt đầu từ hàng 1, thì chúng ta chỉ có thể đếm số hàng trong tập dữ liệu và số hàng đó sẽ bằng với hàng cuối cùng được tập dữ liệu đó sử dụng trong Excel.
Tuy nhiên, nếu dữ liệu của bạn không bắt đầu ở hàng đầu tiên, thì chúng ta cần lấy số thứ tự của hàng cuối cùng bằng cách sử dụng số chỉ mục của hàng đó.
'If your data starts in row 1
lrow = wsInv.Range("A1").CurrentRegion.Rows.Count
'If your data doesn’t start in row 1
lrow = wsInv.Range("A2").CurrentRegion.Rows(wsInv.Range("A2").CurrentRegion.Rows.Count).Row
'We can shorten the code, by feeding the range into a range object.
Dim rng As Range
Set rng = wsInv.Range("A2").CurrentRegion
lrow = rng.Rows(rng.Rows.Count).Row
Giải pháp 3: usedRange
Nhưng, điều gì sẽ xảy ra nếu dữ liệu của bạn được phân tách bằng các hàng trống. Hay nói đúng hơn là bạn không chắc liệu dữ liệu của mình có được phân tách bằng các hàng trống hay không. Chúng ta có thể sử dụng thuộc tính Phạm vi đã sử dụng của đối tượng Trang tính để lấy hàng cuối cùng.
Ưu điểm của việc sử dụng usedRange là ngay cả khi phạm vi dữ liệu có ô trống hoặc hàng trống hoặc cột trống, ta vẫn có thể xác định ô được sử dụng cuối cùng.
Tuy nhiên, mặt khác, nếu ô không có bất kỳ giá trị nào, nhưng có một công thức hoặc định dạng trong đó, thì kỹ thuật usedRange sẽ vẫn coi nó là Ô đã sử dụng. Tùy thuộc vào kết quả của bạn sau đó, điều này có thể có hoặc có thể không phải là điều bạn muốn.
'If your data starts in row 1
lrow = wsInv.UsedRange.Rows.Count
'If your data doesn’t start in row 1
lrow = wsInv.UsedRange.Rows(wsInv.UsedRange.Rows.Count).row
Giải pháp 4: SpecialCells
Excel có một menu đầy đủ các tùy chọn được gọi là Go To Special cho phép chúng ta chọn các ô có các đặc điểm đặc biệt. Trong ruy-băng Home, đi tới Find and Select. Sau đó, chọn Go To special. Có một danh sách các tùy chọn ở đây. Chọn Last Cell. Nhấp vào Ok. Ô được sử dụng cuối cùng trong trang tính sẽ được chọn.
Lợi thế của việc sử dụng SpecialCell là ngay cả khi phạm vi dữ liệu có ô trống hoặc hàng trống hoặc cột trống, vẫn có thể xác định ô được sử dụng cuối cùng.
Và vì lý do đó, kỹ thuật này vượt trội hơn so với việc chỉ sử dụng thuộc tính Range.End. Trên thực tế, nó tương tự như thuộc tính Phạm vi đã sử dụng mà chúng ta đã thấy trước đó ngoại trừ một vài khác biệt nhỏ.
Tuy nhiên, mặt khác, nếu ô không có bất kỳ giá trị nào, nhưng có một công thức hoặc định dạng trong đó, thì kỹ thuật SpecialCells vẫn sẽ coi nó là Used Cell. Tùy thuộc vào kết quả của bạn sau đó, điều này có thể có hoặc có thể không phải là điều bạn muốn.
lrow = wsInv.Range("A1").SpecialCells(xlCellTypeLastCell).row
Nhưng, có một vấn đề. Nếu bạn cập nhật dữ liệu và cố gắng chạy Special Cells mà không lưu các thay đổi trong sổ làm việc, Special Cells sẽ vẫn xác định phạm vi đã sử dụng dựa trên phiên bản trước của dữ liệu. UsedRange không gặp phải vấn đề này, và do đó, tôi thích sử dụng nó hơn SpecialCells.
Giải pháp 5: Find
Đây là kỹ thuật hiệu quả nhất để tìm hàng cuối cùng. Tuy nhiên, mã này dài dòng và hiếm khi được sử dụng nó trừ khi tình huống yêu cầu.
Chúng ta có thể đi tới dải băng Home, chọn Find and Select và chọn Find. Hoặc, chỉ cần nhấn Ctrl + F. Có năm tùy chọn ở đây và thậm chí còn có nhiều tùy chọn hơn trong VBA. Và một số trong số chúng, sẽ giúp chúng ta tìm thấy hàng cuối cùng.
Dim lrow As Long
lrow = wsInv.Cells.Find(What:="*", _
After:=wsInv.Range("A1"), _
LookIn:=xValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False _
).row
Kỹ thuật này rất tốt trong việc tìm hàng cuối cùng với các giá trị, bỏ qua bất kỳ định dạng hoặc công thức nào.
Nhưng, có một vấn đề. Nếu không có dữ liệu, thì Range.Find sẽ xuất hiện lỗi Run Time. Để chống lại điều đó, sẽ cần thêm một số xử lý lỗi. Nếu không có dữ liệu, chúng ta sẽ bỏ qua phương pháp Find và chuyển sang dòng mã tiếp theo. Trong trường hợp này, biến hàng cuối cùng sẽ không được điền. Và nếu nó vẫn không được xác định là 0, chúng tôi sẽ trả về hàng cuối cùng là hàng 1.
Dim lrow As Long
On Error Resume Next
lrow = wsInv.Cells.Find(What:="*", _
After:=wsInv.Range("A1"), _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False _
).row
If lrow = 0 Then
lrow = 1
End If
Nguồn: skillsandautomation.com
Xem thêm