ПРИМЕЧАНИЕ : я намерен сделать это "одним постом", где вы можете использовать Correct
способ, чтобы найти последний ряд. Это также охватит лучшие практики, которым нужно следовать при поиске последней строки. И поэтому я буду обновлять его всякий раз, когда сталкиваюсь с новым сценарием / информацией.
Ненадежные способы поиска последнего ряда
Некоторые из наиболее распространенных способов поиска последней строки, которые крайне ненадежны и, следовательно, никогда не должны использоваться.
- UsedRange
- 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
ошибку.
Обратите внимание, что этот подход будет пропускать любые скрытые строки. Оглядываясь на мой скриншот выше для столбца A , если строка 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