Marcelo me consulta vía mail otra forma de implementar la colocación de imágenes en Excel, dado que, segun sus expresiones,
mi ejemplo anterior (galeria de imagenes) es difícil de incorporar a su proyecto. Desconozco las características de dicho proyecto, pero seguramente en algún punto se le complica... y para eso levanté el blog:
intentar ayudar en los problemas que se presenten en Excel.
Me comenta que su libro tiene una planilla en donde se coloca el legajo del empleado, y con la función
BUSCARV(), trae todos los datos del mismo. El necesita que también se inserte una imagen, que contiene la foto del empleado en cuestión. Armé algo en base a los datos que me pasó:
en C3 ingresamos el legajo, siendo que los campos apellido, nombre y cargo se completarán automáticamente utilizando la función BUSCARV().
A la derecha del formulario, en la celda D3 (la de forma cuadrada) insertaremos la foto del empleado.
Para que nuestro proyecto funciones correctamente y se fácil de mantener y depurar, deberemos preveer un par de situaciones:
a) las imagenes se guardaran en un directorio X del ordenador. El nombre de cada imagen deberá ser único e irrepetible, así que nombraremos a cada una con el numero de legajo del empleado, un dato que en todas las empresas es único. Todas ostentarán el mismo tamaño (no en Kb, si no en ancho y alto, por ejemplo 300 x 300 pixeles, para unificar criterios)
b) la macro se ejecutará cada vez que cambie el valor de la celda C3, que es donde ingresamos el nro de legajo.
c) definiremos una tabla en donde colocaremos ciertos parámetros de la imagen: altura, anchura, posición que tendrá en hoja, ruta de acceso y extensión de archivo. Esto lo haremos para que nuestra macro lea de allí los datos y si en un futuro necesitamos cambiar algo, nos sea sencillo hacerlo.
Habiendo definido los pasos lógicos, pasaremos a la codificación del ejemplo. Primero, la tabla de parámetros, la cual creé en una hoja llamada "P" (de "Parámetros):
aqui expongo los valores referentes a mi ejemplo. cada uno lo adaptará al suyo.
Ahora nos vamos a VBA (alt + f11) y desde el explorador de proyectos seleccionamos la hoja en donde tenemos el formulario, desplegando su ventana de código. Seleccionaremos el evento Private Sub Worksheet_Change(ByVal Target As Range), para así capturar el evento de cambios producidos en las celdas. Y allí escribimos el siguiente código:
Private Sub Worksheet_Change(ByVal Target As Range)
'declaro las variables que utilizaré en el proyecto
Dim De_donde As String, Foto As Object, _
Arriba As Double, Izquierda As Double, Ancho As Double, _
Alto As Double
'si el cambio se produjo en una celda distinta a la
'que contiene el nro de legajo, salgo del Sub
If Target.Address <> "$C$3" Then Exit Sub
'Evita el refresco de la pantalla
Application.ScreenUpdating = False
'Control de errores
On Error Resume Next
'si la instruccion Delete falla, arrojará error, por ello
'el controlador anterior:
Sheets("hoja1").Select
Sheets("hoja1").Shapes("La_Foto").Delete
'ruta de la imagen, a la cual le anexo el legajo del
'empleado y la extensión del archivo
De_donde = Sheets("P").Range("b7").Value & [c3] & "." & _
Sheets("P").Range("b2").Value
'si el archivo no existe, salgo del sub
If Dir(De_donde) = "" Then Exit Sub
Range("d3").Select
'Crea la foto
Set Foto = Sheets("hoja1").Pictures.Insert(De_donde)
'tomo los valores por defecto que definí en la
'hoja P (posicion, ancho y alto)
With Sheets("P")
Arriba = .Cells(3, 2).Value
Izquierda = .Cells(4, 2).Value
Ancho = .Cells(5, 2).Value
Alto = .Cells(6, 2).Value
End With
'aqui definimos el nombre y le pasamos los valores arriba
'seteados:
With Foto
.Name = "La_Foto"
.Top = Arriba
.Left = Izquierda
.Width = Ancho
.Height = Alto
End With
'Elimina el objeto, para liberar recursos
Set Foto = Nothing
Application.ScreenUpdating = True
End Sub
Desde ya que utilizo imágenes que nada tienen que ver con personas, solo a modo de ejemplo. Así quedaría nuestro formulario luego de ingresar el nro de legajo:
otro ejemplo:
y otro mas
Y listo Marcelo, espero haberte ayudado con este ejemplo y que sea mas adaptable a tu labor.
Cualquier duda me avisás.
recibí tu mail y vine a ver la entrada. gracias damian por responderme tan rapido es justo lo que necesitaba. voy a redimensionar las fotos como me aconsejas. me gusta la imagen del messenger que pusiste jejeje
ResponderEliminarbueno, grcias x avisar. las imagenes si o si deben tener el mismo tamaño, para que siempre se coloquen en la misma posicion.... de lo contrario se debería incluir alguna api que tome el tamaño y la acomode en la hoja en función a ello, pero no es aconsejable, ya que de la primer forma también estandarizás tu proyecto.
ResponderEliminarcualquier cosa avisame, por que existen mas opciones a la hora de trabajar con imagenes desde excel.
que tal, oye me surge una duda en el código con la palabra "De_donde". es la ruta de la carpeta y " La_Foto" es el nombre del archivo, de antemano gracias.
ResponderEliminarHola. Te explico: "de_donde" es la variable en donde almaceno la ruta completa de la imagen, incluyendo nombre y tipo de archivo. Ej: "c:\legajo001.png" o bien podría ser "c:\mis documentos\legajos\0001.png". Es el lugar del disco rígido en donde tenes almacenadas las imágenes a cargar en el proyecto.
ResponderEliminar"La_Foto" es el nombre que le doy al objeto "shape" que será el contenedor de la imagen que cargo.
Cualquier duda me avisas. Gracias x tu mensaje.