根据单元格值隐藏行非常慢

Hiding rows based on cell value is very slow

我有 hide/unhide 行的工作代码,具体取决于相应的单元格值。

这是一个材料清单,有一个 'finalize' 按钮。您按下按钮,数量 = 0 的任何行都应被隐藏。

有 400 多行,我可以看到这些行消失了。它每秒处理大约 20 行,这使得完成列表的时间超过 20 秒。这个名单每隔几个月就会翻一番。

是否有另一种方法可以更快地隐藏线条?

隐藏:

Public Sub HideRows()
Dim cell As Range
For Each cell In ActiveSheet.Range("H18:H469")
    cell.EntireRow.Hidden = (cell.Value = 0 And cell.Value <> "")
Next cell
End Sub

取消隐藏:

Public Sub UnhideRows()
Dim cell As Range
For Each cell In ActiveSheet.Range("H18:H469")
    If (cell.Value = 0 And cell.Value <> "") Then cell.EntireRow.Hidden = False
Next cell
End Sub

在代码开头关闭屏幕更新和手动计算。请务必在代码末尾重新打开。

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '...your code...
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

我只是按照评论中显示的那样打字。使用 Union 收集符合条件的范围并一口气隐藏。我不确定你为什么要进行双重测试。 = 0 还不够吗?或如@Marcucciby2 查询,您是否打算使用 Or?

并且如其他答案中所述,您可以通过切换 ScreenUpdating、pageBreaks 和切换到手动计算模式来进行一些优化。

如果可能,删除该 ActiveSheet 引用并使用实际的工作簿和工作表引用。

Option Explicit
Public Sub HideRows()
    Dim cell As Range, unionRng As Range
    For Each cell In ActiveSheet.Range("H18:H469")
        If cell.Value = 0 Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, cell)
            Else
                Set unionRng = cell
            End If
        End If
    Next
    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True
End Sub