Как посчитать количество строк в Excel с данными?

49

столбец А имеет такие данные (т.е. частые пустые ячейки):

HEADING  <-- this is A1
kfdsl
fdjgnm
fdkj

gdfkj
4353

fdjk  <-- this is A9

Я хотел бы иметь возможность получить ссылку на ячейку последней ячейки, у которой есть данные. Поэтому в приведенном выше примере я хочу вернуться: A9

Я пробовал это, но он останавливается в первой пустой ячейке (т.е. возвращает A4)

numofrows = destsheet.Range("A2").End(xlDown).Row - 1
Теги:
excel
excel-interop

11 ответов

51

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

ActiveSheet.UsedRange.Rows.Count

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

  • 16
    Если у вас нет данных в строке 1, это даст неправильный ответ - это даст количество строк от первой до последней ячейки. Если у вас есть данные в ячейках a2: a4, это уравнение приведет к 3 , а не 4 (с использованием Office 2010).
  • 6
    Этот метод может быть опасен, потому что он может вернуть ячейку с цветом, но без данных или даже ячейку, которая содержала данные, но не была должным образом очищена.
Показать ещё 2 комментария
41

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

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

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

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

  • 4
    +1 провел небольшое тестирование, и это кажется наиболее надежным, особенно если вы не знаете, к какому столбцу относятся данные в последнем ряду
  • 4
    Это единственный безопасный способ найти последнюю ячейку, содержащую данные. Другие методы терпят неудачу со скрытыми строками / столбцами или ячейками без данных, кроме форматирования или ячеек, которые были удалены.
Показать ещё 3 комментария
25

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

  • 1
    Это сработало для меня, когда ActiveSheet.UsedRange.Rows.Count не удалось (это то, что я обычно использую).
  • 0
    Вы пропали без вести. .Row великого ответа выше. Новые пользователи могут быть смущены отсутствующим утверждением. numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp) будет предоставлять значение последней использованной ячейки. Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row с .Row в конце обеспечит номер строки последней ячейки в столбце 1, как и предполагалось.
19

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

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

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

  • 1
    +1 - это мой любимый ответ. Не принимая стороны, просто показывая некоторые из вариантов и их относительную эффективность. Должно быть гораздо больше голосов!
  • 8
    @Floris: Как вы думаете, скорость является наиболее важным критерием, по которому можно судить, какая из различных возможностей должна быть любимой? Вместо того, что работает надежно? (Потому что они не все дают одинаковые результаты при любых обстоятельствах ...)
Показать ещё 3 комментария
6

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

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

  • 1
    +1, а для Excel 2007 и далее используйте range("A" & activesheet.rows.count).end(xlup).row :)
5

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

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

Благодаря mudraker в Мелборне, Австралия

3

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

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

numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
  • 4
    Это неправильно на нескольких уровнях. Ваше первое предложение, .UsedRange.Rows.count , вернет количество строк в UsedRange , которое отличается от номера строки последнего фрагмента данных. Таким образом, если ваши строки 1 и 2 пусты, это вернет неправильный ответ на 2. Кроме того, это включает в себя последнюю непустую ячейку на всем листе, а не только рассматриваемый столбец. Может быть, этого хочет ОП, но я так не думаю; Кроме того, это действительно подвержено ошибкам, если кто-то случайно что-то пишет в ячейку "FY54239".
  • 0
    Ваше второе предложение, destsheet.SpecialCells(xlLastCell).row даже не компилируется, по крайней мере, в Excel 2003: .SpecialCells не применяется к объекту Sheet.
Показать ещё 1 комментарий
2
  n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
1

У Жан-Франсуа Корбетта отсутствует ".Row" на большой ответ выше. Новые пользователи могут быть смущены отсутствующим оператором.

numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)

как указано, будет предоставлять значение последней использованной ячейки.

`Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row`

с .Row в конце будет содержать строку # последней ячейки в столбце 1, как предполагал Жан.

1

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

            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

Я предпочитаю использовать свойство 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
  • 2
    Это не будет работать для исходного вопроса, потому что данные не все смежные.
  • 1
    Чарльз, ты так прав. В показанном случае мой метод действительно потерпит неудачу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню