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

Ric*_*ers 1 excel performance vba excel-vba

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

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

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

1)更新屏幕已设置:

        Application.ScreenUpdating = False
        Application.EnableEvents = False
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

chu*_*uff 5

只是一些一般的想法.

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

  2. 如果您不希望向用户显示自动过滤器,您仍然可以使用它来进行过滤.具体的步骤是:使用自动筛选过滤掉(不显示),你就行不会要隐藏; 将过滤的行分配给范围变量; 删除过滤器; 隐藏范围变量中标识的行.有关技术的工作示例,请参阅此SO帖子.

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

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