我总是看到人们使用它来查找列中的最后一行
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
我一直在我的项目中使用此功能来找到它,因为我想要最后一个未使用的行,但现在我总是看到人们使用End xlUp方法我想知道为什么因为它只给出了可能不正确的列。 / p>
Function GetLastRow(sh As Worksheet) As Long
Dim X As Long
X = sh.UsedRange.Rows.Count 'force excel to recalculate last row
GetLastRow = sh.Cells.SpecialCells(xlLastCell).Row
End Function
是否存在此函数未能给出最后一行及其发生原因的任何情况?
有时会发生这样的情况,它给我一行可能是由于格式化而导致的最后一行数据之后的许多行(通常是导出的报告 - 然后我在循环中重新开始工作以完全删除这些行空白) 什么是UsedRange实际上考虑使用?
我真的想要一个可靠的功能,我将来可以依赖它
答案 0 :(得分:2)
Excel稀疏地跟踪单元格:将其视为跟踪具有任何信息的每个单元格的行和列对(实际上它比它复杂一点,但它仍然是一种很好的思考方式)。信息可以是格式或数据或公式或...
因此,最后使用的单元格是单元格跟踪表中的最后一个条目。但仅通过清除信息不会重置单元跟踪表。
由于Excel 2007 sh.UsedRange.Rows.Count(不幸)不会重置单元格表。
主要是当你想要找到最后一个使用过的单元格时,你想找到实际包含数据或公式的最后一个单元格而不是单元格表格中的最后一个单元格。
使用Range.End(xlUp)等查找包含数据或公式的最后一个VISIBLE单元格,因此如果隐藏行或使用过滤,则需要小心使用。并且在考虑多个列时需要循环代码。但它是3种主要方法中最快的。
使用Find通常是最可靠的方法(但它忽略了形状和注释,并且在合并单元格和空数据透视表方面存在问题):
jLastRow = oSht.Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
jLastCol = oSht.Range("A1:A" & CStr(jLastRow)).EntireRow.Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
答案 1 :(得分:0)
在Excel中,如果从A1到Z100输入数据,则使用的范围从A1到Z100。
如果删除行50到100,则使用的范围仍为A1到Z100。只清除细胞不会减少使用范围。 Excel将标记先前输入数据的最后一行/最后一列。
如果您想在电子表格中找到最后填充的单元格, UsedRange
会给您一个意外的结果,因为它会考虑以前可能使用过的行和列。
如果要查找列中的最后一行,则使用rows.count和end(xlUp)的方法更准确,因为它会考虑当前值。 UsedRange可能更大。