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

问题描述 投票:1回答:3

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

Excel.Sheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell)返回正确列中的单元格,但该行是工作表中的最后一行(1048576),而不是包含数据的最后一行(1951)。我已经在代码中写了一个对空单元格的检查(因为我不能确定是否使用了每一行),所以这不会引起问题,这仅意味着每次运行它所花费的时间比这应该。而且从Worksheet_Change内部调用此方法时,确实会使速度变慢。

通常,当“最后一个”单元格被错误地报告时,我发现通常可以解决保存问题,如果不行,则从列表中删除行(不仅是内容,还包括整个行)。将最后一个单元格错误地报告回实际的最后一个单元格,并且then保存工作。但是,在这种情况下,它没有帮助。

我浏览Google失败了。如果可以的话,我不需要将所有数据和代码从该工作簿中复制到新的工作簿中。有人有什么建议吗?

excel vba excel-vba excel-2013
3个回答
11
投票

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

[VBA策划人罗恩·德布鲁因(Ron de Bruin)写下了一段简短的内容,说明为什么xlCellTypeLastCellUsedRange可能在这里失败: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

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


1
投票

尝试使用以下代码来确定最后一行和最后一列

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

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  
© www.soinside.com 2019 - 2024. All rights reserved.