Search code examples
excelvbaloopshide

Hiding/unhiding excel sheets based of a matrix


I have a macro that works, but it's not very effective and could be done a lot better.

I simply have a list with all sheet names(they could change so it needs to be dynamic) in one row and in the next row I have a "yes/no" answer that displays if the sheet should be hidden or not.

Example:

Sheet 1, sheet2, sheet3, sheet4,

yes, yes, no, yes

My code so far:

Sub HidingSheets()

'Checking the first sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("E9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("E9").Value).Activate

If ActiveSheet.Range("A1") = "NO" Then
    ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------

'Checking the second sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("F9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("F9").Value).Activate

If ActiveSheet.Range("A1") = "NO" Then
    ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------

End Sub

I basically do it manually per every sheet instead of a loop, and this also requires that I need the "yes/no" displayed in every sheet(the "if" formula checking if A1 = "no"). The "yes/no" that s displayed in cell A1 is taken from the matrix that I explained before.

Note: The matrix could be "tranposed", the direction of it doesn't matter.

Thank you in advance if you can help me.

My second attempt is this:

Sub Hiding2()

Dim i As interger

For i = 1 To 10

    a = ActiveSheet.Range("E9").Value

    If Offset(a(1, 0)) = YES Then
        Sheets(a).Visible = True
    Else
       Sheets(a).Visible = False
    End If

Next i

End Sub

But I dont know how to reference the cells that I need, and then get them to move over for every "i".


Solution

  • Sub HideWorksheets()
        Dim Cell As Range
        Dim Data As Range: Set Data = Worksheets("Sheet1").Range("E9:N9")
        On Error Resume Next
        For Each Cell In Data
            Worksheets(Cell.value).Visible = IIf(Cell.Offset(1, 0) = "YES", xlSheetHidden, xlSheetVisible)
        Next Cell
    End Sub