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

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

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

我通过谷歌浏览没有成功。 我想不必将所有的数据和代码从这个工作簿中复制到一个新的,如果我可以帮助它。 任何人有任何build议?

(太多的信息在这里使用评论。)

VBA主谋Ron de Bruin写了一些关于为什么xlCellTypeLastCellUsedRange可能在这里失败的文章: http : UsedRange

(在我在我的初始评论中链接到的文章中, 在VBA中查找最后使用的单元格时发生错误, UsedRange的缺陷也以相同的方式描述。

这是直接的报价:

xlCellTypeLastCell和UsedRange的可能的问题是:

最后一个单元格只会在保存(或保存/closures/重新打开文件)时重新设置。 如果单元格格式化被更改,它不会重置最后一个单元格,清除数据是不够的,您必须删除行或列然后,请参阅: http : //www.contextures.com/xlfaqApp.html#Unused

简而言之,查找表单最后一行的逻辑属于全局函数。 你会一直使用这个function。 以下是在工作表中查找最后一行的示例:

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '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去 – 不知道。 我其实从来没有在这里downvoted哈哈。

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

 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