Option Explicit
Dim lVisibleCount As Long
Private Sub HideSheet()
Dim Index As Long
Dim Index2 As Long
Dim bolProcessing As Boolean
Dim bolLooking2Insert As Boolean
AbandonShip:
If lVisibleCount = 1 Then
Me.Hide
DoEvents
MsgBox "You must leave at least one visible sheet.", vbInformation Or vbOKOnly, "ERROR:"
Me.Show vbModal
Exit Sub
End If
Do
bolProcessing = False
For Index = 0 To (Me.lstVisible.ListCount - 1)
If Me.lstVisible.Selected(Index) Then
ThisWorkbook.Worksheets(Me.lstVisible.List(Index, 0)).Visible = xlSheetVeryHidden
bolLooking2Insert = True
For Index2 = 0 To (Me.lstHidden.ListCount - 1)
If ThisWorkbook.Worksheets(Me.lstHidden.List(Index2, 0)).Index > ThisWorkbook.Worksheets(Me.lstVisible.List(Index, 0)).Index Then
Me.lstHidden.AddItem Me.lstVisible.List(Index, 0), Index2
bolLooking2Insert = False
Exit For
End If
Next
If bolLooking2Insert Then Me.lstHidden.AddItem Me.lstVisible.List(Index, 0)
lVisibleCount = lVisibleCount - 1
Me.lstVisible.Selected(Index) = False
Me.lstVisible.RemoveItem Index
If Not lVisibleCount = 1 Then
bolProcessing = True
Exit For
Else
Exit Sub
End If
End If
Next
Loop While bolProcessing
End Sub
Private Sub ShowSheet()
Dim Index As Long
Dim Index2 As Long
Dim bolProcessing As Boolean
Dim bolLooking2Insert As Boolean
Do
bolProcessing = False
For Index = 0 To (Me.lstHidden.ListCount - 1)
If Me.lstHidden.Selected(Index) Then
ThisWorkbook.Worksheets(Me.lstHidden.List(Index, 0)).Visible = xlSheetVisible
bolLooking2Insert = True
For Index2 = 0 To (Me.lstVisible.ListCount - 1)
If ThisWorkbook.Worksheets(Me.lstVisible.List(Index2, 0)).Index > ThisWorkbook.Worksheets(Me.lstHidden.List(Index, 0)).Index Then
Me.lstVisible.AddItem Me.lstHidden.List(Index, 0), Index2
bolLooking2Insert = False
Exit For
End If
Next
If bolLooking2Insert Then Me.lstVisible.AddItem Me.lstHidden.List(Index, 0)
lVisibleCount = lVisibleCount + 1
Me.lstHidden.Selected(Index) = False
Me.lstHidden.RemoveItem Index
bolProcessing = True
Exit For
End If
Next
Loop While bolProcessing
End Sub
Private Sub cmdHide_Click()
HideSheet
End Sub
Private Sub cmdShow_Click()
ShowSheet
End Sub
Private Sub lstHidden_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ShowSheet
End Sub
Private Sub lstVisible_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
HideSheet
End Sub
Private Sub UserForm_Initialize()
Dim WS As Worksheet
With Me
.BackColor = &HC8D0D4
.BorderColor = &H0&
.Caption = "Hide or Show Sheets"
.ForeColor = &H0&
.Height = 200.25
.Width = 193.5
With .cmdHide
.BackColor = &HC8D0D4
.Caption = "Hide Sheets"
.ForeColor = &H0&
.Height = 21.75
.Left = 96.75
.Top = 147.75
.Width = 84.75
End With
With cmdShow
.BackColor = &HC8D0D4
.Caption = "Display Sheets"
.ForeColor = &H0&
.Height = 21.75
.Left = 6
.Top = 147.75
.Width = 84.75
End With
With .lblHidden
.BackColor = &HC8D0D4
.BorderColor = &H0&
.Caption = "Currently Hidden"
.ForeColor = &H0&
.Height = 9.75
.Left = 6
.TextAlign = fmTextAlignCenter
.Top = 6
.Width = 84.75
End With
With .lblVisible
.BackColor = &HC8D0D4
.BorderColor = &H0&
.Caption = "Currently Visible"
.ForeColor = &H0&
.Height = 9.75
.Left = 96.75
.TextAlign = fmTextAlignCenter
.Top = 6
.Width = 84.75
End With
With .lstHidden
.BackColor = &HFFFFFF
.BorderColor = &H0&
.ColumnCount = 1
.ForeColor = &H0&
.Height = 120
.Left = 6
.MultiSelect = fmMultiSelectExtended
.TextAlign = fmTextAlignLeft
.Top = 15.75
.Width = 84.75
End With
With .lstVisible
.BackColor = &HFFFFFF
.BorderColor = &H0&
.ColumnCount = 1
.ForeColor = &H0&
.Height = 120
.Left = 96.75
.MultiSelect = fmMultiSelectExtended
.TextAlign = fmTextAlignLeft
.Top = 15.75
.Width = 84.75
End With
End With
For Each WS In ThisWorkbook.Worksheets
Select Case WS.Visible
Case xlSheetVisible
Me.lstVisible.AddItem WS.Name
lVisibleCount = lVisibleCount + 1
Case xlSheetVeryHidden, xlSheetHidden
Me.lstHidden.AddItem WS.Name
End Select
Next
End Sub