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

Dar*_*oon 1 excel vba excel-vba excel-2013

我正在Excel 2013中的VBA中编写一个方法来循环遍历两个工作表中的行,并比较每个工作表中的列中的文本.但是,当我循环时,我发现代码循环遍历整个工作表,而不仅仅是带有数据的行.Excel.Sheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell)返回正确列中的单元格,但该行是工作表中的最后一行(1048576),而不是带有数据的最后一行(1951).我已经在代码中写了一个空单元格的检查(因为我不能确定每一行都被使用),所以它不会导致问题,它只是意味着每次运行它需要比这应该.并且当从Worksheet_Change内部调用此方法时,它确实会减慢速度.

通常,当"最后"单元格被错误地报告时,我会发现保存通常会修复它,如果没有,那么从错误中删除行(不仅仅是内容,而是整行)报告最后一个单元格回到实际的最后一个单元格然后保存工作.但是,在这种情况下,它没有帮助.

我看过谷歌没有成功.如果我能提供帮助,我不想将所有数据和代码复制到本工作簿中,而是复制到新工作簿中.有人有什么建议吗?

Dan*_*ner 11

(这里使用评论的信息太多了.)

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
Run Code Online (Sandbox Code Playgroud)

对于downvote来说 - 不知道.我实际上从来没有在这里投票哈哈.