简体   繁体   中英

Hide/Unhide a row based on the hidden/unhidden status of a range of cells

I want to unhide a single row if an ENTIRE range of rows is hidden. I want to hide this row if even a SINGLE row within the range is unhidden. What is the syntax for this? My current code is as follows:

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

I think I understand. How's this:

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

I'm kind of assuming that you want to hide/unhide Row 6, since it's one below your range's last row. Therefore, I created a variable to hold this. This way, if you want to change your range to say A1:A100 , all you have to do is adjust the rng , and it'll look to hide/unhide row 101. Of course, if you just need it to be 6 , then just do hideRow = 6 .

Edit: For fun, I tried to reduce the use of the counting variable numDashes and tried to the part where you check your range for all - to be more concise. The below should work too, but might need a tweak or two:

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

You can do this with a formula in a helper column. I used this one for financial statements to suppress rows where multiple column are all zero to shorten up the report.

 =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"). 

Then filter the rows by that column.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM