Evitar se muestre hoja oculta al pinchar cerrar li

Hola a todos.
Utilizo estos códigos que ocultan y desocultan hojas, para obligar a que el usuario habilite las macros antes de utilizar un libro. . . . .
Ambos están en This Workbook, en sus correspondientes eventos. . . . .
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Importante").Visible = True
Worksheets("Los + buscados.").Visible = xlSheetVeryHidden
Worksheets("Tarifa_peticiones").Visible = xlSheetVeryHidden
Worksheets("PEDIDOS").Visible = xlSheetVeryHidden
Worksheets("Dudas frecuentes").Visible = xlSheetVeryHidden
End Sub
________________________________________________________________
Private Sub Workbook_Open()
Worksheets("Los + buscados.").Visible = True
Worksheets("Tarifa_peticiones").Visible = True
Worksheets("PEDIDOS").Visible = True
Worksheets("Dudas frecuentes").Visible = True
Worksheets("Importante").Visible = xlSheetVeryHidden
End Sub
Tengo dos incomnvenientes:
Leve: * cuando se habilitan las macro y abre l libro completo, parpadeo importante
Grave: ** al clicar en cerrar libro (aunque no se haya hecho el más mínimo cambio):
Sale siempre el diálogo de Excel de: "Desea guardar los cambios efectuados. . .?" y
se activa la hoja oculta: "Importante", que aparece como fondo de dicho diálogo, y
desaparecen las hojas normalmente visibles. . . .
Esto, aparte de lo pesadito que resulta para cualquiera desconcierta a los usuarios
puesto que, además es en la hoja:"Importante", donde figura el mensaje que cuando
intentan abrir sin habilitar macros, les advierte que de no hacerlo el libro no será
operativo. . . .
Agradezco vuestra ayuda para las correcciones necesarias, o el aporte de otra solución
para obligar a habilitar macros que no genere estos problemas.
Un abrazo.

1 respuesta

Respuesta
1
Tu idea es buena, se me ocurren esto para mejorar el código.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Si ha habido cambios salimos sin hacer nada, ni pregunta ni nada
    If Not ThisWorkbook.Saved Then
        'Minimizamos para que no vea la hoja "Importante", así no crea confusión
        ActiveWindow.WindowState = xlMinimized
        Worksheets("Importante").Visible = True
        Worksheets("Los + buscados.").Visible = xlSheetVeryHidden
        Worksheets("Tarifa_peticiones").Visible = xlSheetVeryHidden
        Worksheets("PEDIDOS").Visible = xlSheetVeryHidden
        Worksheets("Dudas frecuentes").Visible = xlSheetVeryHidden
    End If
End Sub
Private Sub Workbook_Open()
    'Lo minimizamos para evitar parpadeos
    ActiveWindow.WindowState = xlMinimized
    Worksheets("Los + buscados.").Visible = True
    Worksheets("Tarifa_peticiones").Visible = True
    Worksheets("PEDIDOS").Visible = True
    Worksheets("Dudas frecuentes").Visible = True
    Worksheets("Importante").Visible = xlSheetVeryHidden
    'Al terminar lo maximizamos
    ActiveWindow.WindowState = xlMaximized
    'Esto es como decirle que no se han hecho cambios en el libro
    ThisWorkbook.Saved = True
End Sub
Pruébalas y me dices que te parece ;)
Saludos,
[email protected]
Gracias, soloffice.
Tus correcciones me aportan una de cal y otra de arena. . . . .
. . . . Ahora ya no sale por defecto el dichoso diálogo de guardar cambios cuando no los
hay y ha mejorado algo el parpadeo. . . . .
. . . . . No obstante, la minimización de "Importante", cuando sale el diálogo al cerrar
porque se hicieron cambios (confirmes, aceptes o canceles) permanece en la siguiente
apertura del libro, por lo que si se intenta abrir sin habilitar, no se muestra el mensaje
que porta la hoja y no cumple su función . . .
Por otra parte necesito que el libro no sufra cambios, para lo que ahora mismo tiene en
el evento BeforeSave, el código que como ves protege mediante contraseña de las
modificaciones.
Te pongo la composición actual del ThisWorbook por si me puedes responder a dos
cuestiones:
1ª: * en qué evento y como ubicaría los códigos para habilitación obligatoria, sin
renunciar al funcionamiento correcto de los existentes. . . .? .y...
2ª: * puesto que los códigos de habilitación sí permiten guardar cambios, tal como
están; al incorporarlos anularán la acción del alojado en BeforeSave. . . .?
Private Sub Workbook_Open()
Application.ScreenUpdating = False
MsgBox "                       Gracias.                "
Worksheets(1).Activate
Range("a2").Select
Worksheets(2).CommandButton2.TakeFocusOnClick = False
Worksheets(2).CommandButton3.TakeFocusOnClick = False
Worksheets(2).CommandButton4.TakeFocusOnClick = False
End Sub
_______________________________________________________________________
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Message, Title, Default, MyValue
Message = "                                         Aceptar para continuar"
Title = " No es posible guardar cambios en este libro "
If InputBox(Message, Title) <> "Ly7la>" Then Cancel = True
End Sub
Me gustan las soluciones sencillas cuando es posible, como a ti, por eso me animo a
planteártelas.
Gracias por tu colaboración.
El evento Workbook_Open que me envías ahora es diferente... esto me ha confundido un poco.
Entiendo el problema causado por la minimización de "Importante" y la posterior apertura del libro, podrías plantearte la posibilidad de forzar la pregunta "¿Desea guardar los cambios? en el evento "Workbook_BeforeClose", evitando que sea el propio Excel quien la haga.
De este modo podrías incluir acciones después de guardar (ThisWorkbook. Sabe), cosa que no puedes hacer si es el propio Excel quién hace la pregunta.
Sería algo así:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.Saved Then
        If MsgBox("¿Deseas guardar los cambios", vbQuestion + vbYesNo) = vbYes Then
            ThisWorkbook.Save
        Else
            ThisWorkbook.Saved = True
        End If
    End If
'... Resto de acciones que consideres
End Sub
Por otro lado, no acabo de comprender muy bien lo que me planteas en las otras preguntas.
Si puedes, envíame por correo el excel, contándome algo más lo que necesitas y quizás con eso te pueda ayudar.
Saludos,
[email protected]
Perdona. Estos días estoy de viaje hasta el domingo y no siempre dispongo de
conexión. . . .
Te aclaro lo de los ThisWorkbook distintos:
Los códigos origen de mi pregunta los estaba probando en un libro con las mismas hojas
(Pero sin otras macros) a fin de analizarlo y corregirlo sin interferencias, y luego, una vez
pulido trasladarlo al libro destino, de cuyo ThisWorkbook te envié en segundo lugar, las
macros que lo integran -incluyendo la que actualmente impide guardar cambios sin
contraseña. . . .-
No sé si el método de correrlas en otro libro es correcto para probar las macros de
habilitación obligatoria en este caso, pero al no estar seguro de como añadirlas al libro
destino y las posibles interferencias, así lo hice. Ya me dirás. . .
Resumiendo:
Quiero que el libro destino no permita guardar cambios sin contraseña (que ya lo hace
actualmente), y también quiero que obligue a habilitar macros (que no lo hace aún) al
usuario. Eso es todo.
Perdona la confusión que espero te haya aclarado ahora.
Recibe un cordial saludo.
Aquí estoy nuevamente :)
El hacerlo en otro libro y después tratar de adaptarlo al "libro destino" es muy buena idea :)
Mira esta nueva versión a ver si cumple con tus necesidades
http://goo.gl/7n6Qn
Tiene estas macros:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim Message, Title, Default, MyValue
    Message = "                                         Aceptar para continuar"
    Title = " No es posible guardar cambios en este libro "
    If InputBox(Message, Title) <> "Ly7la>" Then
        Cancel = True
    Else
        'Si guardas los cambios tenemos que asegurarnos de que
'solo queda visible la Hoja "Importante"
        Worksheets("Importante").Visible = True
        Worksheets("Los + buscados.").Visible = xlSheetVeryHidden
        Worksheets("Tarifa_peticiones").Visible = xlSheetVeryHidden
        Worksheets("PEDIDOS").Visible = xlSheetVeryHidden
        Worksheets("Dudas frecuentes").Visible = xlSheetVeryHidden
    End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Si no vas a permitir que se modifique el libro
    'con poner "ThisWorkbook.Saved = True" es suficiente
    'no hay que restaurar la visibilidad de las hojas
    'Con "ThisWorkbook.Saved = True"
    'el libro se cierra pero no se guarda,
    'que es lo que queremos
    ThisWorkbook.Saved = True
End Sub
Private Sub Workbook_Open()
    'Si hemos llegado hast aquí, es porque el usuario
    'ha aceptado el uso de macros
    'Así que preparamos el entorno a nuestro gusto
    Worksheets("Los + buscados.").Visible = True
    Worksheets("Tarifa_peticiones").Visible = True
    Worksheets("PEDIDOS").Visible = True
    Worksheets("Dudas frecuentes").Visible = True
    Worksheets("Importante").Visible = xlSheetVeryHidden
    Worksheets("Los + buscados.").Activate
    Range("a2").Select
    Worksheets("Tarifa_peticiones").CommandButton2.TakeFocusOnClick = False
    Worksheets("Tarifa_peticiones").CommandButton3.TakeFocusOnClick = False
    Worksheets("Tarifa_peticiones").CommandButton4.TakeFocusOnClick = False
End Sub
Bueno, espero que nos vayamos acercando :)
Me cuentas,
Carlos
[email protected]
Hola de nuevo, soloffice. Ya estoy de regreso.
Efectivamente nos acercamos. . . . .
Aunque se hagan cambios, el libro se cierra (sin ningún diálogo) y los ignora. Muy bien
por esa parte. . . .
No obstante, si se abre el libro sin habilitar macros, sale la hoja "Importante" con su
advertencia, pero: también todas las demás. . . . . Y no hay más que pinchar en la
etiqueta de cualquiera para modificar o borrar lo que quieras. . . . .
Puedes verificarlo en tu propio ejemplo, que amablemente me colgaste en: http://goo.gl
/7n6Qn.. . . . . . Vamos, que el código de ocultar las hojas, ahora no funciona. . . . .
Necesito que el usuario hablite las macros por dos objetivos principales:
     **** Que  no pueda modificar el libro ni voluntaria ni involuntariamente, y que
              Funcionen otras macros que añadiré para protección de los códigos, hojas
              Etc. . . . . Es imprescindible habilitarlas, ¿no?. . . . .
Pregunto: si en tu versión eliminas la parte de código que en la mía, evitaba que se
guardasen cambios si no se ponía contraseña, pues con "ThisWorbookSaved = True"
Ahora se cierra el libro directamente y sin opciones. . . . .¿Porqué conservar el ImputBox
de "No es posible guardar cambios en este libro". . .que además ahora ni se activa?.
Gracias por tu atención, soloffice.
Ahora estoy algo confundido, he probado el libro http://goo.gl/7n6Qn, tanto en Excel 2003 como en Excel 2007 y en ambos, si lo abro sin habilitar las macros, solo me muestra la hoja "Importante", sin mostrarme las otras hojas... en cambio tu me dices que a ti si te muestra las otras hojas.
No debería mostrarlas, porque he guardado el libro expresamente así, con la hoja "Importante" visible, y el resto de las hojas "xlSheetVeryHidden"
Sobre tu Pregunta
El InputBox lo he dejado para que el que conozca la contraseña pueda grabar cambios en el libro.
Si le das a "Cerrar" no se muestra el InputBox, como bien dices, "ThisWorbookSaved = True" se encarga de que no se guarde nada y no se muestre nada.
Pero si le das a "Guardar", entonces si se muestra el InputBox, y metiendo la contraseña correcta, se guardarán los cambios.
Ok. soloffice; revisado todo de nuevo te confirmo dos cosas: que en tu ejemplo sí funciona
la ocultación de hojas y que cuando traslado el código a mi libro, no. . . . .
Por lo demás, estaría todo correcto. No obstante como no consigo hacer funcionar la
ocultación por muchas pruebas que realizo en mi libro, te lo he enviado por correo por si
ello facilita tu generosa labor de apoyo.
Un abrazo.
Perfecto, lo miro y te cuento ;)
Gracias. En cuanto pueda verificar lo recibido, te informo.
Saludos
Hola Carlos.
No he dispuesto de tiempo en estos días, pero al fin he conseguido resolver el problema
de que no funcionase la ocultación en mi libro con las macro planteadas y tus
modificaciones.. . . .
Tenía un fallo en la denominación de mis hojas.
Una vez resuelto, me surge otro problema en el proceso de guardado como libro nuevo
de la hoja "PEDIDOS", cuando por error se intenta guardar con el nombre de otro que
ya exista y se pulsa cualquiera de las tres opciones del correspondiente aviso de Excel,
que desconozco si tenía ya anteriormente. . . . .
Pero esa será cuestión para otra consulta, y para no alargarla, deseo dar por resuelta de
manera satisfactoria la de la ocultación de hojas para habilitación obligatoria de macros,
origen de nuestro diálogo, y en la que tanta ayuda he recibido por tu parte. Gracias
amigo.
Hasta pronto
Ignorador.

Añade tu respuesta

Haz clic para o