En excel. Ocultar columnas por medio de MACRO, luego de filtrar tabla

Supongamos que tengo una tabla de 20 x 20. Los Valores pueden ser VERDADERO o FALSO.

La tabla tiene formato de tabla, así que puedo filtrar por columna. Elijo filtrar 2 de estas columnas para que me muestre los resultados verdaderos.

Ahora, se podrá por medio de una macro o algún otro modo, ocultar las columnas que son falsas, ¿para qué la tabla no sea tan grande?

1 Respuesta

Respuesta
1

H o l a:

Disculpa, pero no entendí esto: "ocultar las columnas que son falsas"

Quieres que de las columnas 1 a la 20, después que haces un filtro, ¿si en alguna de las filas está la palabra "falso" que se oculte toda la columna?

Si es algo diferente, puedes explicarlo con varias imágenes.

S a l u d o s

Claro. ahí agrego algunas imágenes. Para hacerla corta hice una tabla de 10 x 10. con resultados variables VERDADERO/FALSO

(foto1).

Después, filtre la columna 4 para que me muestre los que tienen un resultado VERDADERO. y me quedo la foto 2.

Lo que necesitaría es, si se puede con una macro. ocultar las columnas que tienen un resultado "falso", para dejarme solo las columnas con un resultado verdadero.  Y de ser posible una que revierta los cambios.

Foto 3.

H o l a:

Te anexo la macro, funciona de la siguiente forma:

1. Selecciona una celda de la fila 1, siguiendo con tu ejemplo, selecciona la celda D1.

2. En automático la macro te filtra las filas y te oculta las columnas.

3. Para quitar el filtro y mostrar las columnas presiona nuevamente click en la celda D1.

4. En caso de que se oculten todas las columnas, para mostrar nuevamente la información, presiona click en la siguiente celda, de la fila, donde termina la tabla, en tu ejemplo sería la celda K1.


Pon la macro en los eventos de tu hoja.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Por.Dante Amor
    '
    If Target.Count > 1 Then Exit Sub
    If Target.Row > 1 Then Exit Sub
    '
    i = Target.Column
    If i = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count + 1 Then
        ActiveSheet.ListObjects("Tabla1").Range.AutoFilter
        c = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count
        Cells.EntireColumn.Hidden = False
        Selection.Offset(1, 0).Select
        Exit Sub
    ElseIf i > ActiveSheet.ListObjects("Tabla1").Range.Columns.Count + 1 Then
        Exit Sub
    End If
    '
    On Error Resume Next
    If ActiveSheet.AutoFilter.Filters.Item(i).On = False Then
        ActiveSheet.ListObjects("Tabla1").Range.AutoFilter Field:=Target.Column, _
            Criteria1:=True
        f = ActiveSheet.ListObjects("Tabla1").Range.Rows.Count
        c = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count
        Application.EnableEvents = False
        Application.ScreenUpdating = False
        For col = c To 1 Step -1
            For Each celda In Range(Cells(2, col), Cells(f, col)).SpecialCells(xlCellTypeVisible)
                chale = celda.Value
                If celda.Value = False Then
                    Columns(col).EntireColumn.Hidden = True
                    Exit For
                End If
            Next
        Next
        Selection.Offset(1, 0).Select
        Application.EnableEvents = True
        Application.ScreenUpdating = False
    Else
        ActiveSheet.ListObjects("Tabla1").Range.AutoFilter
        c = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count
        Cells.EntireColumn.Hidden = False
        Selection.Offset(1, 0).Select
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro

Dante, nuevamente sos un genio por tomarte el trabajo de tratar de dar respuesta a nuestras consultas. 

Sabes que , logro poner la macro en los eventos de la worksheet.

Pero al intentar seguir los pasos , me oculta toda la tabla.

Aquí van los pasos que realizo, siempre hablando de la misma tabla el ejemplo.

Paso 1. Filtro manualmente la columna D, para que me muestre los resultados que digan la palabra verdadero.

Obtengo de resultado la fila 4. 

Paso 2. Hago clic en la primera fila de D1. y la macro me oculta toda la tabla, sin discriminar entre los que dicen verdadero o falso.  Por lo tanto , nunca logro obtener de resultado la imagen 3 del ejemplo.

Sera que estaré haciendo algo mal?

H o l a:

Pero no tienes que hacer el filtro, la macro lo hace en automático.

Estos son los pasos que tienes que hacer:

1. Selecciona una celda de la fila 1, siguiendo con tu ejemplo, selecciona la celda D1.

2. En automático la macro te filtra las filas y te oculta las columnas.

3. Para quitar el filtro y mostrar las columnas presiona nuevamente click en la celda D1.

4. En caso de que se oculten todas las columnas, para mostrar nuevamente la información, presiona click en la siguiente celda, de la fila, donde termina la tabla, en tu ejemplo sería la celda K1.

Si estás utilizando los datos del ejemplo, no debes tener problema, pero solamente selecciona la celda D1, la macro hace todo lo demás.

Es que ese es uno de los puntos, por ahí no lo supe poner en la explicación, lo siento...

Es necesario que pueda filtrar primero a mano, porque en algunos casos, como la tabla es tan grande, puede que necesite hacer 2 , 3 o 4 filtros a mano, antes de limpiar la tabla de las columnas "extra" que solo son falsos y no son útiles. Lo siento, por ahí al querer hacer el ejemplo lo mas simple posible y luego aplicarlo a la tabla real, no me supe explicar. 

Pon en un botón la siguiente macro para ocultar

Sub OcultarColumnas()
'Por.Dante Amor
    f = ActiveSheet.ListObjects("Tabla1").Range.Rows.Count
    c = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count
    Application.ScreenUpdating = False
    Cells.EntireColumn.Hidden = False
    For col = c To 1 Step -1
        For Each celda In Range(Cells(2, col), Cells(f, col)).SpecialCells(xlCellTypeVisible)
            chale = celda.Value
            If celda.Value = False Then
                Columns(col).EntireColumn.Hidden = True
                Exit For
            End If
        Next
    Next
End Sub

Pon en otro botón para mostrar:

Sub MostrarColumnas()
'Por.Dante Amor
    Cells.EntireColumn.Hidden = False
End Sub

Sabes que sin duda funciona, pero el inconveniente que encontré es que si una celda es FALSA, te oculta TODA la columna, cuando por ahí, si esa columna tiene algún VERDADERO, me gustaría conservar la columna para analizar.

Para intentar solucionar eso (y tratar de no molestarte más con este problema), con mi terrible habilidad para programar, logre entender un poco, como funciona el código.

Agregue una variable a = 0, para que cada vez que una celda sea falsa sume a= a + 1. y luego un if donde chequea en cada ronda, si "a" = f - 1 (que seria el numero total de filas -sin contar los títulos de las columnas-) y por lo tanto "a" seria igual a f -1, solo en los casos en que toda la columna contenga valores FALSOS y allá sumado la correcta cantidad de 1. Entonces la idea es que oculte la columna.

Logre hacerlo funcionar... el problema que no logro resolver es que si mi filtro manual me devolvió solo 1 fila, entonces el código falla y no logro que oculte las columnas falsas. Como podría sobrellevar ese problema. Al parecer ese método que hice, no funciona cuando solo hay una fila... perdón y prometo que es la ultima sobre este asunto...

H o l a:

Tal como lo comentas: "sin duda funciona", es lo que pediste, ibas a filtrar manualmente y "ocultar las columnas que son falsas", entonces si en alguna de la las celdas filtras tienes "Falso", la columna se oculta.

Con gusto modifico la macro a lo que necesites. Valora esta respuesta y crea una nueva pregunta y me específicas con ejemplos cómo debería funcionar la nueva macro.

S a l u d o s

H o l a:

Te anexo la macro actualizada

Sub OcultarColumnas()
'Por.Dante Amor
    f = ActiveSheet.ListObjects("Tabla1").Range.Rows.Count
    c = ActiveSheet.ListObjects("Tabla1").Range.Columns.Count
    Application.ScreenUpdating = False
    Cells.EntireColumn.Hidden = False
    For col = c To 1 Step -1
        existe = False
        For Each celda In Range(Cells(2, col), Cells(f, col)).SpecialCells(xlCellTypeVisible)
            If celda.Value Then
                existe = True
                Exit For
            End If
        Next
        If existe = False Then
            Columns(col).EntireColumn.Hidden = True
        End If
    Next
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas