Как посчитать количество строк в 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
10 ответов
Мне нравится этот способ:
ActiveSheet.UsedRange.Rows.Count
То же самое можно сделать с количеством столбцов. Для меня всегда работа. Но если у вас есть данные в других столбцах, приведенный выше код их тоже учтет, потому что код ищет весь диапазон ячеек на листе.
Самый безопасный вариант
Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastcol = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
Не использовать UsedRange
или же SpecialCells(xlLastCell)
или же End(xlUp)
, Все эти методы могут дать неправильные результаты, если вы ранее удалили несколько строк. Excel по-прежнему считает эти невидимые ячейки.
Эти методы будут работать снова, если вы удалите свои ячейки, сохраните книгу, закроете и снова откроете ее.
Это будет работать независимо от версии 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 для этих вещей!
Я сравнил все возможности с длинным тестовым листом:
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
Я думаю, что фавориты очевидны...
Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row
В вашем случае это должно вернуть #9
Нашел такой подход на другом сайте. Он работает с новыми большими размерами Excel и не требует жесткого кодирования максимального количества строк и столбцов.
iLastRow = Cells(Rows.Count, "a").End(xlUp).Row
iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column
Они оба также будут работать, позволяя Excel определять время последнего просмотра данных.
numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row
numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
Я предпочитаю использовать свойство 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
Для большей ясности хочу добавить наглядный пример и запустить
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();
}