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

当我想查找上次使用的单元格值时,我使用:

将最后一行的尺寸设为最长
LastRow=范围(“E4:E48”)。结束(xlDown)。行
调试。打印最后一行

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

注意:我打算将此设置为“一站式张贴”,您可以使用正确的方法查找最后一行。这还将包括查找最后一行时要遵循的最佳实践。因此,每当我遇到新的场景/信息时,我都会不断更新它


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

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

  1. UsedRange
  2. xlDown
  3. 伯爵

UsedRange永不使用查找最后一个包含数据的单元格。这是非常不可靠的。试试这个实验

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

下面是一个演示UsedRange如何工作的场景

xlDown同样不可靠

考虑一下这个代码

lastrow=范围(“A1”).End(xlDown).Row

如果只有一个单元格(A1)有数据,会发生什么情况?您将到达工作表中的最后一行!这就像选择单元格A1,然后按结束键,然后按向下箭头键。如果在某个范围内有空白单元格,这也会导致不可靠的结果

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

因此,应避免使用UsedRangexlDownCountA查找最后一个单元格


查找列中的最后一行

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

带图纸(“图纸1”)
LastRow=.Range(“E”&Rows.Count).End(xlUp).Row
以

如果您注意到在行之前有一个。请计数。我们常常选择忽略这一点。关于可能出现的错误,请参见此问题。我总是建议在行.计数列.计数之前使用。这个问题是一个典型的场景,其中代码将失败,因为对于Excel 2003及更早版本,Rows.Count返回65536,对于Excel 2007及更高版本返回1048576。类似地,Columns.Count分别返回25616384

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

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


查找工作表中的最后一行

要查找工作表中的有效最后一行,请使用此选项。注意Application.WorksheetFunction.CountA(.Cells)的用法。这是必需的,因为如果工作表中没有包含数据的单元格,则.Find将给出运行时错误91:对象变量或未设置块变量

带图纸(“图纸1”)
If Application.WorksheetFunction.CountA(.Cells)&lt&燃气轮机;0那么
lastrow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lastrow=1
如果结束
以

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

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

子FindAstrowinExceltableColaAndB()
最后一排一样长
将ws设置为工作表,tbl设置为ListObject
设置ws=Sheets(“Sheet1”)“根据需要进行修改
'假设表的名称为“Table1”,根据需要进行修改
Set tbl=ws.ListObjects(“表1”)
带tbl.ListColumns(3.Range)
lastrow=.Find(内容:=“*”_
之后:=.个单元格(1)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
以
端接头

发表评论