Как подсчитать количество строк в excel с данными? - программирование
Подтвердить что ты не робот

Как подсчитать количество строк в 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
4b9b3361

Ответ 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, как предполагал Жан.