我正在Excel 2013中的VBA中编写一个方法来遍历两个工作表中的行,并比较每个工作表中的行中的文本。但是,当我循环时,我发现代码循环遍历整个工作表,而不仅仅是带有数据的行。 Excel.Sheets(“Sheet1”)。Cells.SpecialCells(xlCellTypeLastCell)返回正确列中的单元格,但该行是工作表中的最后一行(1048576),而不是带有数据的最后一行(1951)。我已经在代码中写了一个空单元格的检查(因为我不能确定每一行都被使用),所以它不会导致问题,它只是意味着每次运行它需要比这应该。而且这个方法是从Worksheet_Change内部调用的,它确实会减慢速度。
通常,当“最后”单元格被错误地报告时,我发现保存通常会修复它,如果没有,则删除行(不仅仅是内容,而是整行)错误报告的最后一个单元格返回到实际的最后一个单元格,然后保存工作。但是,在这种情况下,它没有帮助。
我看过谷歌没有成功。如果我能提供帮助,我不想将所有数据和代码复制到本工作簿中,而是复制到新工作簿中。有人有什么建议吗?
答案 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