it-swarm.com.ru

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

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

ActiveSheet.UsedRange.Rows.Count

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

49
Tomamais

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

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

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

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

41
nixda

Это будет работать независимо от версии 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)

Обратите внимание, что этот метод не работает в некоторых случаях Edge:

  • Последняя строка содержит данные
  • Последние строки скрыты или отфильтрованы

Так что будьте осторожны, если вы планируете использовать строку 1 048 576 для этих вещей!

26
Jean-François Corbett

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

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

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

19
sven

_Dim RowNumber As Integer_
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row

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

6
Lubor

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

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

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

5
MonroeGA

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

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

numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
3
Hari Seldon
  n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
2
Dado

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

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

            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
daniele3004