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

时间:2014-08-04 02:02:32

标签: excel vba excel-vba excel-2013

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

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

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

3 个答案:

答案 0 :(得分:10)

(此处使用评论的信息过多。)

VBA策划人Ron de Bruin写了一篇关于为什么xlCellTypeLastCell以及UsedRange可能在这里失败的原因:http://www.rondebruin.nl/win/s9/win005.htm

(在我最初的评论Error in finding last used cell in 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

就downvote而言 - 不知道。我实际上从未在这里投票哈哈。

答案 1 :(得分:1)

尝试使用以下代码确定最后一行&amp;而是

Dim LastCol As Long

Dim LastRow As Long

LastCol = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

LastRow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row

答案 2 :(得分:0)

你可以试试这个:

Dim xlastcel As Range  
On Error Resume Next  
   ActiveSheet.ShowAllData: Err.Clear  ' Show All  
   ActiveSheet.UsedRange               ' Ajust Vertical Scrool  
   With ActiveSheet:  Set xlastcell = .Cells.Find(What:="*", After:=.[A1], SearchDirection:=xlPrevious): End With  
   If Err.Number > 0 Then MsgBox "Sheet without data", vbOKOnly  
On Error GoTo 0