在Excel VBA中有效隐藏/取消隐藏许多(+500)行

时间:2013-08-10 08:15:35

标签: excel vba excel-vba performance

目前我正在开发一个显示大约的Excel / VBA工作簿。预算中的500项,每项在不同的行上。我希望用户选择预算中的详细程度:在每个单独项目的最高级别上,在较低的详细程度上,几个项目将分组在一个标题下。

下面概述的方法(逐行隐藏/取消隐藏)非常慢:隐藏/取消隐藏大部分项目大约需要4分钟。 我希望你有任何关于如何加快程序的提示!

通过对话框选择详细程度时,程序将执行以下步骤:

1)更新屏幕已关闭:

        Application.ScreenUpdating = False
        Application.EnableEvents = False

2)预算中的每个行项目确定是否应该隐藏该行。我正在使用的代码如下:

    with sheets("[name sheet here]")
         .Range("[identifier of budget line item here]").EntireRow.Hidden = False / True
         ...             
         [500 times]
         ...
    end with

3)其次,根据细节程度,对应于子标题的文本可以是白色或黑色。这大约需要20行:

    With Sheets("[name sheet here]").Range("[identifier of budget line item here]").Font
         .ThemeColor = xlThemeColorLight1
         .TintAndShade = 0
    End With

4)最后,再次根据细节层次,再次绘制一些在隐藏某些行时变得不可见的线条。对于各种范围,这样做了10次左右:

    Range("[range here]").Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        Selection.Borders(xlEdgeLeft).LineStyle = xlNone
        Selection.Borders(xlEdgeTop).LineStyle = xlNone
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
    End With

2 个答案:

答案 0 :(得分:5)

只是一些一般的想法。

  1. 将自动过滤器应用于数据范围,并使用用户提供的详细级别作为过滤条件。如果您不希望结果看起来像自动过滤器,则可以通过编程方式隐藏每列顶部的下拉箭头。该方法描述为 here

  2. 如果您不希望向用户显示自动过滤器,您仍然可以使用它来进行过滤。步骤如下:使用自动过滤器过滤掉(不显示)要隐藏的行;将过滤的行分配给范围变量;删除过滤器;隐藏范围变量中标识的行。有关该技术的工作示例,请参阅 this SO post

  3. 使用Union函数循环遍历列表,将要隐藏的所有行收集到单个范围对象中,然后通过为范围中的行设置IsHidden属性True来隐藏行(HideRange.EntireRow。 IsHidden = True)。 (有关该方法的示例,请参阅 here ,在这种情况下,该方法用于删除所选行。)

  4. 任何这些技术都需要花费不到4分钟的时间来隐藏行。

答案 1 :(得分:0)

为什么不隐藏更大范围的行而不是一次隐藏一行?像

Sub HideRows()
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = True
End Sub
Sub UnHideRows()
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = False
End Sub