基于单元格值隐藏行非常慢

Posted

技术标签:

【中文标题】基于单元格值隐藏行非常慢【英文标题】:Hiding rows based on cell value is very slow 【发布时间】:2019-04-06 21:04:09 【问题描述】:

我有工作代码可以根据相应的单元格值隐藏/取消隐藏行。

这是一个材料清单,有一个“完成”按钮。您按下按钮,应隐藏数量 = 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 的开头关闭屏幕更新。如果在代码末尾重新打开,请务必打开 在这种情况下,我们建议您构建要隐藏的单元格范围,然后一次性隐藏该范围 为什么要双重测试? cell.Value = 0 和 cell.Value "" 而不仅仅是 =0 ? 但是我也不明白你使用的这种逻辑cell.Value = 0 And cell.Value &lt;&gt; "" 这不可能是真的,所以我不确定我是否理解目的。也许你的意思是Or 【参考方案1】:

在代码开始时关闭屏幕更新和手动计算。确保在代码末尾重新打开 if。

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

【讨论】:

【参考方案2】:

我只是像 cmets 中出现的那样打字。使用 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

【讨论】:

我忘了补充一点,我不是 VBA 向导,我使用的大部分功能都是从互联网上从像你们这样的伟人那里拿来的 ;-) 我能把脚本也给 UN-隐藏(即显示所有内容)?非常感谢! Judt 将 sub 中的代码复制到一个新的 sub 中(更改名称)并更改此行:If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True如果不是 unionRng 什么都不是,那么 unionRng.EntireRow.Hidden = False 这有意义吗? 这太完美了!非常感谢:) @QHarr 它不会取消隐藏隐藏的行。

以上是关于基于单元格值隐藏行非常慢的主要内容,如果未能解决你的问题,请参考以下文章

基于 rhandsontable 中单元格值的颜色行

如何使用 Pandas 在 Python 中基于同一行中的另一个单元格设置单元格值

基于单个单元格值的 Google 电子表格中的重复行

每次活动单元格更改行时更新单元格值

根据表格中的单元格值隐藏按钮

基于dojo gridx中单元格值的样式单元格