A esta consulta me la realizó hace algún tiempo atrás un tal Federico, quien vía mail me preguntó la forma de mostrar imágenes en Excel. Trabaja en una casa de materiales para la construcción, y su idea era implementar una lista de precios que a su vez mostrara una foto del producto seleccionado.
Voy a aclarar que existe un método que no utiliza macros, pero en verdad es muy difícil de realizar y, sobre todo mantener, ya que las imágenes involucradas deben tener exactamente el mismo tamaño de las celdas contenedoras, y otras cuestiones que demandan mucho tiempo al desarrollador.
Visto lo expuesto, le propuse la siguiente solución, basada en VBA y la utilización de uno de sus controles ActiveX: el control Image.
[+/-] Ver el resto / Ocultar
Aquí cabe aclara algo: utilizo este control dado que las imágenes involucradas se encuentran almacenadas en algún directorio del ordenador; no están insertas dentro de Excel. Esto me proporcionará un archivo muchísimo mas liviano y fácil de manejar.
Voy a cambiar la temática del ejemplo, para darle un poco mas de "colorido": imaginemos que necesitamos mostrar las imágenes correspondientes a cuadros de distintos artistas. Para ir definiendo algo, tengo las fotos en el directorio C:\GaleriaDeArte\, aunque bien podría ser cualquier otro. A cada imagen la nombro con el apellido del artista, un guión bajo y un número, para de esta forma poder almacenar varios cuadros de cada autor. Por ejemplo: picasso_1.jpg, picasso_2.jpg, vangogh_1.jpg, etc, etc.
Comencemos: lo primero será agregar el control Image a nuestra planilla. Para esto nos vamos a algún espacio en blanco de nuestra barra de herramientas, hacemos click con el botón derecho del mouse y seleccionamos la opcion "cuadro de controles":
Lo mas probable es que nuestro control no esté cargado, así que lo buscamos, haciendo click sobre el botón del "martillo y la llave":
deslizamos la lista desplegable hasta encontrarlo, y hacemos click sobre él:
y por último lo colocamos en nuestra hoja de cálculos:
noten la leyenda que se genera en la barra de fórmulas al seleccionar el objeto.
Bueno, ya es un comienzo. Así como está... no dice mucho, pero en breve haremos a este control Image funcional.
La cuestión ahora es la siguiente: ¿que evento utilizo para ir cambiando de foto? ¿el click de un botón? ¿una lista desplegable? ¿doble click sobre un listbox? En verdad podría ser cualquiera y esto variará en función a nuestras necesidades; por lo pronto ejemplificaré con un ComboBox, que no es otra cosa que una lista desplegable: los nombres de las imágenes se cargarán en el control y cada vez que cambie, mostrará la respectiva imagen.
Así que nuevamente nos vamos a la caja de herramientas y seleccionamos el ComboBox:
y lo colocamos debajo del control Image:
Ahora si empezamos a codificar.
Como primer medida: utilizaremos el evento Workbook_Open() (que se produce al abrir el libro), para recorrer el directorio en donde tenemos las imagenes e ir cargando sus nombre en el ComboBox:
Private Sub Workbook_Open() 'por las dudas, coloco un controlador de errores On Error GoTo Handler_Error 'defino el directorio en donde se encuentran las imagenes r = Dir$("C:\GaleriaDeArte\") 'llevo la cadena a minúsculas r = LCase(r) 'limpio cualquier dato existente en el combobox: Hoja4.ComboBox1.Clear 'y con este bucle recorro el directorio Do While r <> "" Hoja4.ComboBox1.AddItem r r = LCase(Dir$) Loop Exit Sub 'aqui aviso si existieron problemas: Handler_Error: If Err.Number <> 0 Then MsgBox "Se produjeron errores al cargar las imagenes", vbCritical Err.Clear Exit Sub End If End Sub
Si ejecutamos esta macro, el ComboBox quedaría así luego de abrir el libro:
tengo por ahora a tres artistas. y todos están dentro del ComboBox de la imagen anterior.
Lo bueno de este sistema es que podríamos denominarlo "dinámico": con solamente copiar nuevas imágenes dentro del directorio, nuestra macro las cargará automáticamente en el ComboBox.
Ahora hacemos doble click sobre el ComboBox para abrir su ventana de propiedades y dentro del evento Change() escribimos lo siguiente:
Private Sub ComboBox1_Change() On Error Resume Next 'utilizo una sola linea de código para mostrar la imagen: paso 'como argumento el directorio en donde se encuentran, concate 'nando el nombre del archivo, que se encuentra en el ComboBox Image1.Picture = LoadPicture("C:\GaleriaDeArte\" & ComboBox1.Text) If Err.Number <> 0 Then MsgBox "Se produjeron errores al cargar la imagen", vbCritical Err.Clear End If End Sub
y si, como es de suponer, ya tenemos nuestra galería funcionando:
cada vez que seleccionamos un valor distinto, nos mostrará el respectivo cuadro.
Existen varias propiedades interesantes del control Image, útiles a la hora de configurarlo correctamente. Resulta mas que obvio, pero nunca de mas, que lo haremos de acuerdo a nuestros requerimientos.
Les muestro algunas:
1) Shadow: si colocamos este valor en True, mostrará una sombra debajo del control, dandole un aspecto tridimensional:
2) SpecialEffect: es una lista desplegable con varias opciones, que le darán distintos bordes al control Image
3) Autosize: tiene dos valores: TRUE = nos mostrará la imagen en tamaño original. Ojo en este punto, ya que si esta es muy amplia, podría salir de la pantalla y desbordar el campo de visión. Para este caso, prefiero FALSE, que ajustará el tamaño de la imagen al tamaño que tenga el control Image.
4) PictureSizeMode: casi siempre utilizo el valor PictureSizeModeStrech o el PictureSizeModeZoom, para una correcta visualización de las imágenes.
A todas estas propiedades las podemos cambiar mediante código, como por ejemplo:
Image1.Autosize = FALSE
o bien desde la ventana de propiedades de VBA:
Como práctica es recomendable probar con todas las opciones, y definir las que se ajusten a nuestro proyecto. Otro ejemplo de mis cuadros, con SpecialEffect en "Sunken":
Y de aquí en mas las posibilidades son ilimitadas. Imaginen que puedo armar una tabla, en otra hoja, conteniendo los datos del cuadro (autor, precio, movimiento artístico al que pertenece, etc, etc) y con la funcion BUSCARV() luego mostraría esos datos al cambiar cada cuadro.
Si revisan este post verán como pueden, con simplemente presionar un botón, enviar por mail a nuestro cliente el cuadro seleccionado. Y todo sin salir de Excel.
Otra práctica muy común sería utilizar este procedimiento para mostrar la foto de cada empleado de la empresa, junto a sus datos personales.
Suerte y cualquier duda, me avisan.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
buenas tarde;
ResponderEliminarsera que me pude colaborar con lo siguente :
tengo 3 criterios para generar un recargo, estos recargos depende de un rango de fecha asi:
de 03/01/2011 al 18/01/2011 =0%
de 19/01/2011 al 26/01/2011 =7%
de 27/01/2011 al 04/02/2011 =12%
si tengo una fecha de pago me debe gererar el recargo de acuerdo a los rangos anteriores.ejemplo
fecha pago = 29/01/2011 recargo = 12%
le agradezco la ayuda
estimado lector: te dejo el link a la entrada que levanté en base a tu (muy interesante) consulta: http://damianexcel.blogspot.com/2011/06/fijar-criterios-de-acuerdo-un-rango-de.html
ResponderEliminarespero haber comprendido bien el problema planteado y que la solución te sirva. avisame como te fue.
saludos.
oye que criterios debe llevar la macro para ejecutarse, porque no veo como ejecutarla ni como hacerla
ResponderEliminarHola: el evento se "dispara" al abrir el libro, el còdigo se halla dentro de Workbook_Open().
ResponderEliminarQuizás tengas la seguridad en macros muy alta y por ello no corre.
Te vas al menú "Herramientas/macros/seguridad" y allí seleccionas la opción "medio", mediante la cual un mensaje (al abrir el archivo) te avisa que existen macros, dándote la posibilidad de aceptar o no la ejecución de las mismas. Luego cierras Excel y lo vuelves a abrir.
Listo, debería funcionar sin problemas
Y si en ese directorio tuviese exactamente 40 imágenes que quisiera colocar en sus respectivos controles de imágenes, ¿cómo sería el ciclo?
ResponderEliminarHola Puma750: buena esa pregunta, por que nos plantea otro tipo de trabajo. En el ejemplo que doy solo existe un control para todas las imágenes, vos necesitarías colocar un control para cada imagen.
ResponderEliminarLevantaré una entrada al respecto, ya que debo explicar otras cosas. Apenas la tenga coloco aquí el link. Gracias x tu mensaje.
el link a la entrada para colocar 40 imágenes dentro de una planilla:
ResponderEliminarhttp://damianexcel.blogspot.com/2012/02/cargar-varias-imagenes-en-una-hoja-de.html
Excelente nota. Es la forma más sencilla que he visto usando código de macros. Felicitaciones....
ResponderEliminarhttp://mbexcel.blogspot.com/
Hola Damian. Me anduvo fenómeno, pero después lo copié y pegué para mostrar Dos imagenes independientes con esta forma, hice las modificaciones que creí necesarias y no me anda. Cómo crees que puede arreglarse?
ResponderEliminarMuy buen blog!
Pablo: vas a tener que enviarme el archivo a la dirección de correo que aparece al pié del formulario... necesito revisar el código para ver que está mal programado.
ResponderEliminarAvisame por este medio cuando lo hagas.
Un abrazo.