Formulario para mostrar y ocultar hojas en Excel usando ListBox
Siguiendo con el tema de macros y formularios en Excel, en este artículo les comparto un formulario donde prodremos ocultar y mostrar hojas de manera dinámica.
Pasar elementos de un ListBox a otro
Nuestro formulario contrendrá dos ListBox donde los elementos serán los nombres de las hojas que haya en el archivo activo. Si elegimos el nombre de una hoja que se encuntra en el ListBox izquierdo (hojas visibles), lo podremos mover hacia el ListBox derecho (hojas ocultas).
Figura 1. Ocultar y mostrar hoja en Excel.
Libros protegidos
Tengamos en cuenta que si nuestro archivo tiene protegida su estructura o sus ventanas, Excel no nos permite realizar esto comandos de ocultar y mostrar hojas.
Para validar la protección del libro usamos la siguiente macro.
Option Explicit ' Private Sub CommandButton1_Click() 'Declaramos variables Dim VentanaProtegida As Boolean Dim EstructuraProtegida As Boolean ' With ActiveWorkbook ' 'Damos valores a las variables VentanaProtegida = .ProtectWindows EstructuraProtegida = .ProtectStructure ' End With ' 'En caso de que el libro tenga la estructura protegida no contiúa. If VentanaProtegida Or EstructuraProtegida Then MsgBox "Este comando no se puede ejecutar en un libro con estructura protegida.", _ vbExclamation, "EXCELeINFO" Else UserForm1.Show End If ' End Sub
Mostrar y ocultar hojas
Ya vimos que si elegimos un elemento de los ListBox éste se pasará al otro. Para que todo sea dinámico y no tengamos que salir del formulario para ver los cambios, en el momento en el que un elemento se pasa de ListBox veremos la acción de mostrar u ocultar.
Figura 2. Ocultar y mostrar hojas en Excel dinámicamente.
Código de la macro
'--------------------------------------------------------------------------------------- ' Module : UserForm1 ' Author : Sergio Alejandro Campos. http://www.exceleinfo.com ' Date : 10/10/2014 ' Purpose : Mostrar y ocultar hojas. '--------------------------------------------------------------------------------------- ' Private Sub CommandButton1_Click() Unload Me End Sub ' Private Sub CommandButton2_Click() ' 'Declaramos variables Dim Cuenta As Integer Dim Numero As Integer Dim j As Integer Dim i As Integer Dim strNombreItem As String ' Cuenta = Me.lstOcultas.ListCount Numero = 0 ' 'Validamos que haya un elemento seleccionado. For j = 0 To Cuenta - 1 If Me.lstOcultas.Selected(j) = True Then Numero = Numero + 1 End If Next j ' If Numero <> 0 Then ' 'La hoja seleccionada se pasará al ListBox de hojas visibles. For i = 0 To Cuenta - 1 If Me.lstOcultas.Selected(i) = True Then strNombreItem = Me.lstOcultas.List(i) Me.lstOcultas.RemoveItem i Me.lstVisibles.AddItem strNombreItem ActiveWorkbook.Sheets(strNombreItem).Visible = True End If Next i ' End If ' End Sub Private Sub CommandButton3_Click() ' 'Declaramos variables Dim Cuenta As Integer Dim Numero As Integer Dim j As Integer Dim i As Integer Dim strNombreItem As String ' Cuenta = Me.lstVisibles.ListCount Numero = 0 ' 'Validamos que haya un elemento seleccionado. For j = 0 To Cuenta - 1 If Me.lstVisibles.Selected(j) = True Then Numero = Numero + 1 End If Next j ' If Cuenta = 1 Then MsgBox "Debe haber por lo menos una hoja visible.", vbExclamation, "EXCELeINFO" Else ' If Numero <> 0 Then ' 'La hoja seleccionada se pasará al ListBox de hojas visibles. For i = 0 To Cuenta - 1 'If ListBox1.Selected(i) Then If Me.lstVisibles.Selected(i) = True Then strNombreItem = Me.lstVisibles.List(i) Me.lstVisibles.RemoveItem i Me.lstOcultas.AddItem strNombreItem ActiveWorkbook.Sheets(strNombreItem).Visible = False End If Next i ' End If End If ' End Sub ' Private Sub UserForm_Initialize() ' Dim Hoja As Object ' For Each Hoja In ActiveWorkbook.Sheets ' If Hoja.Visible = True Then Me.lstVisibles.AddItem Hoja.Name Else Hoja.Visible = False Me.lstOcultas.AddItem Hoja.Name End If ' Next Hoja ' End Sub