2016-01-13 176 views
0

如果隱藏了整個行的範圍,我想取消隱藏單個行。如果該範圍內的單行不被隱藏,我想隱藏該行。這是什麼語法?我目前的代碼如下:隱藏/取消隱藏基於單元格範圍的隱藏/未隱藏狀態的行

Public Sub MySub() 

Application.ScreenUpdating = False 

With Range("A1:A5") 
.EntireRow.Hidden = False 

For Each cell In Range("A1:A5") 
    Select Case cell.Value 
     Case Is = "-" 
     cell.EntireRow.Hidden = True 
    End Select 
Next cell 

End With 

Application.ScreenUpdating = True 

End Sub 
+0

你可以檢查'如果行(Cell.Row).EntireRow.Hidden = True然後...'?不太清楚問題是什麼,你能澄清一點嗎? – BruceWayne

+1

所以我在A1:A5中有值。如果其中任何值等於「 - 」,則VBA代碼將隱藏相應的行。如果它們全都等於「 - 」,我希望單元格6行取消隱藏。如果即使第1-5行中的一個未被隱藏(意味着A1,A2,A3,A4或A5中的值不等於「 - 」),我希望第6行被隱藏。 –

回答

1

我想我明白了。這個怎麼樣:

Sub test() 
Dim cel As Range, rng As Range 
Dim hideRow&, numDashes& 

Set rng = Range("A1:A5") 
hideRow = rng.Count + 1 

For Each cel In rng 
    If cel.Value = "-" Then 
     numDashes = numDashes + 1 
     Rows(cel.Row).EntireRow.Hidden = True 
    End If 
Next cel 
If numDashes = rng.Count Then 
    ' If all cells in the range are '-' 
    Rows(hideRow).EntireRow.Hidden = False 
Else 
    Rows(hideRow).EntireRow.Hidden = True 
End If 
End Sub 

我是那種假設你要隱藏/取消隱藏行6,因爲它是一個你的範圍內的最後一行以下的。因此,我創建了一個變量來保存這個。這樣,如果你想改變你的範圍來說A1:A100,你所要做的就是調整rng,它會看起來隱藏/取消隱藏第101行。當然,如果你只需要它是6,那麼只是做hideRow = 6

編輯:爲了好玩,我試圖減少計數變量numDashes的使用,並試圖檢查所有-的範圍,以便更加簡潔。下面也應該工作,但可能需要一兩個調整:

Sub test2() 
Dim cel As Range, rng As Range 
Dim hideRow& 

Set rng = Range("A1:A5") 
hideRow = rng.Count + 1 
'Check to see if your range is entirely made up of `-` 
If WorksheetFunction.CountIf(rng, "-") = rng.Count Then 
    Rows(hideRow).EntireRow.Hidden = False 
    ' If you want to stop your macro if ALL range values are "-", then uncomment the next line: 
    'Exit Sub 
Else 
    Rows(hideRow).EntireRow.Hidden = True 
End If 

For Each cel In rng 
    If cel.Value = "-" Then 
     Rows(cel.Row).EntireRow.Hidden = True 
    End If 
Next cel 

End Sub 
+0

@MarkRomano - 調整是什麼?懸念! – BruceWayne

+0

真棒,韋恩!我做的唯一的調整是第一個'If'語句的'Else'語句,行'行(cel.Row).EntireRow.Hidden = False'。在我真正的Excel文檔中,這些值A1:A5根據另一個工作表中單元格中的值進行更改。此外,只有在該單元格發生更改時纔會觸發此方法。這可能是我不得不添加'Else'的原因。再次感謝! –

+0

@MarkRomano - 所以,只有當A1:A5中的值發生變化時,這個宏纔會運行?你可以使一個'Worksheet_Change'事件自動觸發,而不必猜測/知道一個單元格是否已經改變。 – BruceWayne

0

你可以用一個輔助列中的公式做到這一點。我用這個財務報表來壓縮多列都爲零的行來縮短報表。

=IF(AND(SUM(A7:R7)<1,SUM(A7:R7)>-1),IF(OR(ISNUMBER(LEFT(H7,4)),ISBLANK(H7),ISERR(VALUE(LEFT(H7,4)))),"Show","Hide"),"Show"). 

然後按該列過濾行。

+1

@BruceWayne感謝您編輯帖子。我對此很陌生。你如何在滾動中獲得公式?看起來你沒有改變它。 –

+0

我剛剛突出顯示公式,並單擊了代碼標籤按鈕('{}')。 – BruceWayne