2013-08-25 129 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') –