1

目前我正在处理一个显示大约的 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
4

2 回答 2

5

只是一些一般的想法。

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

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

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

这些技术中的任何一种都将花费不到 4 分钟的时间来隐藏 rowsl。

于 2013-08-10T13:09:30.163 回答
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
于 2013-08-10T09:01:34.993 回答