Excel.Application.Cells.SpecialCells(xlCellTypeLastCell)返回工作表的底部,而不是最后一个数据单元格

暗月

我正在Excel 2013中的VBA中编写一种方法,以循环浏览两个工作表中的行,并比较每个表中一列中的文本。运行代码时,我发现代码遍历整个工作表,而不仅是包含数据的行。

Excel.Sheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell) 返回正确列中的单元格,但该行是工作表中的最后一行(1048576),而不是包含数据的最后一行(1951)。

我已经写了一个空单元格检查(因为我不能确定是否使用了有效范围内的每一行),所以它不会引起任何错误,但是由于从内部调用此方法Worksheet_Change,因此确实减慢了速度。

通常,当“最后一个”单元格报告不正确时,保存通常会对其进行修复,如果不正确,则将错误报告的最后一个单元格中的行(不仅是内容,而是整个行)删除,并返回到实际的最后一个单元格。单元格,然后保存作品。但是,在这种情况下,它无济于事。

我在Google上搜索失败。我不想不必将所有数据和代码从该工作簿中复制到新的工作簿中。有任何想法吗?

和瓦格纳

(太多信息无法在此处使用评论。)

VBA策划人Ron de Bruin对为什么xlCellTypeLastCell以及UsedRange在此处失败的原因写了一个简短的摘录http : //www.rondebruin.nl/win/s9/win005.htm

(在我最初的评论中链接到的帖子,“在VBA中查找上次使用的单元时出错”UsedRange,以同样的方式描述了的陷阱)。

这是直接报价:

xlCellTypeLastCell和UsedRange的可能问题是:

仅当您保存(或保存/关闭/重新打开文件)时,最后一个单元格才会重置。如果更改了单元格格式,则不会重置最后一个单元格,清除数据不足,则必须删除行或列,然后,请参见:http : //www.contextures.com/xlfaqApp.html#Unused

长话短说,在工作表中查找最后一行的逻辑属于全局函数。您将一直使用此功能。这是查找工作表的最后一行的示例:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'INPUT       : Sheet, the worksheet we'll search to find the last row
'OUTPUT      : Long, the last occupied row
'SPECIAL CASE: if Sheet is empty, return 1
'EXAMPLES    :
' 
'assume that there is a single 
'entry on MySheet in cell A5:
'
'LastRowNum(MySheet)
'>> 5
'
'assume that EmptySheet is totally empty:
'
'LastRowNum(EmptySheet)
'>> 1
'
Public Function LastRowNum(Sheet As Worksheet) As Long
    If Application.WorksheetFunction.CountA(Sheet.Cells) <> 0 Then
        LastRowNum = Sheet.Cells.Find(What:="*", _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious).Row
    Else
        LastRowNum = 1
    End If
End Function

就下降投票而言-不知道。实际上,我从来没有在这里投票过哈哈。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档