隐藏和取消隐藏切换按钮 - 运行速度非常慢

问题描述 投票:0回答:2

我有一本包含 12 张工作表的工作簿,我在每张工作表中放置了一个命令按钮来隐藏/取消隐藏行。为了隐藏特定行,我在 A 列中为需要隐藏的每一行键入了“A”。因此,代码可以工作,但它会永远运行,需要很长时间并且隐藏或取消隐藏行的速度非常慢。在某些工作表中,要检查的总行数为 100,有些工作表为 750。请告知运行缓慢的原因,或者是否有更好的方法可以使其运行得更快。这是代码:-

Private Sub CommandButton1_Click()
Sheet2.Unprotect ("aaa")
Dim rng As Range
Dim iRow As Range
Dim hidden_status As Boolean

CommandButton1.Caption = "Show / Hide Guidelines"

On Error Resume Next

   Set rng = Range("A1:A750")
    For Each iRow In rng.Rows
        If iRow.Text = "A" Then
           With iRow.EntireRow
                 hidden_status = .Hidden
                .Hidden = Not hidden_status
           End With
        End If
    Next iRow

On Error GoTo 0
Sheet2.Protect ("aaa")
End Sub
excel vba
2个回答
3
投票

每次隐藏一行,Excel 就会停止更新屏幕(并可能执行计算)。因此,为了真正加快速度,请禁用所有屏幕更新和应用程序事件(包括计算),直到完成隐藏为止。

所以有了这样的子:

Private Sub SetUpdates(ByVal newState As Boolean)
    With Application
        .ScreenUpdating = newState
        .EnableEvents = newState
        .DisplayAlerts = newState
    End With
End Sub

你可以这样做:

Private Sub CommandButton1_Click()
    SetUpdates newState:=False

    '--- hide your rows here

    SetUpdates newState:=True
End Sub

1
投票

您可以使用

AutoFilter

此过程将隐藏任何在传递给它的工作表引用上 A 列中不包含值的行。 如果已应用过滤器,它将删除它。

Public Sub HideA(wrkSht As Worksheet)

    With wrkSht
        If .FilterMode Then
            .ShowAllData
        Else
            .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)) _
                .AutoFilter Field:=1, Criteria1:="=", VisibleDropDown:=False
        End If
    End With

End Sub

在包含按钮的每张工作表上添加该按钮的代码(根据需要重命名该过程):

Private Sub CommandButton1_Click()
    HideA ActiveSheet
End Sub  

这样做的一个缺点是它在过滤中不包括单元格

A1

© www.soinside.com 2019 - 2024. All rights reserved.