我正在尝试加快我的VBA代码,但我不知道该怎么做。到目前为止最慢的任务是我的循环来隐藏空行。 (我有几个垂直对齐的数据透视表,我不得不留出空间,以便在添加新数据时扩展它们。)
Public Sub HideRows(list1 As Range)
Dim cell As Range
For Each cell In list1
cell.EntireRow.Hidden = (cell.Value = "")
Next cell
End Sub
Public Sub UnhideRows(list1 As Range)
Dim cell As Range
For Each cell In list1
If (cell.Value <> "") Then cell.EntireRow.Hidden = False
Next cell
End Sub
答案 0 :(得分:2)
无需循环 - 您应该能够同时隐藏整个范围 - 我使用此子测试:
Public Sub HideRows_test(list1 As Range)
list1.EntireRow.Hidden = True
End Sub
编辑:对不起,我对此跳了一下枪,没有意识到范围有条件。但是,您可以使用现有循环构建新范围,然后隐藏其中的所有行,而不是单独隐藏每个范围。
编辑:我提到你可以动态构建范围,然后隐藏最后的所有行 - 这是如何:
Public Sub HideRows(list1 As Range)
Dim cellsToHide As Range
Set cellsToHide = Nothing
Dim cell As Range
For Each cell In list1
If cell.Value = "" Then
If cellsToHide Is Nothing Then
Set cellsToHide = cell
Else
Set cellsToHide = Union(cellsToHide, cell)
End If
End If
Next cell
cellsToHide.EntireRow.Hidden = True
End Sub
然而,我认为你确实可以通过使用SpecialCells(xlCellTypeBlanks)
来完全摆脱每一个,就像这样:
Public Sub HideRows(list1 As Range)
Set list1 = list1.SpecialCells(xlCellTypeBlanks)
list1.EntireRow.Hidden = True
End Sub
答案 1 :(得分:1)
使用Application.ScreenUpdating
。将此设置为false会阻止Excel在每次操作后更新显示,这会显着提高速度 - 特别是在使用诸如hide / unhide之类的慢速命令时。
如果您不需要遍历单元格,则可以执行与mr Reband's answer类似的操作。
但总的来说,Application.ScreenUpdating = false
将显着加快几乎所有与Excel交互的代码。
Public Sub HideRows(list1 As Range)
Dim cell As Range
Application.ScreenUpdating = False
For Each cell In list1
cell.EntireRow.Hidden = (cell.Value = "")
Next cell
Application.ScreenUpdating = True
End Sub
Public Sub UnhideRows(list1 As Range)
Dim cell As Range
Application.ScreenUpdating = False
For Each cell In list1
If (cell.Value <> "") Then cell.EntireRow.Hidden = False
Next cell
Application.ScreenUpdating = True
End Sub