A lo largo de distintas entradas hemos visto muchas formas de proteger nuestros proyectos, tengan estos o no macros, evitando que los usuarios accedan a funciones, rutinas o datos reservados. Desde hace, aprox, un mes, recibí tres consultas que practicamente me dicen lo mismo: Excel siempre avisa que el libro contiene macros y si mi proyecto funciona en base a ellas ¿como puedo evitar que quien abra el archivo presione "no habilitar", dejando así inutilizado mi trabajo?
el típico mensaje de Excel, alertando sobre la existencia de posibles (y reales) amenazas codificadas en VBA
[+/-] Ver el resto / Ocultar
Todos sabemos que desde el menú Herramientas/Macro/Seguridad podemos predefinir la forma en que la aplicación se comportará frente a un archivo con macros. Y sabemos también que lo mejor es tener un "nivel de seguridad medio", para así no bloquear o permitir cualquier cosa. Pero ese "nivel medio" nos remite a la primer imagen: si el usuario hace click sobre "deshabilitar macros", nuestro proyecto queda parcial o totalmente inutilizado.
Y voy a seguir con la peor noticia posible: no tengo idea de como se hace. Acepto sugerencias.
Excel siempre avisará sobre el código VBA inserto en los libros, por obvias cuestiones de seguridad. Y listo.
Pero bien podríamos "pensarlo a la inversa", para zafar de esta (engorrosa) situación: si el usuario selecciona la deshabilitación de las macros.... no le muestro nada. Es un truco muy sencillo y fácil de implementar, pero que por lo menos ayudará a mis lectores sobre esta cuestión.
Supongamos que nuestro proyecto está lleno de macros, botones, funciones definidas por el usuario (UDF, user define functions), formularios, módulos, etc, etc, etc. Este libro imaginario posee 3 hojas de trabajo: hoja1, hoja2 y hoja3. Para llevar a cabo esta tarea, insertaremos una nueva WorkSheet, a la cual podríamos llamar "Inicio", con lo cual tendríamos algo mas o menos como esto:
en Inicio no ponemos nada y en las restantes hojas tendríamos los botones, udf, etc, etc
Nos dirigimos a VBA (Alt + F11) y desde el Explorador de Proyecto vamos a ocultar las tres hojas de trabajo, exceptuando a "Inicio", modificando la propiedad "Visible":
recordemos que si a una hoja que está xlSheetVeryHideen (verdaderamente / muy oculta) al usuario le será imposible cambiarla desde el menú Formato/Hoja/Mostrar. Solo se podrá cambiar esta propiedad mediante código
Entonces, si repetimos esta acción en el resto de las hojas (salvo "Inicio") nos encontraremos con este cuadro:
Solo quedó a la vista la hoja "Inicio"
¿Ya se va entendiendo la lógica de esta propuesta? Nosotros le damos un archivo inútil, con una hoja llamada Inicio que no hace nada. Si el usuario deshabilita las macros, simplemente no podrá hacer nada: ni ver las planillas de trabajo ni interactuar con ellas.
Pero.... si habilita las macros, colocaremos el siguiente código dentro del objeto ThisWorkbook, para que se ejecute al abrirse el libro:
Entonces: si nuestro usuario habilita las macros, todo bien, las hojas de trabajo se muestran. Si no... no ve mas que una hoja en negro y no podrá acceder a las funciones del proyecto.
Claro que esta "técnica" (para llamarla de alguna forma y darle importancia) deberá repetirse siempre, así que antes de irnos nos aseguramos de dejar todo como antes, aprovechando el evento Before_Close (antes de cerrarse):
Y terminamos. Corto, sencillo y práctico para quienes lo necesiten.
Suerte.
N de la R: el código de la segunda imagen tira error, por que el bucle oculta TODAS las hojas del libro.... cosa imposible en Excel, ya que por lo menos una debe permanecer visible.
Para que no falle, debe ser así:
'antes de iniciar el bucle mostramos la hoja "Inicio":
Sheets("Inicio").visible = xlSheetVisible
'y una vez dentro del bucle, agregamos esta condicional:
If H.Name <> "Inicio" then
H.Visible = xlSheetVeryHidden
End If
'o sea: se ocultarán todas las hojas, menos Inicio.
'disculpen el error, luego corrijo la imagen. =)
Tengo unos macros para evitar la copia y edicion de algunas hojas. Este macro me es util pero puede pasar que el usuario desahilite despues de abierto las macros, como se procede ahi?
ResponderEliminarEstimado: el usuario siempre tendrá la opción a deshabilitar las macros. Necesitaría conocer un poco mas sobre tu proyecto: ver bien que hace y bajo que eventos.
ResponderEliminarPero fijate bien en el ejemplo que doy: al cerrar el libro oculto todas las hojas, dejando solo visible la planilla "Inicio". Las oculto con xlVeryHidden, para que no se puedan mostrar, salvo desde VBA.
Entonces: si al salir oculto todas las hojas... al abrirlo si o si deberán habilitar las macros, para que el código VBA vuelva a mostrarlas, caso contrario solo tendrán una hoja en negro que no servirá de nada.