根据单元格值隐藏行非常慢
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
我有 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