2017-04-12 86 views
0

由于某些原因,此宏表现出非常迟缓的宏运行。由于每次尝试更改不属于范围的未隐藏单元格的信息时,这会变得有问题,因此它仍会运行更新并需要将近5-10秒才能完成。工作表行为非常缓慢,隐藏行

该公式需要发生什么变化才能解决这个问题?

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim c As Range 


    For Each c In Range("A7:A98") 
     If c.Value = 0 And c.Value = vbNullString Then 
     c.EntireRow.Hidden = True 
     End If 
    Next c 

    For Each c In Range("A7:A98") 
     If c.Value <> 0 And c.Value <> vbNullString Then 
     c.EntireRow.Hidden = False 
     End If 
    Next c 

End Sub 
+1

最糟糕的是,你的代码甚至没有运行!目标<>范围导致类型不匹配!但我接受优化作为一个有效的问题! –

+0

'如果目标<>范围(“A7:A98”)然后<<~~这是错误的。 – Jeeped

+0

我忘了我那里。如果目标<>范围(“A7:A98”)然后我屠宰代码,试图找出如何忽略除了正在检查的细胞以外的细胞......显然这是行不通的。我将相应地编辑帖子。 – Thelnternet

回答

0

你的逻辑似乎简略,这是一个有点分不清你正在尝试做的,但你的逻辑可以缩短,用来确定布尔值.Hidden。

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Range("A7:A98")) Is Nothing Then 
     On Error GoTo safe_exit 
     Application.EnableEvents = False 
     Dim trgt As Range 
     For Each trgt In Intersect(Target, Range("A7:A98")) 
      trgt.EntireRow.Hidden = CBool(trgt.Value = vbNullString) 
     Next trgt 
    End If 

safe_exit: 
    Application.EnableEvents = True 

End Sub 
1

像这样的东西应该为你工作:

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim rCheck As Range 
    Dim rCell As Range 
    Dim rHide As Range 
    Dim lCalc As XlCalculation 

    Set rCheck = Me.Range("A7:A98") 

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

    On Error GoTo CleanExit 

    If Not Intersect(Target, rCheck) Is Nothing Then 
     rCheck.EntireRow.Hidden = False 
     For Each rCell In rCheck 
      If rCell.Value = 0 And rCell.Value = vbNullString Then 
       If rHide Is Nothing Then 
        Set rHide = rCell 
       Else 
        Set rHide = Union(rHide, rCell) 
       End If 
      End If 
     Next rCell 
    End If 

    If Not rHide Is Nothing Then rHide.EntireRow.Hidden = True 

CleanExit: 
    With Application 
     .Calculation = lCalc 
     .EnableEvents = True 
     .ScreenUpdating = True 
    End With 

End Sub 
+0

谢谢!这完全解决了我的问题。 – Thelnternet