当我想找到最后使用的单元格值时,我使用:
Dim LastRow As Long LastRow = Range("E4:E48").End(xlDown).Row Debug.Print LastRow
当我将单个元素放入单元格时,我得到了错误的输出。但是当我在单元格中输入多个值时,输出是正确的。这背后的原因是什么?
注意 :我打算将其设为“一站式帖子”,您可以在其中使用该Correct方式找到最后一行。这还将涵盖查找最后一行时要遵循的最佳实践。因此,每当我遇到新的场景/信息时,我都会继续更新它。
Correct
一些最常见的查找最后一行的方法非常不可靠,因此永远不应该使用。
UsedRange永远 不要 用来查找最后一个有数据的单元格。这是非常不可靠的。试试这个实验。
UsedRange
在单元格中输入一些内容A5。现在,当您使用下面给出的任何方法计算最后一行时,它会给您 5。现在将单元格涂成A10红色。如果你现在使用下面的任何代码,你仍然会得到 5。如果你使用Usedrange.Rows.Count你会得到什么?不会是5。
A5
A10
Usedrange.Rows.Count
这是一个展示如何UsedRange工作的场景。
xlDown同样不可靠。
xlDown
考虑这段代码
lastrow = Range("A1").End(xlDown).Row
如果只有一个单元格 ( A1) 有数据会怎样?您最终将到达工作表中的最后一行!这就像选择单元格A1,然后End按键,然后Down Arrow按键。如果某个范围内有空白单元格,这也会给您带来不可靠的结果。
A1
End
Down Arrow
CountA也是不可靠的,因为如果中间有空白单元格,它会给你不正确的结果。
CountA
因此应该避免使用UsedRange,xlDown并CountA找到最后一个单元格。
要查找 Col E 中的最后一行,请使用此
With Sheets("Sheet1") LastRow = .Range("E" & .Rows.Count).End(xlUp).Row End With
如果你注意到我们有一个.before Rows.Count。我们经常选择忽略这一点。有关您可能遇到的错误,请参阅此问题。我总是建议使用.beforeRows.Count和Columns.Count. 该问题是一个经典场景,其中代码将失败,因为Excel 2003 及更早版本以及Excel 2007 及更高版本的Rows.Count返回。类似地分别返回和。65536``1048576``Columns.Count``256``16384
.
Rows.Count
Columns.Count
65536``1048576``Columns.Count``256``16384
Excel 2007+ 具有行的上述事实1048576也强调了这样一个事实,即我们应该始终声明将保存行值的变量,Long否则Integer会出现Overflow错误。
1048576
Long
Integer
Overflow
请注意,此方法将跳过任何隐藏的行。回顾我上面 A 列的屏幕截图,如果第 8 行被隐藏,这种方法将返回5而不是8.
5
8
要查找Effective工作表中的最后一行,请使用它。注意使用Application.WorksheetFunction.CountA(.Cells). 这是必需的,因为如果工作表中没有包含数据的单元格,那么.Find将为您提供Run Time Error 91: Object Variable or With block variable not set
Effective
Application.WorksheetFunction.CountA(.Cells)
.Find
Run Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1") If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastrow = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else lastrow = 1 End If End With
同样的原则也适用,例如获取表格第三列的最后一行:
Sub FindLastRowInExcelTableColAandB() Dim lastRow As Long Dim ws As Worksheet, tbl as ListObject Set ws = Sheets("Sheet1") 'Modify as needed 'Assuming the name of the table is "Table1", modify as needed Set tbl = ws.ListObjects("Table1") With tbl.ListColumns(3).Range lastrow = .Find(What:="*", _ After:=.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row End With End Sub