我有一本包含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
答案 0 :(得分:3)
每次隐藏行时,Excel就会停止更新屏幕(并可能执行计算)。因此,为了真正加快速度,请禁用所有屏幕更新和应用程序事件(包括计算),直到完成隐藏为止。
因此带有这样的Sub:
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 :(得分: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
。