基于单元格值隐藏行非常慢
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 <> ""
这不可能是真的,所以我不确定我是否理解目的。也许你的意思是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 它不会取消隐藏隐藏的行。以上是关于基于单元格值隐藏行非常慢的主要内容,如果未能解决你的问题,请参考以下文章