gpt4 book ai didi

performance - 优化 VBA 中删除隐藏行的性能

转载 作者:行者123 更新时间:2023-12-01 15:39:08 26 4
gpt4 key购买 nike

在对 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

代码来自这里:Delete Hidden/Invisible Rows after Autofilter Excel VBA

此外,我阅读了这个主题:Speeding Up Code that Removes Hidden Rows on a Sheet

情况:我对一个由 12 列组成的表应用了 5 个不同的过滤器,因此在该过程之后很多行被过滤掉(隐藏)。当我尝试删除它们时,上面的代码需要很长时间。在我的例子中,我不知道 Excel 是否还在工作,所以我不得不强制退出。这就引出了以下问题:

除了遍历所有隐藏的行并删除它们之外,还有其他方法吗?

我想到的一个想法是仅将剩余的未过滤(即非隐藏)内容复制到新工作表,然后删除包含完整信息的旧工作表。如果可以,该怎么做?

最佳答案

我认为您不需要涉及另一个工作表。只需复制现有 Range.CurrentRegion property 下面的行然后移除过滤器并删除原始数据。

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

您还可以通过在 Code Review (Excel) 上发帖获得有关此主题的一些很好的、有针对性的帮助。 .

关于performance - 优化 VBA 中删除隐藏行的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com