Как посчитать количество строк в 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();

            }
Другие вопросы по тегам