首页 > 解决方案 > ActiveSheet.ShowAllData 在 2 台机器上返回不同的结果

问题描述

我有一些宏可以按一列过滤所有数据(250 行),然后删除过滤后隐藏的数据。

下一步是使用 ActiveSheet.ShowAllData 取消过滤整个工作表。

奇怪的是,在我的机器上取消过滤后我使用的范围似乎是 200 行(50 行已被删除)。

然而,在另一台具有相同 Excel 版本(Office365)的机器上,在取消过滤和删除 50 行后,可见范围为 1,048,576 行(这几乎会弄乱进一步的自动填充等)

代码如下:

Dim lastRow As Long
Dim iCntr As Long

Range("A:AI" & Lines).AutoFilter Field:=32, Criteria1:= _
    "2611"
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For iCntr = lastRow To 1 Step -1
    If Rows(iCntr).Hidden = True Then Rows(iCntr).EntireRow.Delete
Next

ActiveSheet.ShowAllData

标签: excelvba

解决方案


我建议在一个变量中收集所有需要删除的行,RowsToDelete然后在一次删除所有行之前显示所有数据。不确定这是否最终解决了您的问题,但至少这比删除每一行要快得多。

Option Explicit

Public Sub DeleteAllHiddenRows()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ws.Range("A:AI").AutoFilter Field:=32, Criteria1:="2611"

    Dim RowsToDelete As Range

    Dim iRow As Long
    For iRow = 1 To LastRow
        If ws.Rows(iRow).Hidden Then
            If RowsToDelete Is Nothing Then
                Set RowsToDelete = ws.Rows(iRow)
            Else
                Set RowsToDelete = Union(RowsToDelete, ws.Rows(iRow))
            End If
        End If
    Next iRow

    ws.ShowAllData
    RowsToDelete.EntireRow.Delete
End Sub

推荐阅读