Ocultar ciertas columnas según el valor de una casilla.

He leído y probado varias respuestas de macros ya publicadas pero no encuentro la solución específica a lo que quiero realizar.
Quiero que se oculten unas ciertas columnas, o no, según el valor escrito en una casilla.
Ejemplo:
En la casilla C8 tengo un menú desplegable para elegir entre unos valores: rojo, naranja, azul, verde, morado, gris, blanco, amarillo, rosa y cian.

Lo que quiero es que si en la casilla C8 se elige del menú desplegable el valor "rojo", se oculten las columnas "G" y "H". El resto serian visibles.

Si se elige el valor "naranja" se deberían ocultar las columnas "I" y "J". El resto de columnas de la excel deberían ser visibles.

Y así con el resto de colores. Con el "azul" serian las columnas "K" y "L".

Con el verde serian las columnas MN.
Con el morado serian las columnas OP.
Con el gris serian las columnas QR.
Con el blanco serian las columnas ST.
Con el amarillo serian las columnas UV.
Con el rosa serian las columnas WX.
Con el cian serian las columnas YZ.
Si no se elige ningún color de los de la lista se deberían ver todas las columnas de la hoja excel.
Un apunte, en realidad la casilla C8 es una combinación de las C8+D8+E8+F8.
Esto me gustaría que se ejecutara solo y siempre. He utilizado otros macros que tengo que ejecutarlos cada vez y no es cómodo, lo ideal es que se ejecute de manera automática.

1 Respuesta

Respuesta
1

. 11.05.17 #VBA Ocultar columnas con lista desplegable

Buenos días, Enrique

La rutina que sigue reacciona a los cambios en tu celda C8 ocultando las columnas indicadas de acuerdo a tus instrucciones

Haz click con el botón derecho del mouse sobre la pestaña de la hoja donde quieres que ocurra lo que solicitas. Elije la opción "Ver Código" y pega lo siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== DIEGO, modifica estos datos de acuerdo a tu proyecto:
CeldaSele = "C5" ' Celda donde tienes la lista desplegable
'---- fin Variables
'
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'
Set isect = Application.Intersect(Range(CeldaSele), Target)
If Not isect Is Nothing Then
    Cells.EntireColumn.Hidden = False
    Select Case LCase(Target.Value)
        Case "rojo"
            LasCols = "G:H"
        Case "naranja"
            LasCols = "I:J"
        Case "azul"
            LasCols = "K:L"
        Case "verde"
            LasCols = "M:N"
        Case "morado"
            LasCols = "O:P"
        Case "gris"
            LasCols = "Q:R"
        Case "blanco"
            LasCols = "S:T"
        Case "amarillo"
            LasCols = "U:V"
        Case "rosa"
            LasCols = "W:X"
        Case "cian"
            LasCols = "Y:Z"
        Case Else
            LasCols = ""
    End Select
    Columns(LasCols).EntireColumn.Hidden = IIf(Len(LasCols) > 1, True, False)
End If
Set isect = Nothing
End Sub

.

.

Hola, de nuevo

La celda que indicaste es otra, así que usa este código con esa sola corrección:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== ENRIQUE, modifica estos datos de acuerdo a tu proyecto:
CeldaSele = "C8" ' Celda donde tienes la lista desplegable
'---- fin Variables
'
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'  
Set isect = Application.Intersect(Range(CeldaSele), Target)
If Not isect Is Nothing Then
    Cells.EntireColumn.Hidden = False
    Select Case LCase(Target.Value)
        Case "rojo"
            LasCols = "G:H"
        Case "naranja"
            LasCols = "I:J"
        Case "azul"
            LasCols = "K:L"
        Case "verde"
            LasCols = "M:N"
        Case "morado"
            LasCols = "O:P"
        Case "gris"
            LasCols = "Q:R"
        Case "blanco"
            LasCols = "S:T"
        Case "amarillo"
            LasCols = "U:V"
        Case "rosa"
            LasCols = "W:X"
        Case "cian"
            LasCols = "Y:Z"
        Case Else
            LasCols = ""
    End Select
    Columns(LasCols).EntireColumn.Hidden = IIf(Len(LasCols) > 1, True, False)
End If
Set isect = Nothing
End Sub

Desde luego, cuando cambie el contenido de la celda C8, se ocultarán las columnas indicadas, automáticamente como pedias.

Abrazo

Fer

.

.

... Y finalmente, previendo el caso de que borres varias celdas donde esté incluida la de la lista de validación, va esta variante que permite hacerlo sin arrojar error:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== ENRIQUE, modifica estos datos de acuerdo a tu proyecto:
CeldaSele = "C8" ' Celda donde tienes la lista desplegable
'---- fin Variables
'
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'  
Set isect = Application.Intersect(Range(CeldaSele), Target)
SAs = Application.WorksheetFunction.CountA(Target)
If Not isect Is Nothing And Target.Rows.Count = 1 And Target.Columns.Count Then
    Cells.EntireColumn.Hidden = False
    Select Case LCase(Target.Value)
        Case "rojo"
            LasCols = "G:H"
        Case "naranja"
            LasCols = "I:J"
        Case "azul"
            LasCols = "K:L"
        Case "verde"
            LasCols = "M:N"
        Case "morado"
            LasCols = "O:P"
        Case "gris"
            LasCols = "Q:R"
        Case "blanco"
            LasCols = "S:T"
        Case "amarillo"
            LasCols = "U:V"
        Case "rosa"
            LasCols = "W:X"
        Case "cian"
            LasCols = "Y:Z"
        Case Else
            LasCols = ""
    End Select
    If Len(LasCols) > 1 Then Columns(LasCols).EntireColumn.Hidden = True
End If
Set isect = Nothing
End Sub

Creo que así queda completa.

Abrazo

Fer

.

Fantástico. La respuesta es clara y sencilla.
Ahora se me crea otro problema, jejeje.

Las columnas S y T, las quiero por el momento siempre ocultas. Así como algunas otras que tengo bastante mas a la derecha, estas las tenia ocultas para que otros usuarios no les tiente el verlas o modificarlas. Al aplicar tu fantástica macro automáticamente se muestran.
¿Se puede variar algo para solucionar lo que te comento? Gracias.

Disculpa, otra cosa que me he dado cuenta.
Ayer puse una lista desplegable con colores, pero el usuario puede poner otro color, como por ejemplo "negro", en este caso lo correcto sería que se vieran todas las columnas (excepto las que te he comentado antes que yo oculto por defecto).
Gracias.
Por cierto, no se is es que no lleva titulo la macro, pero no me sale en el menú de ver macros. Solo puedo acceder haciendo clik en la pestaña.

.

Buenas, Enrique

Dado que la rutina está basada en el evento de que cambie algo en la celda C8, no es necesario que esté como una rutina que ejecutas manualmente. Por eso no está incluida en un módulo sino en la hoja donde debe funcionar.

Desde la versión anterior, está previsto que cualquier otro texto ingresado en esa celda que no sea los indicados entre los casos, haga que queden visibles todas las otras columnas, y así funcionó en las pruebas que hice.

En la siguiente versión agregué una variable donde le podrás indicar qué columnas mantener siempre ocultas. Luego hay una estructura que se encarga de mostrar todas las columnas, ocultar siempre esas y, finalmente, ocultar aquellas que correspondan al color. Que se seleccione:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== ENRIQUE, modifica estos datos de acuerdo a tu proyecto:
CeldaSele = "C8" ' Celda donde tienes la lista desplegable
ColOcultas = Array("S", "T", "AV", "BC") ' Listar aquí las columnas a mantener ocultas.
'---- fin Variables
'
'
' VBA coding by FeJoAl
'
'---- inicio de rutina:
'  
Set isect = Application.Intersect(Range(CeldaSele), Target)
If Not isect Is Nothing And Target.Rows.Count = 1 And Target.Columns.Count Then
    ActiveSheet.Cells.EntireColumn.Hidden = False
    For Ocult = 0 To UBound(ColOcultas)
        LasCols = ColOcultas(Ocult)
        ActiveSheet.Columns(LasCols).EntireColumn.Hidden = True
    Next
    Select Case LCase(Target.Value)
        Case "rojo"
            LasCols = "G:H"
        Case "naranja"
            LasCols = "I:J"
        Case "azul"
            LasCols = "K:L"
        Case "verde"
            LasCols = "M:N"
        Case "morado"
            LasCols = "O:P"
        Case "gris"
            LasCols = "Q:R"
        Case "blanco"
            LasCols = "S:T"
        Case "amarillo"
            LasCols = "U:V"
        Case "rosa"
            LasCols = "W:X"
        Case "cian"
            LasCols = "Y:Z"
        Case Else
            LasCols = ""
    End Select
    If Len(LasCols) > 1 Then ActiveSheet.Columns(LasCols).EntireColumn.Hidden = True
End If
Set isect = Nothing
End Sub

Creo que con esto respondo tus inquietudes. Si no, consultame de nuevo.

Abrazo

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas