Vba 隐藏行宏运行时间过长

Vba 隐藏行宏运行时间过长,vba,excel,Vba,Excel,有没有办法让这段代码运行得更快?我试图在多个工作表中隐藏空白行 Option Explicit Private Sub HideRows_Click() Dim ws As Worksheet, c As Range Application.ScreenUpdating = False On Error Resume Next For Each ws In ThisWorkbook.Worksheets Select Case ws.Name

有没有办法让这段代码运行得更快?我试图在多个工作表中隐藏空白行

Option Explicit

Private Sub HideRows_Click()

Dim ws As Worksheet, c As Range

    Application.ScreenUpdating = False
    On Error Resume Next

    For Each ws In ThisWorkbook.Worksheets
        Select Case ws.Name
        Case "Sheet1", "Sheet2", "Sheet3"
        'sheets to exclude
            'do nothing

        Case Else 'hide rows on these sheets
            For Each c In ws.Range("AJ16:AJ153,AJ157:AJ292")
                c.EntireRow.Hidden = c.Value = 0
            Next c
        End Select
    Next ws

    Application.ScreenUpdating = True

End Sub

以下是为加快代码速度而对代码所做的一些更改:

  • 关闭计算、事件和状态栏
  • 首先通过
    Union()
    函数将
    AJ
    中的所有值分组为无值,然后对该组合范围调用
    EntireRow.Hide
老实说,这是相当干净的代码开始

Option Explicit

Private Sub HideRows_Click()

    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .DisplayStatusBar = False
        .EnableEvents = False
    End With

    'On Error Resume Next

    Dim ws As Worksheet
    For Each ws In Worksheets

        Select Case ws.name
            Case "Sheet1", "Sheet2", "Sheet3" 'sheets to exclude
                'do nothing

            Case Else 'hide rows on these sheets
                Dim unioned As Range
                Set unioned = Nothing

                Dim c As Range
                For Each c In ws.Range("AJ16:AJ153,AJ157:AJ292")
                    If Len(c.Value2) = 0 Then
                        If unioned Is Nothing Then
                            Set unioned = c
                        Else
                            Set unioned = Union(unioned, c)
                        End If
                    End If
                Next c

                unioned.EntireRow.Hidden = True
        End Select

    Next ws

    With Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
        .DisplayStatusBar = True
        .EnableEvents = True
    End With

End Sub

关闭计算和事件。@Marcucciboy2
Range.Hidden
需要
TRUE/FALSE
,因此如果c.Value为0,则返回
FALSE
TRUE
。您可以合并这些范围并同时隐藏它们,如下所示:。根本不需要循环!还有一个注意事项,删除“下一步恢复错误时的
,它将隐藏需要修复而不是忽略的错误。有时间和地点可以使用它,但它不应该是默认操作。只有大约1%的代码需要它。@ScottCraner所以解决方案似乎是1)在空时循环范围和联合2)隐藏联合范围,而不是逐行隐藏。我真的不觉得我有责任把这些放在一起,所以我回答为社区维基谢谢你的帮助!但是,当我尝试使用“set unioned=Union(unioned,c)运行时错误“1004”行运行代码时,出现了一个问题。对象“u global”的方法“Union”failed@tangkt尝试在“应用程序”中添加:
Set unioned=Application.Union(unioned,c)
@tangkt好的,看起来问题实际上是excel希望确保您合并的两个范围都在同一张表上。所以我有两个想法,但我现在无法测试它们,因为我是“移动的”.1)在工作表变暗后立即尝试
set unioned=nothing
,或2)查看仅指定工作表是否与
Union(ws.unioned,c)