Un lector me plantea lo siguiente: tiene un libro en el cual necesita que cada una de sus hojas posea un logotipo y que el mismo sea inamovible. La cuestión sería muy fácil de resolver, pero me brinda un datos mas: si los usuarios insertan una nueva hoja de cálculos.... también deberá aparecer el mismo logotipo y, obviamente, que este tampoco se pueda quitar.
Hasta donde llega mi entendimiento, y para no complicar demasiado las cosas, para que una imagen (desde archivo, shape, etc, etc) no se pueda borrar, la hoja debe estar protegida. Y si está protegida... de antemano tendríamos que fijar que celdas serían viables de modificarlas y cuales no.... toda una cuestión para "coordinarlo" correctamente desde VBA.
Entonces se me ocurrió lo siguiente: crear una hoja "molde" con el diseño y las características deseadas (logo, celdas bloqueadas / desbloqueadas, figuras, etc, etc), ocultarla a la vista de los usuarios y que dicha hoja se "replique" cada vez que alguien inserte una nueva planilla. En las líneas siguientes veremos como lograrlo con muy poco código.
Supongamos que esta es la hoja "molde" (a la cual, y dada mi gran imaginación) llamé "molde":
el logo en la parte superior izquierda y, recuadrado en rojo, las únicas celdas que aceptarán ingreso de datos.
[+/-] Ver el resto / Ocultar
Presionamos "Ctrol + e" para seleccionar todas las celdas y vamos a "formato / celdas", para luego hacer click con el botón derecho del mouse sobre cualquier parte de la hoja. Del formulario emergente seleccionamos la pestaña "Proteger" y nos aseguramos que el checkbox "Bloqueada" se encuentre activo:
luego damos sobre el botón "aceptar", asegurando así que todas las celdas están bloqueadas
Seguimos. En este paso solo seleccionamos las celdas que deberán estar desbloqueadas, las que en la primer imagen poseen el recuadro en rojo. Repetimos el paso anterior, pero esta vez quitamos el tilde a "Bloqueada". Y listo, ya establecimos que rangos los usuarios podrán modificar luego de que protejamos la planilla.
De la misma forma deberemos hacer click derecho sobre la imagen (logo), ir a "Propiedades" y corroborar que dicho objeto se encuentre "bloqueado".
Para finalizar: Herramientas / Proteger / Proteger Hoja, e ingresamos una buena contraseña. Para este ejemplo usaremos una muy mala: blog.
noten que dejé algunas opciones para no limitar tanto al usuario: podrá dar formato a las celdas, filas y columnas, pero no le será factible seleccionar las celdas bloqueadas. Si bajamos un poco mas por el formulario, veremos que hasta les podemos permitir ordenar o aplicar filtros, de ser necesario.
Nuestro "molde" se encuentra listo. Debemos ocultarlo a la vista de los usuarios, así que nos vamos hacia VBA (alt + f11), Explorador de Proyectos, doble click sobre el nodo de la hoja molde y en la ventana de propiedades cambiamos su visibilidad:
recordemos que con "xlSheetVeryHidden" el usuario no podrá mostrarla desde el menú "formato / hoja / mostrar". Para hacerla visible nuevamente habrá que ingresar a VBA y revertir lo que terminamos de hacer... pero si a VBA también lo protegemos con un password, no accederán a ella.
Bueno, a estas alturas ya no tengo mas visible a la hoja "molde". Desde el mismo explorador de proyectos haremos doble click sobre el nodo "ThisWorkbook", para abrir su ventana de código; desde las listas desplegables allí presentes seleccionaremos este evento:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
End Sub
Con esto nos aseguramos que el código que ingresemos allí dentro se ejecutará cada vez que los usuarios inserten una nueva hoja en el libro. ¿Como? Veamos:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
'quito el refresco de pantalla, para evitar el
'"parpadeo" y que el usuario no se de cuenta de nada
Application.ScreenUpdating = False
'y comiento el trabajo:
With Sheets("molde")
'hago visible la hoja
.Visible = xlSheetVisible
'la selecciono
.Select
'la copio
.Copy Before:=Sheets(1)
'y finalmente la oculto de nuevo
.Visible = xlVeryHidden
End With
'quito las alertas
Application.DisplayAlerts = False
'y borro la hoja que insertaron, usando al
'argumento que ya trae el sub
Sh.Delete
Application.DisplayAlerts = True
'activo nuevamente el refresco de pantalla
Application.ScreenUpdating = True
End Sub
El trabajo quedó terminado: cada vez que alguien inserte una nueva hoja esta no será la tradicional planilla "en blanco", si no que nuestra macro se encargará de colocar allí el formato predefinido, con imágenes, bloqueos, shapes, etc, etc.
Para "afinar un poco mas la puntería".... en lugar de "molde" a la hoja modelo la podríamos llamar "formulario", creando algo mas acorde al proyecto.
Espero que les sea a todos de utilidad, aquí les dejo el
link al archivo.
Saludos.
Comentarios
Publicar un comentario