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)