我正在Excel 2013中的VBA中编写一个方法,以循环浏览两个工作表中的行,并比较每个工作表中一列中的文本。但是,当我遍历时,我发现代码遍历了整个工作表,而不仅仅是包含数据的行。
Excel.Sheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell)
返回正确列中的单元格,但该行是工作表中的最后一行(1048576),而不是包含数据的最后一行(1951)。我已经在代码中写了一个对空单元格的检查(因为我不能确定是否使用了每一行),所以这不会引起问题,这仅意味着每次运行它所花费的时间比这应该。而且从Worksheet_Change
内部调用此方法时,确实会使速度变慢。
通常,当“最后一个”单元格被错误地报告时,我发现通常可以解决保存问题,如果不行,则从列表中删除行(不仅是内容,还包括整个行)。将最后一个单元格错误地报告回实际的最后一个单元格,并且then保存工作。但是,在这种情况下,它没有帮助。
我浏览Google失败了。如果可以的话,我不需要将所有数据和代码从该工作簿中复制到新的工作簿中。有人有什么建议吗?
(太多信息,无法在此处使用评论。)
[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
就下降投票而言-不知道。实际上,我从来没有在这里投票过哈哈。
尝试使用以下代码来确定最后一行和最后一列
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
您可以尝试以下方法:
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