ПРИМІТКА : Я маю намір перетворити це на "один стоп-пост", де ви можете використовувати 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