столбец А имеет такие данные (т.е. частые пустые ячейки):
HEADING <-- this is A1
kfdsl
fdjgnm
fdkj
gdfkj
4353
fdjk <-- this is A9
Я хотел бы иметь возможность получить ссылку на ячейку последней ячейки, у которой есть данные. Поэтому в приведенном выше примере я хочу вернуться: A9
Я пробовал это, но он останавливается в первой пустой ячейке (т.е. возвращает A4
)
numofrows = destsheet.Range("A2").End(xlDown).Row - 1
Мне нравится этот путь:
ActiveSheet.UsedRange.Rows.Count
То же самое можно сделать при подсчете столбцов. Для меня всегда работаю. Но, если у вас есть данные в других столбцах, приведенный выше код также рассмотрит их, потому что код ищет весь диапазон ячеек в листе.
3
, а не 4
(с использованием Office 2010).
Самый безопасный вариант
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 для этих вещей!
ActiveSheet.UsedRange.Rows.Count
не удалось (это то, что я обычно использую).
.Row
великого ответа выше. Новые пользователи могут быть смущены отсутствующим утверждением. numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)
будет предоставлять значение последней использованной ячейки. Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
с .Row
в конце обеспечит номер строки последней ячейки в столбце 1, как и предполагалось.
Я сравнил все возможности с длинным тестовым листом:
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
range("A" & activesheet.rows.count).end(xlup).row
:)
Нашел этот подход на другом сайте. Он работает с новыми большими размерами 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
.UsedRange.Rows.count
, вернет количество строк в UsedRange
, которое отличается от номера строки последнего фрагмента данных. Таким образом, если ваши строки 1 и 2 пусты, это вернет неправильный ответ на 2. Кроме того, это включает в себя последнюю непустую ячейку на всем листе, а не только рассматриваемый столбец. Может быть, этого хочет ОП, но я так не думаю; Кроме того, это действительно подвержено ошибкам, если кто-то случайно что-то пишет в ячейку "FY54239".
destsheet.SpecialCells(xlLastCell).row
даже не компилируется, по крайней мере, в Excel 2003: .SpecialCells
не применяется к объекту Sheet.
n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
У Жан-Франсуа Корбетта отсутствует ".Row" на большой ответ выше. Новые пользователи могут быть смущены отсутствующим оператором.
numofrows = Sheet1.Cells(Sheet1.Rows.Count,1).End(xlUp)
как указано, будет предоставлять значение последней использованной ячейки.
`Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row`
с .Row в конце будет содержать строку # последней ячейки в столбце 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();
}
Я предпочитаю использовать свойство 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