EDC*_*EDC 2 excel performance vba loops filter
在 VBA 中将自动过滤器应用于大表后,我使用以下代码删除隐藏/过滤的行(大意味着大约 30,000 行):
Sub RemoveHiddenRows()
Dim oRow As Range, rng As Range
Dim myRows As Range
With Sheets("Sheet3")
Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange)
If myRows Is Nothing Then Exit Sub
End With
For Each oRow In myRows.Columns(1).Cells
If oRow.EntireRow.Hidden Then
If rng Is Nothing Then
Set rng = oRow
Else
Set rng = Union(rng, oRow)
End If
End If
Next
If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
Run Code Online (Sandbox Code Playgroud)
代码来自这里:Delete Hidden/Invisible Rows after Autofilter Excel VBA
此外,我阅读了此线程:加速删除工作表上隐藏行的代码
情况:我对一个由 12 列组成的表应用了 5 个不同的过滤器,因此在此过程之后很多行被过滤掉(隐藏)。当我尝试删除它们时,上面的代码需要很长时间。就我而言,我不知道 Excel 是否仍在工作,所以我不得不强制退出。这导致了以下问题:
除了遍历所有隐藏的行并删除它们之外,还有其他方法吗?
我想到的一个想法是仅将剩余的未过滤(即非隐藏)内容复制到新工作表,然后删除包含完整信息的旧工作表。如果是这样,那怎么办?
小智 5
我认为您不需要涉及另一个工作表。只需复制现有Range.CurrentRegion 属性下方的行,然后移除过滤器并删除原始数据。
Sub RemoveHiddenRows()
With Sheets("Sheet10")
With .Cells(1, 1).CurrentRegion
With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
If CBool(Application.Subtotal(103, .Columns(1))) Then
.Cells.Copy Destination:=.Cells(.Rows.Count + 1, 1)
End If
.AutoFilter
.Cells(1, 1).Resize(.Rows.Count, 1).EntireRow.Delete
End With
End With
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
您还可以通过在Code Review (Excel)上发帖来获得有关此主题的一些很好的、重点突出的帮助。