1

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

2 回答 2

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

但是,我认为您确实可以通过使用完全摆脱 for each SpecialCells(xlCellTypeBlanks),如下所示:

Public Sub HideRows(list1 As Range)
    Set list1 = list1.SpecialCells(xlCellTypeBlanks)
    list1.EntireRow.Hidden = True
End Sub
于 2013-05-29T21:15:16.763 回答
1

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

如果您不需要遍历您的单元格,您可以执行类似于Reband 先生的回答的操作

但总的来说,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
于 2013-05-29T21:16:55.773 回答