Habilitar macros

Tengo una hoja con una macro y quiero que al abrir el libro, cuando ponga el mensaje de si quieres habilitar las macros, no puedas pinchar en el botón de no o en todo caso que cuando pulses que no, se cierre el libro. ¿Es posible?
Respuesta
1
Efectivamente, como dije, hay dos macros auxiliares llamadas OcultaTo y MuestraTo que se encargan de Ocultar To das las hojas y Mostrar To das las páginas.
También hay una tercera macro que se llama Salida pero, por un error en la transcripción desde el Editor de VBA a esta página, omití su nombre.
Por lo tanto, el set de macros que debes pegar en un único módulo (con el nombre que quieras) es:
Private Sub OcultaTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" And SHT.Visible Then SHT.Visible = xlVeryHidden
Next SHT
ActiveWorkbook.Protect "PIRULO"
End Sub
Private Sub MuestraTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" Then SHT.Visible = True
Next SHT
Sheets("NOTA").visible = False
End Sub
Private Sub Salida()
Application.ScreenUpdating = False
Sheets("NOTA").Visible = True
Sheets("NOTA").Select
OcultaTo
Application.DisplayAlerts = True
Application.EnableEvents = False
ThisWorkbook.Save
Application.EnableEvents = True
MuestraTo
End Sub
Esta macro, es llamada (call Salida) por el Evento Before_save. Es decir que cuando el operador decide grabar, el proceso es interceptado por tal evento y oculta todas (con OcultaTo)las hojas menos la primera (NOTA), protegerá el libro y lo grabará. Al finalizar el grabado, muestra todas las hojas (con MuestraTo) nuevamente para poder seguir trabajando.
De esta manera, el archivo que está en el disco siempre estará protegido con una password y con sólo una hoja visible (NOTA).
Entonces, David, pega este código que te acabo de indicar (tiene un par de mejoras respecto al anterior y corrige la falta de nombre de la macro Salida y recuerda que en ThisWorkbook tienes que tener ese otro par de procedimientos vinculados a los eventos de apertura y grabado de archivo.
Espero que con esto puedas completar tu proyecto.
Un abrazo!
Fernando
Fernando:
Hay unas cosas que no me han quedado claras.
Me has puesto estas líneas en tu ejemplo:
MuestraTo
OcultaTo
¿Es correcto?
En otra línea pone Call Salida. ¿Tengo qué crear un modulo que se llama Salida?
Y la última,
¿Todo esto va en el mismo módulo?
"Y en un módulo pega estas macros: "
Private Sub OcultaTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" And SHT.Visible Then SHT.Visible = False
Next SHT
ActiveWorkbook.Protect "PIRULO"
End Sub
Private Sub MuestraTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" Then SHT.Visible = True
Next SHT
End Sub
Application.ScreenUpdating = False
Sheets("NOTA").Visible = True
Sheets("NOTA").Select
OcultaTo
Application.DisplayAlerts = True
Application.EnableEvents = False
ThisWorkbook.Save
Application.EnableEvents = True
MuestraTo
Gracias
En realidad, eso está vedado a nosotros, pobres mortales. Y es correcto que así sea. Recuerda que la posibilidad de anular la ejecución de macros existe para que programas con macrovirus accedan a tu PC sin que siquiera te enteres. Si fuese posible esto sería lo primero que incluirían en el código maligno para evitarlo.
(Seguramente, debe haber métodos extra Excel que lo hagan)
Sin embargo, puedes compensar esa limitación con un diseño inteligente de tu archivo.
Agrega una hoja ("NOTA", por ejemplo) a modo de caratula que indique que para acceder a las hojas de ese archivo es necesario habilitar macros al inicio. Luego oculta el resto de las hojas y protege el libro con una clave compleja.
Así, en caso de que no habilite macros, se encontrará con una sólo hoja disponible, avisándole que, para que funcione debe habilitar macros. Como el libro cuenta con una protección, no le será posible ver el resto de las hojas ocultas, a menos que conozca la clave de libro.
Si, en cambio, las macros están habilitadas, una asociada al evento de apertura, mostrará el resto de las hojas y ocultará la caratula.
En el panel de macros de ThisWorkbook pega esto:
Private Sub Workbook_Open()
MuestraTo
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'salida
Call Salida
ActiveWorkbook.Saved = True
Cancel = True
End Sub
Y en un módulo pega estas macros:
Private Sub OcultaTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" And SHT.Visible Then SHT.Visible = False
Next SHT
ActiveWorkbook.Protect "PIRULO"
End Sub
Private Sub MuestraTo()
ActiveWorkbook.Unprotect "PIRULO"
For Each SHT In Sheets
If SHT.Name <> "NOTA" Then SHT.Visible = True
Next SHT
End Sub
Application.ScreenUpdating = False
Sheets("NOTA").Visible = True
Sheets("NOTA").Select
OcultaTo
Application.DisplayAlerts = True
Application.EnableEvents = False
ThisWorkbook.Save
Application.EnableEvents = True
MuestraTo
Aquí incorporaste lo siguiente:
- Dos macros auxiliares para ocultar y mostrar todas las hojas (excepto NOTA)
- Una macro auxiliar que se activa con el evento Before_Save, es decir antes de grabar.
Esta macro toma el control del proceso de grabación. Si la clave hubiese sido la que definiste en "Lector" no grabará el archivo, notificándolo de esto.
En los otros casos, ocultará todas las hojas menos la primera, protegerá el libro y lo grabará. Luego muestra todas las hojas nuevamente para poder seguir trabajando. De esta manera, nos aseguramos que la versión guardada siempre tenga todas las hojas ocultas.
Notarás que utilizo una contraseña en este libro: la de Libro que está incluida en el mismo código de la macro.
Por tal razón, es conveniente que todo el proyecto de VBA estuviese también protegido para que el usuario no pueda leer el código y, eventualmente, descubrir cual es la contraseña.
Espero que esto te sirva. Pero pregunta de nuevo si no quedo claro.
Un abrazo!
Fernando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas