2013-08-25 82 views
1

我写了下面的代码来隐藏工作表使用范围内的空白行。代码工作得很好。我已将此宏分配给工作表上的按钮。点击按钮隐藏使用范围内的空白行。使用相同的按钮隐藏和取消隐藏空白行

问题:我如何修改代码,以便点击相同的按钮会做相反的操作?如果空行不被隐藏,则点击按钮隐藏它们;如果它们隐藏了,那么点击同一个按钮就可以取消隐藏它们?我想用一个按钮执行这两个过程。

Sub HideLLRows() 
'This sub un/hides blank rows in EIRP LL 

Application.ScreenUpdating = False 

Dim LastRow As Long 
Set EIRPLL = Sheets("EIRP LL") 

LastRow = EIRPLL.UsedRange.Rows.Count 

For i = 6 To LastRow 
    If EIRPLL.Range("B" & i) = "" Then 
     EIRPLL.Rows(i).Hidden = True 
    End If 
Next 

Application.ScreenUpdating = True 
End Sub 

回答

3

简单的答案是切换每个空白行的Hidden状态,你发现它

EIRPLL.Rows(i).Hidden = Not EIRPLL.Rows(i).Hidden 

其缺点是,如果用户改变的隐藏状态的一个或多个空白那么这个宏将不会让你回到所有隐藏或全部可见的状态。

另一种方法是根据找到的第一个空白来设置可见性。

这里是你的代码重构,有一些额外的优化:

  • Dim所有的变量
  • 环一varaint阵列,而不是一个范围。这是更快
  • 设置所有行的Hidden财产在一个去

Sub HideLLRows() 
    'This sub un/hides blank rows in EIRP LL 

    Application.ScreenUpdating = False 
    Dim i As Long 
    Dim EIRPLL As Worksheet 
    Dim NewState As VbTriState 
    Dim dat As Variant 
    Dim rws As Range 

    Dim LastRow As Long 
    Set EIRPLL = Sheets("EIRP LL") 

    With EIRPLL.UsedRange 
     LastRow = .Rows.Count - .Row + 1 ' in case used range doesn't start at row 1 
     dat = .Columns(2).Resize(LastRow, 1) 
    End With 

    NewState = vbUseDefault 
    With EIRPLL 
     For i = 6 To LastRow 
      If dat(i, 1) = "" Then 
       If NewState = vbUseDefault Then 
        NewState = Not .Rows(i).Hidden 
       End If 
       If rws Is Nothing Then 
        Set rws = Cells(i, 1) 
       Else 
        Set rws = Union(rws, Cells(i, 1)) 
       End If 
      End If 
     Next 
    End With 
    rws.EntireRow.Hidden = NewState 

    Application.ScreenUpdating = True 
End Sub 
+0

你的代码的工作寄望,我非常感激。解决方案比我预想的要复杂得多,我必须研究这些新概念,特别是关于循环速度的观点,因为我正在运行许多循环。再次感谢。 – jmaz

+0

不错的一个克里斯。我有一个解决方案,我想,它使用了'SpecialCells',但我意识到(再次)'xlCellTypeBlanks'不能识别导致空白的公式。 –

+0

感谢Doug,我一直忘记'SpecialCells'。我的代码无法识别返回空白的公式。 (但可以改为使用'.Formula'代替默认的'.Value') –