在VBA中查找上次使用的单元格时出错‘’

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

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

Dim last_row As Integer
Dim LastRow As Long

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

Debug.Print LastRow

当我将一个元素放入一个单元格中时,我得到了错误。

提问于
用户回答回答于

:我打算把它变成“一站式邮件”,可以在这里使用Correct找到最后一排的方法。这还将涵盖在查找最后一行时应遵循的最佳实践。因此,每当我遇到新的场景/信息时,我都会继续更新它。

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

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

UsedRange

xlDown

CountA

UsedRange不可能用于查找包含数据的最后一个单元格。

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

下面是一个演示如何UsedRange起作用了。

xlDown同样不可靠。

考虑一下这段代码

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

如果只有一个细胞会发生什么A1哪一个有数据?将最终到达工作表中的最后一行!就像选择细胞A1然后按结束键,然后按下箭头键。如果在一个范围内有空白单元格,这也会给出不可靠的结果。

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

因此,我们应该避免使用UsedRangexlDownCountA.

在列中找到最后一排

要在Col E中找到最后一行,请使用以下命令

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

如果你注意到我们有.以前Rows.Count我们经常选择忽略这一点。我总是建议用.以前Rows.CountColumns.Count这个问题是一个典型的场景,在这种情况下,代码将失败,因为Rows.Count回报65536用于Excel 2003及更早版本和1048576用于Excel 2007及更高版本。类似Columns.Count回报25616384分别。

Excel 2007+具有1048576行还强调这样一个事实:我们应该始终声明变量,该变量将将行值保存为Long而不是Integer否则你会得到一个Overflow错误。

找到最后一排

找到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
用户回答回答于

  1. 使用=非空白,即数据
  2. USED=“in use”,意思是包含数据或格式

对于标准2,UsedRange是最可靠的选择它甚至没有必要保存工作簿以确保更新最后一个单元格。在保存之前,Ctrl+End将转到错误的单元格(“在保存工作表之前,最后一个单元格不会重置”。

还有另一个陷阱:

标准2不考虑条件格式。可能是基于公式格式化的单元格,这些单元格未被UsedRange或者Ctrl+End。在图中,最后一个单元格是B3,因为格式化是显式应用于它的。单元格b6:d7具有从条件格式规则派生的格式,即使在UsedRange.

这背后的原因是什么?

如果没有“错误”输出,则将获得“错误”输出。非空白你范围内的细胞可能不是第一个。

请注意:

  1. 如果范围包含非连续的非空白单元格,那么它也会给出错误的结果。
  2. 如果只有一个非空白单元格,但不是第一个单元格,那么代码仍然会给出正确的结果。

扫码关注云+社区