Как подсчитать количество строк в excel с данными?
столбец A содержит такие данные (т.е. частые пустые ячейки):
HEADING <-- this is A1
kfdsl
fdjgnm
fdkj
gdfkj
4353
fdjk <-- this is A9
Я хотел бы получить ссылку на последнюю ячейку, в которой есть данные. Поэтому в приведенном выше примере я хочу вернуть: A9
Я пробовал это, но он останавливается на первой пустой ячейке (т.е. возвращает A4
)
numofrows = destsheet.Range("A2").End(xlDown).Row - 1
Ответы
Ответ 1
Мне нравится так:
ActiveSheet.UsedRange.Rows.Count
То же самое можно сделать с количеством столбцов. Для меня всегда работа. Но если у вас есть данные в другом столбце, приведенный выше код их тоже учтет, потому что код ищет весь диапазон ячеек на листе.
Ответ 2
Самый безопасный вариант
Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastcol = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
Не используйте UsedRange
или SpecialCells(xlLastCell)
или End(xlUp)
. Все эти методы могут давать неправильные результаты, если вы ранее удалили несколько строк. Excel по-прежнему считает эти невидимые ячейки.
Эти методы будут работать снова, если вы удалите свои ячейки, сохраните книгу, закройте ее и заново ее откроете.
Ответ 3
Это будет работать независимо от версии Excel (2003, 2007, 2010). Первый имеет 65536 строк на листе, в то время как последние два имеют миллион строк или около того. Sheet1.Rows.Count
возвращает этот номер в зависимости от версии.
numofrows = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row
или эквивалент, но короче
numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)
При этом выполняется поиск вверху снизу столбца A первой непустой ячейки и номер ее строки.
Это также работает, если у вас есть данные, которые идут дальше вниз в других столбцах. Так, например, если вы берете данные вашего примера и также записываете что-то в ячейку FY4763, вышеприведенное все равно будет правильно возвращать 9 (а не 4763, что любой метод, включающий свойство UsedRange
, будет некорректно возвращать).
Обратите внимание, что на самом деле, если вы хотите ссылку на ячейку, вы должны просто использовать следующее. Вам не нужно сначала получать номер строки, а затем создавать ссылку на ячейку.
Set rngLastCell = Sheet1.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp)
Обратите внимание, что этот метод не работает в определенных случаях:
- Последняя строка содержит данные
- Последние строки скрыты или отфильтрованы
Так что будьте осторожны, если вы планируете использовать строку 1 048 576 для этих вещей!
Ответ 4
Я сравнил все возможности с длинным тестовым листом:
0,140625 с для
lastrow = calcws.Cells.Find("*", [A1], , , xlByColumns, xlPrevious).row
0 сек для
iLastRow = calcws.Cells(rows.count, "a").End(xlUp).row
и
numofrows = calcws.Cells.SpecialCells(xlLastCell).row
0,0078125 сек для
lastrow = calcws.UsedRange.rows.count
Do While 1
If calcws.Cells(lastrow, 1).Value = "" Then
lastrow = lastrow - 1
Else
Exit Do
End If
Loop
Я думаю, что фавориты очевидны...
Ответ 5
Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row
В вашем случае он должен вернуть # 9
Ответ 6
Нашел этот подход на другом сайте. Он работает с новыми большими размерами Excel и не требует жесткого кодирования максимального количества строк и столбцов.
iLastRow = Cells(Rows.Count, "a").End(xlUp).Row
iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column
Благодаря mudraker в Мелборне, Австралия
Ответ 7
Они оба будут работать, позволяя Excel определять последний раз, когда он видит данные
numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row
numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
Ответ 8
n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
Ответ 9
Я предпочитаю использовать свойство CurrentRegion, которое эквивалентно Ctrl- *, которое расширяет текущий диапазон до самого большого непрерывного диапазона с данными. Вы начинаете с ячейки или диапазона, который, как вы знаете, будет содержать данные, а затем расширяете их. Свойство UsedRange иногда возвращает огромные области только потому, что кто-то сделал какое-то форматирование внизу листа.
Dim Liste As Worksheet
Set Liste = wb.Worksheets("B Leistungen (Liste)")
Dim longlastrow As Long
longlastrow = Liste.Range(Liste.Cells(4, 1), Liste.Cells(6, 3)).CurrentRegion.Rows.Count
Ответ 10
Для большей ясности я хочу добавить ясный пример и запустить
openFileDialog1.FileName = "Select File";
openFileDialog1.DefaultExt = ".xls";
openFileDialog1.Filter = "Excel documents (.xls)|*.xls";
DialogResult result = openFileDialog1.ShowDialog();
if (result==DialogResult.OK)
{
string filename = openFileDialog1.FileName;
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlApp.Visible = false;
xlApp.DisplayAlerts = false;
xlWorkBook = xlApp.Workbooks.Open(filename, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
var numRows = xlWorkSheet.Range["A1"].Offset[xlWorkSheet.Rows.Count - 1, 0].End[Excel.XlDirection.xlUp].Row;
MessageBox.Show("Number of max row is : "+ numRows.ToString());
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
}
Ответ 11
У Жан-Франсуа Корбетта отсутствует ".Row" на большой ответ выше. Новые пользователи могут быть смущены отсутствующим оператором.
numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)
как указано, будет предоставлять значение последней использованной ячейки.
`Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row`
с .Row в конце будет содержать строку # последней ячейки в столбце 1, как предполагал Жан.