Как посчитать количество строк в Excel с данными? - PullRequest
48 голосов
/ 10 июня 2011

столбец 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 ]

49 голосов
/ 15 июня 2011

Мне нравится этот способ:

ActiveSheet.UsedRange.Rows.Count

То же самое можно сделать с количеством столбцов.Для меня всегда работа.Но если у вас есть данные в других столбцах, приведенный выше код их тоже учтет, поскольку код ищет весь диапазон ячеек на листе.

41 голосов
/ 18 января 2013

Самый безопасный вариант -

Lastrow =  Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastcol =  Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column

Не используйте UsedRange или SpecialCells(xlLastCell) или End(xlUp). Все эти методы могут дать неправильные результаты, если вы ранее удалили несколько строк. Excel по-прежнему считает эти невидимые ячейки.

Эти методы будут работать снова, если вы удалите свои ячейки, сохраните книгу, закроете и снова откроете ее.

26 голосов
/ 10 июня 2011

Это будет работать независимо от версии 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 для этих вещей!

19 голосов
/ 24 февраля 2013

Я сравнил все возможности с длинным тестовым листом:

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

Я думаю, что фавориты очевидны ...

6 голосов
/ 01 ноября 2012

Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row

В вашем случае он должен вернуть # 9

5 голосов
/ 04 января 2013

Нашел этот подход на другом сайте.Он работает с новыми большими размерами Excel и не требует жесткого кодирования максимального числа строк и столбцов.

iLastRow = Cells(Rows.Count, "a").End(xlUp).Row
iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column

Благодаря мудрейкеру в Мельборне, Австралия

3 голосов
/ 10 июня 2011

Они оба также будут работать, позволяя Excel определять время последнего просмотра данных

numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row

numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
2 голосов
/ 15 августа 2016
  n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
1 голос
/ 20 октября 2014

Для большей ясности я хочу добавить наглядный пример и запустить

            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();

            }
1 голос
/ 21 октября 2013

Я предпочитаю использовать свойство 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
...