ПРИМІТКА : Я маю намір перетворити це на "один стоп-пост", де ви можете використовувати Correctспосіб пошуку останнього ряду. Це також охопить найкращі практики, які слід дотримуватися при пошуку останнього ряду. А отже, я буду постійно оновлювати її, коли я натрапляю на новий сценарій / інформацію.
Ненадійні способи пошуку останнього ряду
Деякі з найпоширеніших способів пошуку останнього ряду, які є дуже ненадійними і тому ніколи не повинні використовуватися.
- Використовуваний
- xlDown
- CountA
UsedRangeповинні НІКОЛИ бути використані , щоб знайти останній осередок , яка має дані. Це дуже ненадійно. Спробуйте цей експеримент.
Наберіть щось у комірці A5. Тепер, коли ви обчислюєте останній рядок будь-яким із методів, наведених нижче, він дасть вам 5. Тепер пофарбуйте клітинку в A10червоний колір. Якщо ви зараз використовуєте будь-який із наведених нижче кодів, ви все одно отримаєте 5. Якщо ви користуєтесьUsedrange.Rows.Count те, що отримуєте? Це не буде 5.
Ось сценарій, який показує, як UsedRangeпрацює.

xlDown однаково ненадійний.
Розглянемо цей код
lastrow = Range("A1").End(xlDown).Row
Що буде, якби була лише одна клітинка ( A1), яка мала дані? Ви досягнете останнього ряду на робочому аркуші! Це як вибрати клітинку, A1а потім натиснути Endклавішу, а потім натиснути Down Arrowклавішу. Це також дасть недостовірні результати, якщо в діапазоні є порожні комірки.
CountA також ненадійний, оскільки це дасть неправильний результат, якщо між ними будуть порожні клітинки.
І , отже , слід уникати використання UsedRange, xlDownі CountAзнайти останню комірку.
Знайти останній рядок у стовпці
Щоб знайти останній рядок у Col E, скористайтеся цим
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Якщо ви помітили, що у нас є .раніше Rows.Count. Ми часто вирішили це ігнорувати. Дивіться ЦЕ питання щодо можливої помилки, яку ви можете отримати. Я завжди раджу використовувати .до Rows.Countі Columns.Count. Це питання є класичним сценарієм, коли код не вдасться, оскільки Rows.Countповернення 65536для Excel 2003 і раніше, а також 1048576для Excel 2007 і пізніших версій. Аналогічно Columns.Countповертається 256і 16384, відповідно.
Вищенаведений факт, що у Excel 2007+ має 1048576рядки, також наголошує на тому, що ми завжди повинні оголошувати змінну, яка буде містити значення рядка, оскільки Longзамість Integerіншого ви отримаєте Overflowпомилку.
Зауважте, що цей підхід буде пропускати будь-які приховані рядки. Озираючись на мій скріншот вище для стовпця А , якби рядок 8 був прихованим, цей підхід повернувся б 5замість 8.
Знайдіть останній рядок у аркуші
Щоб знайти Effectiveостанній рядок на аркуші, використовуйте цей. Зверніть увагу на використання Application.WorksheetFunction.CountA(.Cells). Це потрібно, тому що якщо на робочому аркуші немає комірок із даними, то .Findвони дадуть вамRun Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
End With
Знайти останній рядок у таблиці (ListObject)
Ті ж принципи застосовуються, наприклад, щоб отримати останній рядок у третьому стовпці таблиці:
Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1") 'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")
With tbl.ListColumns(3).Range
lastrow = .Find(What:="*", _
After:=.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
End Sub