小编典典

使用 VBA 在 Excel 中查找最后使用的单元格时出错

all

当我想找到最后使用的单元格值时,我使用:

Dim LastRow As Long

LastRow = Range("E4:E48").End(xlDown).Row

Debug.Print LastRow

当我将单个元素放入单元格时,我得到了错误的输出。但是当我在单元格中输入多个值时,输出是正确的。这背后的原因是什么?


阅读 63

收藏
2022-07-16

共1个答案

小编典典

注意
:我打算将其设为“一站式帖子”,您可以在其中使用该Correct方式找到最后一行。这还将涵盖查找最后一行时要遵循的最佳实践。因此,每当我遇到新的场景/信息时,我都会继续更新它。


找到最后一行的不可靠方法

一些最常见的查找最后一行的方法非常不可靠,因此永远不应该使用。

  1. 使用范围
  2. xl向下
  3. 计数A

UsedRange永远 不要 用来查找最后一个有数据的单元格。这是非常不可靠的。试试这个实验。

在单元格中输入一些内容A5。现在,当您使用下面给出的任何方法计算最后一行时,它会给您
5。现在将单元格涂成A10红色。如果你现在使用下面的任何代码,你仍然会得到
5。如果你使用Usedrange.Rows.Count你会得到什么?不会是5。

这是一个展示如何UsedRange工作的场景。

在此处输入图像描述

xlDown同样不可靠。

考虑这段代码

lastrow = Range("A1").End(xlDown).Row

如果只有一个单元格 ( A1) 有数据会怎样?您最终将到达工作表中的最后一行!这就像选择单元格A1,然后End按键,然后Down Arrow按键。如果某个范围内有空白单元格,这也会给您带来不可靠的结果。

CountA也是不可靠的,因为如果中间有空白单元格,它会给你不正确的结果。

因此应该避免使用UsedRange,xlDownCountA找到最后一个单元格。


在列中查找最后一行

要查找 Col E 中的最后一行,请使用此

With Sheets("Sheet1")
    LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With

如果你注意到我们有一个.before
Rows.Count。我们经常选择忽略这一点。有关您可能遇到的错误,请参阅此问题。我总是建议使用.beforeRows.CountColumns.Count.
该问题是一个经典场景,其中代码将失败,因为Excel 2003 及更早版本以及Excel 2007
及更高版本的Rows.Count返回。类似地分别返回和。65536``1048576``Columns.Count``256``16384

Excel 2007+
具有行的上述事实1048576也强调了这样一个事实,即我们应该始终声明将保存行值的变量,Long否则Integer会出现Overflow错误。

请注意,此方法将跳过任何隐藏的行。回顾我上面 A 列的屏幕截图,如果第 8
行被隐藏,这种方法将返回5而不是8.


在工作表中查找最后一行

要查找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

查找表中的最后一行 (ListObject)

同样的原则也适用,例如获取表格第三列的最后一行:

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
2022-07-16