Когда я хочу найти значение последней использованной ячейки, я использую:
Dim LastRow As Long
LastRow = Range("E4:E48").End(xlDown).Row
Debug.Print LastRow
Я получаю неправильный вывод, когда я помещаю один элемент в ячейку. Но когда я помещаю более одного значения в ячейку, вывод правильный. В чем причина этого?
excel
vba
excel-formula
Джеймс
источник
источник
Ответы:
ПРИМЕЧАНИЕ : я намерен сделать это "одним постом", где вы можете использовать
Correct
способ, чтобы найти последний ряд. Это также охватит лучшие практики, которым нужно следовать при поиске последней строки. И поэтому я буду обновлять его всякий раз, когда сталкиваюсь с новым сценарием / информацией.Ненадежные способы поиска последнего ряда
Некоторые из наиболее распространенных способов поиска последней строки, которые крайне ненадежны и, следовательно, никогда не должны использоваться.
UsedRange
должны НИКОГДА быть использованы , чтобы найти последнюю ячейку , которая имеет данные. Это очень ненадежно. Попробуйте этот эксперимент.Введите что-то в клетку
A5
. Теперь, когда вы вычислите последнюю строку любым из приведенных ниже методов, вы получите 5. Теперь закрасьте ячейкуA10
красным. Если вы сейчас используете любой из приведенного ниже кода, вы все равно получите 5. Если вы используетеUsedrange.Rows.Count
то, что вы получаете? Это не будет 5.Вот сценарий, чтобы показать, как
UsedRange
работает.xlDown
одинаково ненадежен.Рассмотрим этот код
Что бы произошло, если бы была только одна ячейка (
A1
) с данными? В конечном итоге вы достигнете последней строки в таблице! Это как выбрать ячейку,A1
а затем нажать Endклавишу и затем нажать Down Arrowклавишу. Это также даст вам ненадежные результаты, если в диапазоне есть пустые ячейки.CountA
также ненадежен, потому что он даст вам неправильный результат, если между ними есть пустые ячейки.И , следовательно , следует избегать использования
UsedRange
,xlDown
иCountA
найти последнюю ячейку.Найти последнюю строку в столбце
Чтобы найти последнюю строку в Col E, используйте эту
Если вы заметили, что у нас есть
.
раньше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
Найти последнюю строку в таблице (ListObject)
Применяются те же принципы, например, для получения последней строки в третьем столбце таблицы:
источник
Usedrange.Rows.Count
то, что вы получаете? Это не будет 5. Usedrange крайне ненадежен, чтобы найти последний ряд.remembers
последняя настройка. Даже когда вы вручную делаете aFind
, он запоминает последний параметр, который на самом деле является благом, если кто-то знает этот «факт»UsedRange
( крайне ненадежно найти последнюю ячейку, в которой есть данные ) вводит в заблуждение.UsedRange
просто не предназначен для этой цели, хотя в некоторых случаях это может дать правильный результат. Я думаю, что предложенный эксперимент добавляет путаницы. Результат, полученный с помощьюUsedRange
($ A $ 1: $ A $ 8), не зависит от первого ввода данных или их удаления. Цифра справа останется прежней, даже если данные не были удалены. Пожалуйста, посмотрите мой ответ.