Ocultar filas y columnas automáticamente en excel

Tengo una planilla de excel que contiene varios datos que van variando, lo que quiero hacer es ocultar filas y columnas de manera automática, por ahora lo que tengo son las siguientes macros:

Con este oculto las filas:

Sub Oculta_Filas()
ActiveSheet.Rows("7:30").Hidden = False
For f = 7 To 30
If Cells(f, 1).Value = "NO" Then Cells(f, 1).EntireRow.Hidden = True
Next
End Sub

Y con esta macro las columnas:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub ' si la celda que se ha modificado es distinto a la A1 entonces sal de la macro
Dim N As Integer
Columns("D:BW").EntireColumn.Hidden = False 'primero las hago todas visibles
If Range("A1") <> "" Then ' si en la celda A1 hay algo escrito
For N = 4 To 75 ' N va ha valer desde 2 hasta 30
If Cells(4, N) <> Range("a1") Then Cells(4, N).EntireColumn.Hidden = True ' si la celda Fila 2 y columna n es igual a la celda A1 entonces ocultala
Next N
End If
End Sub

Lo que necesito es que de manera automática si algún valor del rango cambia, dejando siempre la celda A1 en SI, se oculte o muestre sin tener que volver a escribir la palabra "SI" y si pudiera hacer lo mismo para ocultar las filas, es decir que siempre que diga "SI" se muestre la fila o se oculte.

Respuesta
2

H o l a:

No entendí muy bien cuándo quieres ocultar y cuándo mostrar.

Cambia tus macros por esta macro, pon la macro en los eventos de tu macro y dime si es lo que necesitas.

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Not Intersect(Target, Range("A1, D7:BW30")) Is Nothing Then
        Columns("D:BW").EntireColumn.Hidden = False 'primero las hago todas visibles
        Rows("7:30").EntireRow.Hidden = False
        '
        If Range("A1") <> "" Then ' si en la celda A1 hay algo escrito
            For N = 4 To 75 ' N va ha valer desde 2 hasta 30
                If Cells(4, N) <> Range("A1") Then
                    Cells(4, N).EntireColumn.Hidden = True ' si la celda Fila 2 y columna n es igual a la celda A1 entonces ocultala
                End If
            Next N
            '
            For f = 7 To 30
                If Cells(f, 1) = "NO" Then Cells(f, 1).EntireRow.Hidden = True
            Next
        End If
    End If
End Sub

Dante, 

Perfecto, esto me sirve para ocultar las columnas y las filas al mismo tiempo, ahora lo que necesito es que esto se actualice de manera automática cuando cambian los valores.

Ejemplo:

En celdas D4:D5:D6 tengo "SI, y en D7:D8 tengo "NO", estos valores se modifican tomando datos de otra hoja, según algunas formulas me puede quedar los siguiente D4:D5 = "NO" y D6:D7 = "SI" y D8 = "NO", lo que me gustaría es que cuando esos datos se actualicen el macro corra solo sin tener que reescribir en A1 la palabra "SI".

Quita la macro y cambia el evento a esto:

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Columns("D:BW").EntireColumn.Hidden = False 'primero las hago todas visibles
    Rows("7:30").EntireRow.Hidden = False
    '
    If Range("A1") <> "" Then ' si en la celda A1 hay algo escrito
        For N = 4 To 75 ' N va ha valer desde 2 hasta 30
            If Cells(4, N) <> Range("A1") Then
                Cells(4, N).EntireColumn.Hidden = True ' si la celda Fila 2 y columna n es igual a la celda A1 entonces ocultala
            End If
        Next N
        '
        For f = 7 To 30
            If Cells(f, 1) = "NO" Then Cells(f, 1).EntireRow.Hidden = True
        Next
    End If
End Sub

Con esa última macro se cuelga, sigue sin funcionar...

A ver si puedo explicarlo mejor:

A1="SI" siempre, este valor no se modifica.

Los que si se modifican son los valores de las columnas B4:BW4 y las filas A7:A30, que pueden ser SI o NO, estos valores los obtengo de otras hojas. 

Lo que me gustaría, si es posible, es que cuando excel calcule y modifique alguno de los valores de los rangos (Columnas B4:BW4; Filas A7:A30) la fila y/o columna se oculte o muestre de manera automática.

Muchas gracias.

Prueba con esto:

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Columns("D:BW").EntireColumn.Hidden = False 'primero las hago todas visibles
    Rows("7:30").EntireRow.Hidden = False
    '
    If Range("A1") <> "" Then ' si en la celda A1 hay algo escrito
        For N = 4 To 75 ' N va ha valer desde 2 hasta 30
            If Cells(4, N) <> Range("A1") Then
                Cells(4, N).EntireColumn.Hidden = True ' si la celda Fila 2 y columna n es igual a la celda A1 entonces ocultala
            End If
        Next N
        '
        For f = 7 To 30
            If Cells(f, 1) = "NO" Then Cells(f, 1).EntireRow.Hidden = True
        Next
    End If
    Application.ScreenUpdating = True
End Sub

Hola Dante,

No, no funciona, se cuelga, me tira un error... El primer código funciona a la perfección, solamente que no actualiza cuando los valores SI / NO de las columnas cambian, siempre tengo que volver a escribir SI en A1.

Y otro error que tengo es que cuando escribo algo en la celda D8 por ejemplo vuelve a correr la macro y se ve como se "ocultan" las demás celdas...

¿Qué puedo hacer? 

Quizás si pudiera subir el archivo se pueda ver bien cuál es el problema

Envíame tu archivo para revisar tus fórmulas, de alguna forma los valores "SI/NO" se actualizan por medio de fórmulas, pero debes actualizar alguna celda para que cambia de SI a NO y viceversa, entonces el rango de celdas que hay que poner en la macro, son las celdas que sí modificas.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Gaston Añino” y el título de esta pregunta.

Enviada

Prueba con esta:

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Columns("D:BW").EntireColumn.Hidden = False 'primero las hago todas visibles
    Rows("7:30").EntireRow.Hidden = False
    '
    If Range("A1") <> "" Then ' si en la celda A1 hay algo escrito
        For N = 4 To 75 ' N va ha valer desde 2 hasta 30
            If Cells(4, N) <> Range("A1") Then
                Cells(4, N).EntireColumn.Hidden = True ' si la celda Fila 2 y columna n es igual a la celda A1 entonces ocultala
            End If
        Next N
        '
        For f = 7 To 30
            If Cells(f, 1) = "NO" Then Cells(f, 1).EntireRow.Hidden = True
        Next
    End If
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas