Mostrar Formulario y ocultar Excel al abrir Archivo habilitado para macros

Estoy trabajando un archivo de biblioteca y en esta oportunidad he agregado al objeto "ThisWorbook" las instrucciones "Application.Visible = False" y "FRMPanel.Show" para que al usuario le muestre solo el formulario "Panel" desde donde podrá realizar la gestión de la biblioteca, ocultando la aplicación Excel a su vista.

Además he agregado al formulario un botón de comando para hacer visible Excel, el que al ejecutarlo y, previamente a hacer visible Excel, le pedirá una contraseña para evitar que trabajen directamente en la hojas, tablas y VBA si no tienen el acceso necesario, además agregué en el mismo formulario un botón de comando para ocultar Excel y volver al modo de usuario.

El problema es que después de abrir una vez el archivo, funciona correctamente lo esperado, es decir: se abre el formulario "Panel" manteniendo oculto Excel, pero cuando cierro el formulario y lo vuelvo a abrir, en esta oportunidad me abre Excel en la hoja "Lista", sin abrir el formulario y ocultar Excel. Para que vuelva a funcionar el código debo obligadamente guardar el archivo y solo la vez siguiente volverá a funcionar.

La idea es que cuando el usuario cierre el formulario "Panel" y vuelva a abrirlo, nuevamente esté oculto Excel y le muestre solo el formulario "Panel".

Intenté poner la instrucción "ActiveWorkbook.Save" en el evento "BeforeClose", primero en el objeto ThisWorbook y no me resultó, después probé agregando lo mismo en el código del botón "Cerrar" del formulario "Panel" y tampoco me resultó, la 2da vez que lo abro (sin haber guardado el archivo) siempre me muestra Excel, y lo que necesito es que cada vez que el usuario abra el archivo le muestre el formulario "Panel", ocultando Excel.

1 Respuesta

Respuesta
2

A raíz de las complicaciones que presenta el hecho de ocultar la aplicación, sugiero otras opciones. Por muchas razones un proceso puede verse interrumpido (equipo que se apaga x error, etc, etc), el libro queda mal cerrado y llueven las consultas ;)

Pero especialmente no recomiendo la opción de 'ocultar la aplicación' porque recordemos que los libros se pueden abrir 'sin activar las macros' y por lo tanto no siempre el evento Open se ejecuta. Por eso vamos a proteger el acceso de otro modo.

1- Una hoja en blanco (llamémosla Portada o Inicio). Con un mensaje de que deben activar las macros.

2- El resto de las hojas se ocultan en los eventos BeforeSave y BeforeClose. ¿Por qué no las oculto en el evento Open? Por la misma razón (que vuelvan a abrir sin activar las macros)

3- Si se activaron las macros, solo se verá esta hoja inicial de fondo y se muestra el Userform.

Private Sub Workbook_Open()
'Application.Visible = False
UserForm1.Show
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'ocultar hojas
For Each sh In Sheets
    If sh.Name <> "Portada" Then sh.Visible = xlVeryHidden
Next sh
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'ocultar hojas
For Each sh In Sheets
    If sh.Name <> "Portada" Then sh.Visible = xlVeryHidden
Next sh
End Sub

4- Mencionas que en el UF habrá un botón para, luego de una clave, mostrar las hojas. En este punto se puede ocultar la hoja de portada si quieres.

Private Sub CommandButton1_Click()
'mostrar hojas
'codigo solicitando la clave
'-----
'en caso de clave correcta
    For Each sh In Sheets
        sh.Visible = True
    Next sh
    Sheets("Datos").Select      'ajustar nombre de hoja
End Sub

5- En el botón de cierre, se vuelven a ocultar las hojas salvo la de Portada. La vuelvo visible por si en el punto 4 se la ocultó.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'volver a mostrar la portada
Sheets("Portada").Visible = True
'ocultar hojas
For Each sh In Sheets
    If sh.Name <> "Portada" Then sh.Visible = xlVeryHidden
Next sh
End Sub

Y con la instrucción sh.visible = xlveryHidden no será posible ver las hojas desde el menú Formato.

*Nota: Como el bucle que oculta las hojas se repite en varios procesos, podrías tener una llamada a una subrutina, por ej: Call ocultaHojas

Y en un módulo el código:

Sub ocultaHojas()
'volver a mostrar la portada
Sheets("Portada").Visible = True
'ocultar hojas
For Each sh In Sheets
    If sh.Name <> "Portada" Then sh.Visible = xlVeryHidden
Next sh
End Sub

Espero que esta propuesta te sirva para tu proyecto. Si necesitas el libro de ejemplo podrás solicitarmelo a mi correo cibersoft PUNTO arg ARROBA gmail.com (o copiarlo de la sección CONTACTOS de mi sitio que dejo al pie).

Muchísimas gracias por tu ayuda Elsa!!! Seguiré tu consejo y una vez que haya hecho los cambios te volveré a contactar para contarte como me resultó, de todas maneras te enviaré un correo para solicitarte el libro de ejemplo. Nuevamente agradezco tu ayuda, la que indudablemente mejorará mi proyecto.

Cordiales saludos,

Carlos 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas