Hojas de cálculo en Excel - página principal

Mostrar imágenes en un formulario

En un artículo anterior, habíamos visto como mostrar imágenes asociadas a un desplegable, directamente en nuestra hoja de cálculo Excel. En esta ocasión, os muestro una forma de hacer lo mismo, pero incluyendo las imágenes en un formulario, es decir, en un userform.

La técnica en ambos casos es muy similar, así que esto lo que explique en este artículo, estará chupado, para aquellos lectores del blog que ya se hayan leído el artículo o que comentaba en el párrafo anterior.

Como siempre, vamos a ilustrar esta técnica con un sencillo ejemplo. Para ellos, hemos escogido una serie de construcciones, en este caso, torres, de diferentes ciudades, y de diferentes países. Solo hemos puesto unas pocas, para que vosotros añadáis las que creáis convenientes.

Lo primero que vamos a hacer es montar la lista que se muestra en la siguiente imagen, y de paso también crearemos un botón, para asociarlo a un macro, en este caso, al macro que lanza el userform.


Lo siguiente que debemos tener, es una lista con las imágenes, y que necesariamente se llamarán de la misma forma a como aparecen en la columna A de la imagen anterior (evidentemente, sin tener en cuenta la extensión correspondiente, en este caso, jpg):


Ahora procederemos a crear un formulario en Excel, donde incluiremos dos etiquetas (dos label), una para el título del formulario en sí, es decir, un rótulo con el texto "Torres famosas", y otra para mostrar la ciudad y el país donde se encuentra la torre elegida. También incluiremos un ComboBox, donde al desplegarlo, podremos elegir la imagen. Por supuesto, incluiremos también un control de imagen, para que se muestre la imagen elegida en el ComboBox, y finalmente, lo último que incluiremos será un CommandButton para que al pulsar sobre él, se cierre del formulario. Es decir, haremos algo como lo que se muestra en la siguiente imagen:


Ahora solo nos quedará incluir el código que irá asociado a los controles. Comenzaremos con el código del ComboBox, al hacer click sobre él:


Private Sub ComboBox1_Enter()
'En caso de error, que continúe
On Error Resume Next
'limpiamos los datos del Combobox
ComboBox1.Clear
'Al inciar el formulario,
'seleccionamos la hoja con los datos

Hoja1.Select
'Seleccionamos la celda B5
Range("A2").Select
'Vamos a llenar dinámicamente el combobox
'con los nombres de los artículos, hasta
'encontrar una fila vacía

Do While Not IsEmpty(ActiveCell)
'ponemos el nombre del producto
ComboBox1.AddItem ActiveCell.Value
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Ahora le toca el turno al código que nos servirá para mostrar las imágenes, cada vez que cambiemos el item del desplegable, en nuestro caso, del ComboBox:

Private Sub ComboBox1_Change()
'definimos la ruta donde tenemos el fichero de excel
'(que será la misma donde tengamos las imágenes)

ruta = ActiveWorkbook.Path
'definimos los nombres de las imágenes
imagen = ComboBox1.List(ComboBox1.ListIndex) & ".jpg"
'ahora definimos la ruta y la imagen
ruta_e_imagen = ruta & "\" & imagen
'cargamos esa imagen en el cuadro de la imagen
Image1.Picture = LoadPicture(ruta_e_imagen)
'ahora ponemos el nombre de la ciudad y el país en el label2
Cells.Find(What:=Replace(imagen, ".jpg", "")).Select
Label2 = ActiveCell.Offset(0, 1) & " (" & ActiveCell.Offset(0, 2) & ")"
End Sub

Con los dos macros anteriores, lo que hemos hecho, ha sido por un lado llenar el ComboBox al hacer clic en el desplegable (con los datos de la hoja de cálculo), y por otro lado, cada vez que cambiamos el elemento seleccionado en el ComboBox, mostrar la imagen correspondiente a ese elemento seleccionado.

Ahora solo nos quedará incluir el código que tendremos asociado al botón "Cerrar":

Private Sub CommandButton1_Click()
'descargamos el formulario de memoria
Unload Me
End Sub

Todo el código que hemos visto hasta ahora, va incluido dentro del propio UserForm, pues es el código asociado al mismo. En cambio, este último código, que os incluyo, es para lanzar el formulario en sí, por lo que lo pondremos dentro de un módulo:

Sub Lanzar_formulario()
'lanzamos el formulario
UserForm1.Show
End Sub

Con esto tenemos todo listo, para mostrar un formulario tan llamativo como este:


Desde aquí podéis descargar un fichero comprimido, que incluye el fichero Excel y las fotos de las torres, que hemos visto en este artículo.



23 comentarios:

Carl0 dijo...

Se podria crear este formulario con archivos .pdf ?

Gracias por tu trabajo

Javier Marco dijo...

Pues tal y como está diseñado, imposible, ya que el control "image" solo acepta imágenes y no PDF's (por mucho que los pdf's se puedan abrir con algunos programas gráficos).

Además, tampoco le veo mucha utilidad, pues normalmente los pdf son como mínimo de 1 página, y deberías tener un formulario enorme, para poder ver el contenido de ese pdf en pantalla (sin hacer zoom, claro).

Lo ideal para mostrar pdf's es poner links que apunten a ellos, para abrirlos al vuelo.

Saludos.

Angels dijo...

Hola, estaba buscando un post adecuado para poder publicarlo pero lamentablemente no se como hacerlo.
Así que lo dejo en este post.
Quisiera una ayuda con una hoja de excel en el como habilitar una cierta cantidad de numero de filas y columnas en el excel, y que estas ya no puedan ser modificadas o simplemente ya no aparescan con ayuda de una macro.
Aqui te dejo el link de una imagen por si no me deje entender http://img541.imageshack.us/i/ayudaparahabilitarciert.png/

Javier Marco dijo...

Hola Angels. Como lo que planteas es algo que no tiene relación con nada de lo publicado en el blog, y requeriría de un artículo nuevo para explicarlo, te recomiendo que te pases por aquí, que te solucionarán la duda: http://www.forosdelweb.com/f90

Espero que no te moleste. Un saludo.

Giovanni dijo...

Buenas noches Javier, te felicito por este excelente Blog que me sido de mucha utilidad. Me llamo Giovanni, soy dentista y tengo en mi clinica un listado de pacientes, Fijate que me he estado quebrando la cabeza de como hacer para que de una columna donde tengo varios nombres salteados, es decir en algunas filas hay nombres y en otras estan vacias, como hacer para que al final de esa columna excel me despliegue automaticamente, sin usar filtros avanzados, si no que automaticamente un listado de los nombres que tengo en dicha columna uno seguidos de otros. Te agradeceria si me ayudas en este sentido, y nuevamente te felicito por tu util Blog.

Javier Marco dijo...

Quizás esto te sea más útil: eliminar filas vacías.

Saludos.

Gusmario dijo...

Muy bueno...

Cambie la extension de .jpg a .gif y me muestra la imagen, pero no animada, como logro que la animacion trabaje al mostrarme la imagen seleccionada?

Gusmario dijo...

Hola...

una pregunta... Como puedo reproducir audio o video en un formulario de excel?

Javier Marco dijo...

Para incluir una imagen en movimiento, y un fichero de audio, tienes que mostrar controles adicionales, a la hora de diseñar el formulario. En este artículo está explicado: incluir un calendario en un formulario.

Concretamente tienes que incluir de la lista de controles, el control "Microsoft Web browser", para las imágenes en movimiento, y el control "Windows Media Player" para el audio y video.

Una vez insertadsos los controles, solo le tendrás que marcar la ruta donde están los ficheros, como en este ejemplo que te incluyo, y donde se cargarán la imagen y el audio al activar el formulario:

Private Sub UserForm_Activate()
WebBrowser1.Navigate "F:\imagen-a-incluir.gif"
WindowsMediaPlayer1.URL = "F:\audio-a-escuchar.mp3"
End Sub

Saludos.

Gusmario dijo...

muy agradecido por la respuesta...

ya lo prove el codigo y funciona, no seria mucho pedir que subieras un libro con una aplicacion de video o musica y el gif animado, me serviria para ver los alcances de esta opcion que nos da visual basic excel en los formularios.

gracias...

Gusmario dijo...

yo de nuevo...

Podriamos hacer que las imagenes se amplien al mostrarse en el formulario y no importe el tamano o resolucion de estas, seria algo asi como stretch = true?...

pero como lo aplico?...

y otra cosa, que las imagenes sean leidas de un folder en especial y que no tengan que estar junto al archivo de excel.

Se me ocurre hacer un juego de roll donde haces una tirada de dados con un boton y seleccionas una accion que tendra poco o mucho valor dependiendo de la cantidad de puntos que te de el tiro de dados y muestre una imagen, osea tengo una imagen del personaje y al atacar o ser golpeado cambie a otra donde se vea erido o golpeando y sus puntos de vida disminuyan o su poder se redusca, o poner un pequeño video y tener musica hambientando la accion, pero talves pido algo muy dificil ya que la hoja de excel no tiene inteligencia artificial para que el contrincante conteste los ataques, pero se me ocurre que podria jugarse entre 2 personas en la misma pc.. algo es algo no creen?

gracias por su paciencia...

Gusmario dijo...

Buenos dias Javier Marco y a todos los demas...

escribo a ustedes para mostrarles mi proyecto del trabajo, obvio que no vienen los datos del personal donde trabajo los suprimi por los "x-men" y cambie el nombre de las areas y demas para evitar problemas legales con mi empresa, mi proyecto de entrada te dice el dia que es y si es de mañana, tarde o noche con unos msgbox y te da la bienvenida, despues te pide que introduscas un user y un password "no importa si son mayusculas o minusculas funciona"(user - calidad) y (password - 123) en un userform, despues te lanza otro useromr donde seleccionamos el tipo de busqueda que deseamos o nececitemos, un boton de salir y un boton de administrador (para actualizar informacion, ver la informacion de las tablas, crear nuevos registros, crear nuevos users, y un buscador de users por si se le olvido al usuario el password) (user - gusmario) y (password - 123), todo funciona pero hay unos pequeños detalles que espero me ayuden a resolver, se trata de lo siguiente:
cuando estamos seleccionando las imagenes en los buscadores y borro el nombre del combobox para ingresar manualmente otro me lanza un error 381 y se bloque, esto pasa en los tres buscadores y los usuarios se molestan con este error, hay alguna forma de solucionarlo?, pero esto no es todo, cuando ingreso algun dato nuevo a las tablas me ensima la informacion sobre el ultimo registro que existe en lugar de debajo del ultimo registro ingresado, hay forma de arreglarlo?... y esto no es todo, quiero y nececito que las fotografias que usa el archivo de excel esten en lugares diferentes, alguien me puede ayudar con esto?
quise incluir fotos aqui, pero no deja o mejor dicho no se como hacerlo, asi que subi mi proyecto con las capturas incluidas de los errores, en verdad agradeseria me ayuden a acabar mi proyecto para mi trabajo...

aui enlace para descargar proyecto:
http://www.megaupload.com/?d=4LXHISNQ

espero su pronta respuesta!...

Gusmario dijo...

Hola...

En vista de que nadie respondio mis desesperados gritos de ayuda, buscando aqui, viendo haya y preguntando por todos lados resolvi mi problema y fue una cosa muy sencilla, para el problema relacionado con los buscadores cuando borro el nombre del combobox para ingresar manualmente otro me lanza un error 381 y se bloquea la macro (esto pasaba en los tres buscadores y los usuarios se molestan bastante con este error), lo solucione agregando la siguiente linea al inicio del codigo del combobox1...

Private Sub ComboBox1_Change()
'Si hay errores, que continúe
On Error Resume Next

Y despues el resto del codigo. Y el problema de que no queria tener las imagenes en la misma carpeta donde tenia el libro de excel, lo solucione asi, agrege lo siguiente al codigo:

=codigo original=
'ahora definimos la ruta y la imagen
ruta_e_imagen = ruta & "\" & Imagen

=codigo modificado=
'ahora definimos la ruta y la imagen
ruta_e_imagen = ruta & "\fotos\" & Imagen

Agrege la palabra fotos\, ya que asi se llama la carpeta donde meti mis fotos y funciona de maravilla, ahora solo me falta arreglar mi codigo del boton agregar datos nuevos, ya que me ensima la informacion nueva sobre la ultima fila de datos "ocupada", como veran nunca crece mi base y pierdo los ultimos datos que ingrese, ahora si habra alguien que me ayude???...

Y aqui les traigo un regalito, como no se como crear un tema nuevo aqui lo pondre y que el administrador lo ponga donde va, se trata de una hoja de excel donde pondremos una serie de datos en celdas elegidas para colocar informacion sobre algun tema en especial, en mi caso pongo datos de una inspeccion en linea sobre un producto, en el cual en la parte baja nos aparecera una cadena con la ultima informacion que ingresamos y ademas nos generara un archivo de excel en el disco "C" llamado c:\misdatos.csv , que servira de almacen para todos los datos que ingresen con el boton salvar datos, osea sera un reporteador, espero les sea tan util como a mi, aqui el codigo de la descarga directa para que lo prueben:
LINK:
http://www.megaupload.com/?d=8DOQB6CP

por cierto sigo esperando una pequeña ayuda en el blog Ejecutar una macro a una hora determinada, quiero ver como hacer un codigo donde con el paso de los dias y horas se bloqueen columnas, espero no me regañen por mezclar varias cosas, todo lo hago por engrandecer el sitio y crecer en mis conocimientos tambien...

Anónimo dijo...

Hola, estoy tratando de hacer este formulario. He hecho casi todo, pero no he logrado lo mas importante, que al hacer click sobre alguna opcion de la lista en el formulario me saque la imagen. Me sale error 76.
A diferencia del ejemplo solo tengo 2 imagenes.
No se si tenngo que cambiar algo en los códigos que hay en la pagina, o poner rutas de donde estan las imágenes. Podrías ayudarme.. ? gracias! :)

Janet Santiago dijo...

Buenos días

Muy buena tu página, me ha ayudado mucho, pero ahora tengo un problema.
Realicé muy bien todos los pasos y me dio resultado; pero estoy tratando de hacer lo mismo en dos hojas del mismo libro, al terminar el formulario de la hoja2, me trae muy bien los gráficos que quiero mostrar, pero en la hoja1 quedaron desactivados. Al hacer click sobre el botón me sale el sigueinte error: "Se ha detectado un nombre ambiguo: Lanzar_Formulario"

Como podría solucionar este problema, para que me quede funcionando los formularios en ambas hojas, ya que asó lo requiero..

Muchas gracias por su ayuda y aportes

Javier Marco dijo...

Prueba a cambiarle el nombre del macro, y en lugar de llamarlo Lanzar_Formulario() ponle por ejemplo Lanzar_Formulario_1()

Si lanzas el macro desde un botón, recuerda asociarlo de nuevo a ese macro.

jorge benitez dijo...

Hola Javier, gracias por la macro me a servido de mucho con un proyecto en mi trabajo, quiero molestrate solo con una modificacion en la macro:que en lugar de usar la lista desplegable me muestra la imagen al ingresar un codigo en una determinada celda, ya que el proyecto que realize me muestra la imagen de diferentes facturas dependiendo el codigo que ingrese, se me hace doble trabajo el ingresar el codigo y luego selecionarlo en la lista desplegable en el userform, gracias, espero con ancias tu ayuda.

Javier Marco dijo...

Jorge, simplemente quita la lista de validación, de tal forma que puedas escribir un nombre o código cualquiera.

Si pruebas con el ejemplo de la web donde salen los coches (he resubido el fichero, pues faltaban las imágenes), y eliminas la lista de validación, verás que ocurre al escribir en esa celda, por ejemplo: Golf GTI mk1

¿Qué ocurrirá?. Pues que aparecerá la foto del Golf GTI mk1.

Saludos.

jorge benitez dijo...

Hola Javier,gracias por responderme; pero la lista desplegable si la elimine en el documento de Excel, pero la que no puedo modificar o no e econtrado como hacerlo es el del ejemplo de las torres famosas, que en ves de usar la lista desplegable en la ventana con el ComboBox se ejecute la macro automaticamente y muestre la imagen sin usar la lista desplegable.

Javier Marco dijo...

Jorge, el artículo está pensado para el uso de un formulario. Lo que pretendes hacer está explicado en esta entrada: mostrar imágenes asociadas a un desplegable. Para ello, simplemente tienes que eliminar la lista de validación y ya está (lo que te expliqué en mi respuseta anterior).

Un saludo.

Merlly dijo...

Buen dia Javier, la consulta es que baje el mismo archivo y en office 2010 no corre, me sale un error en Image.Picture esto sale sombreado en amarillo no se que sera, espero su respuesta saludos y gracias

Javier Marco dijo...

Merlly, lo acabo de probar en Excel 2010, y funciona perfectamente. Comprueba que las imágenes de las torres estén en la misma carpeta donde tienes el fichero de excel. En caso contrario, tendrás que cambiar la ruta en el código. Pero ya te digo que si tienes las imágenes en la misma carpeta donde tienes el fichero excel, te funcionará correctamente.

Saludos.

Cristian PEÑA dijo...

quisiera saber como puedo hacer que me cargue la imagen de acuerdo a un label