列A包含这样的数据(即频繁的空白单元格):
HEADING <-- this is A1
kfdsl
fdjgnm
fdkj
gdfkj
4353
fdjk <-- this is A9
我希望能够获得具有数据的最后一个单元格的单元格引用。所以在上面的例子中我想返回:A9
我试过这个,但它停在第一个空格(即返回A4
)
numofrows = destsheet.Range("A2").End(xlDown).Row - 1
答案 0 :(得分:49)
我喜欢这样:
ActiveSheet.UsedRange.Rows.Count
列数也可以这样做。对我来说,总是工作。但是,如果您在其他列中有数据,上面的代码也会考虑它们,因为代码正在查找工作表中的所有单元格区域。
答案 1 :(得分:41)
最安全的选项是
Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastcol = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
请勿使用UsedRange
或SpecialCells(xlLastCell)
或End(xlUp)
。如果您之前删除了某些行,则所有这些方法都可能会产生错Excel仍会计算这些不可见的单元格。
如果您删除单元格,保存工作簿,关闭并重新打开它们,这些方法将再次起作用。
答案 2 :(得分:26)
这将独立于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行进行这些操作!
答案 3 :(得分: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
我认为最喜欢的是......
答案 4 :(得分:6)
Dim RowNumber As Integer
RowNumber = ActiveSheet.Range("A65536").End(xlUp).Row
在你的情况下它应该返回#9
答案 5 :(得分:5)
在另一个网站上找到此方法。它适用于新的较大尺寸的Excel,不需要您对最大行数和列数进行硬编码。
iLastRow = Cells(Rows.Count, "a").End(xlUp).Row
iLastCol = Cells(i, Columns.Count).End(xlToLeft).Column
答案 6 :(得分:3)
这些都可以使用,让Excel定义上次查看数据的时间
numofrows = destsheet.UsedRange.SpecialCells(xlLastCell).row
numofrows = destsheet.Cells.SpecialCells(xlLastCell).row
答案 7 :(得分:2)
n = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count
答案 8 :(得分: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
答案 9 :(得分: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();
}