在VBA中有条件地隐藏行范围的最快方法是什么?

时间:2013-05-29 21:06:17

标签: vba for-loop hidden

我正在尝试加快我的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

2 个答案:

答案 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