【问题标题】:What is the fastest way to conditionally hide a range of rows in VBA?在 VBA 中有条件地隐藏一系列行的最快方法是什么?
【发布时间】:2013-05-29 21:06:17
【问题描述】:

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

【问题讨论】:

  • 您如何称呼您的HideRowsUnhideRows 订阅者?你的 list1 范围是多少?举个例子……
  • 调用 HideRows(Range("SHORTprcal")),在我重新打开 Application.ScreenUpdating 之前我打了四次电话
  • 您的“SHORTprcal”的确切范围地址是多少?

标签: vba for-loop hidden


【解决方案1】:

无需循环——你应该能够一次隐藏整个范围——我使用这个子进行了测试:

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) 完全摆脱 for each,就像这样:

Public Sub HideRows(list1 As Range)
    Set list1 = list1.SpecialCells(xlCellTypeBlanks)
    list1.EntireRow.Hidden = True
End Sub

【讨论】:

  • 谢谢!我叫它有什么不同吗?调用 HideRows(Range("SHORTprcal")) 来调用 HideRows("SHORTprcal") ?编辑:刚刚注意到您的编辑。嗯
  • SpecialCells(xlCellTypeBlanks) 是要走的路。 +1
【解决方案2】:

考虑使用Application.ScreenUpdating。将此设置为 false 可防止 Excel 在每次操作后更新显示,从而显着提高速度 - 特别是在使用隐藏/取消隐藏等慢速命令时。

如果您不需要遍历您的单元格,您可以执行类似于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

【讨论】:

  • 我已经关闭了屏幕更新,但这对其他人来说是个好信息!谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-22
  • 2015-12-06
  • 1970-01-01
  • 2021-03-04
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
相关资源
最近更新 更多