Ocultar hoja si el valor de celda cambia

Necesito que una hoja se oculte o se muestre de manera automática dependiendo de si un valor de celda cambia o no (el mismo tiene una formula y regresa una valor 0 o 1 dependiendo del resultado). Hasta ahora tengo este código, pero no puedo hacerlo correr de manera automática

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B4").Value = "" Then 
Worksheets("Hoja 3").Visible = True
Else
Worksheets("Hoja 3").Visible = False
End If
End Sub

Leyendo encontré que puede ser que si ya tengo un Private Sub Worksheet en la misma hoja la macro no funcione, ¿puede ser?

1 Respuesta

Respuesta
1

H o l a:

Primero, si tienes una fórmula y su resultado depende de otras celdas, el evento que debes usar es el evento Calculate.

Segundo, si tienes una fórmula, pero el resultado es valor, entonces debes cambiar tu condición, tú tienes esto:

If Range("B4").Value = "" Then 

En la fórmula tienes que regresar como resultado "", de lo contrario nunca se cumplirá la condición.


Entonces la condición podría ser así:

Private Sub Worksheet_Calculate()
    Application.EnableEvents = False
    If Range("B4") = 0 Then
        Worksheets("Hoja 3").Visible = True
    Else
        Worksheets("Hoja 3").Visible = False
    End If
    Application.EnableEvents = True
End Sub

Le estoy diciendo que si el resultado es igual a 0, entonces que muestre la hoja, de lo contrario que la oculte.


Por último, lo que pones en la hoja son eventos: Change, Selection, Calculate, etc, puedes tener varios en la misma hoja.


Si tienes dificultades para poner el evento, tienes que explicarme con lujo de detalle qué hojas tienes, en cuál hoja estás poniendo la macro, qué tienes en la fórmula, qué vas a cambiar y qué esperas de resultado, etc, etc,


Tengo lo siguiente:

Una primer hoja donde cargo diferentes valores de documentación, dependiendo de una formula de cálculo si tengo seleccionado ciertos criterios me calcula en la hoja "Base" celdas BE7:BE14 y se ponen los números del 1 al 8. 

Después tengo 8 hojas (que son los niveles de documentación requeridos según los criterios antes seleccionados), esos documentos tienen combinadas las celdas B6:C6, la "Hoja 1" trae el dato de "BE7", la "Hoja 2" de "BE8", etc.

Lo que necesitaría es que siempre las hojas de "Hoja 1" a "Hoja 8" estén ocultas, salvo que en la celda combinada B6:C6 exista el número de documento.

Es decir que si en "Hoja 1" celdas <B6:C6> aparece el número 1 la hojas se haga visible, si el valor es "vacio" (aunque tenga la formula ='Base'!$BE$7) se oculte de manera automática la hoja.

Muchas gracias!"

No pusiste la fórmula que tienes en la celda combinada B6:C6.

Todavía no entiendo qué necesitas.

Sí en la celda B6 aparece un 1, ¿cuál hoja hay que mostrar?


O envíame tu archivo y me explicas en cuál hoja está la fórmula y qué hojas quieres ocultar o mostrar.

Mi correo [email protected]

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

En la celda combinada tengo la siguiente fórmula:

Tengo la hoja "Base" y después "Hoja 1", "Hoja 2", "Hoja 3"

"Hoja 1" celda combinada <"B6C6"='Base'!$BE$7>

"Hoja 2" celda combinada <"B6C6"='Base'!$BE$8>

Yo necesito que "Hoja 1", "Hoja 2", etc estén siempre ocultas, excepto que el valor de <"B6C6"='Base'!$BE$7> cambie.

En "Hoja 1" <"B6C6"='Base'!$BE$7 se puede traducir si esta activo en "B6C6"=1 >; "Hoja 2" <"B6C6"='Base'!$BE$8 se puede traducir si esta activo en "B6C6"=2 >

Lo que quiero es que si aparece el número 1 en "Hoja 1" esta sea visible, si en "Hoja 2" aparece el 2 lo mismo, es decir que la fórmula "B6C6"='Base'!$BE$7 puede entregar un valor númerico o un vacio.

¿Se entiende?

Las ejecuciones en automático se realizan cuando ocurre un evento en la hoja, necesito entender qué es lo que vas a realizar para ver cuál evento es el que se tiene que poner y en cuál hoja se tiene que poner.

Si te hago preguntas es por qué todavía no entiendo en dónde va a ocurrir el evento y en dónde se tiene que poner la macro.


Podemos probar con esto.

Pon la siguiente macro en los eventos de la hoja1:

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    If [B6] = 0 Or [B6] = "" Then
        Sheets("Hoja1").Visible = False
    Else
        Sheets("Hoja1").Visible = True
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Pon la siguiente macro en los eventos de la hoja2

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    If [B6] = 0 Or [B6] = "" Then
        Sheets("Hoja2").Visible = False
    Else
        Sheets("Hoja2").Visible = True
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Las macros son iguales, lo que cambia es el nombre de la hoja: "Hoja1", "Hoja2", cambia en las macros "Hoja1", "Hoja2", por los nombres de tus hojas.


Si entendí bien, en la "Hoja1" en la celda B6 tienes una fórmula. En la hoja "base" en la celda BE7 vas a poner un 1, en ese momento se va a hacer visible la "Hoja1", si borras el 1, entonces se va a ocultar la "Hoja1".

Si escribes un 1 en la celda BE8, de la hoja "base", se muestra la "Hoja2", si borras el 1 de la celda BE8, se oculta la "Hoja2".


Si tienes dificultades para poner los eventos, envíame tu archivo y reviso las fórmulas y las macros en sus correspondientes eventos.


Así debe quedar la macro:

Private Sub Worksheet_Calculate()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Columns("D:CN").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 92 ' 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
    '
    If [B6] = 0 Or [B6] = "" Then
        Sheets("ZONA 1").Visible = False
    Else
        Sheets("ZONA 1").Visible = True
    End If
    '
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas