lunes, 29 de agosto de 2011

Cómo asociar una imagen al valor de una celda en Excel 2007.

Durante mi periodo de vacaciones, curiosamente, recibí dos correos que planteaban una misma situación. Se trataba de establecer la manera de asociar una imagen al valor de una celda:

...el concepto es esto: es un carnet, en la cual al cambiar un codigo cambia la foto y todo sus datos.
Lo que quiero saber cómo se hace para que cambie la imagen...


En esta primera explicación obviaremos macros y códigos VBA, centrándonos en las herramientas estándar de las que disponemos en Excel 2007.
Supondremos que tenemos una primera hoja 'BaseDatos' con un banco de imágenes:

Cómo asociar una imagen al valor de una celda en Excel 2007.


Vemos que nuestra base de datos o banco de imágenes es muy sencillo.
Nuestro trabajo comienza por asignar nombres a ciertos rangos (ver como); anticipando que nuestro criterio de búsqueda será el primer campo de nuestro origen de datos 'Código', lógicamente uno de los nombres creados será:
Código =BaseDatos!$A$2:$A$5
Para generar el segundo nombre emplearemos la función DESREF con su funcionalidad de búsqueda (y no de creación de rango), anidándo dentro de ella la funcíon COINCIDIR.
El segundo nombre será:
foto =DESREF(BaseDatos!$D$2;COINCIDIR(Ficha!$A$2;Código;0)-1;0)
función que mostrará de la columna D (o campo 'Foto') la imagen que coincida con el valor buscado en la celda A2.

Estos nombres los usaremos en la segunda de nuestras hojas ('Ficha'), donde asociaremos al valor de una celda la foto o imagen que le corresponda:

Cómo asociar una imagen al valor de una celda en Excel 2007.


En la celda A2 hemos generado una Validación de datos tipo lista, empleando el rango 'Código':

Cómo asociar una imagen al valor de una celda en Excel 2007.


La clave de todo este asunto viene ahora, ya que para asociar al valor desplegado en la celda A2 la imagen que le corresponda del origen de datos (o banco de imágenes) deberemos insertar un objeto.
Desde Ficha Insertar > Grupo opciones Texto > Objeto
seleccionaremos Imagen de mapa de bits:

Cómo asociar una imagen al valor de una celda en Excel 2007.


Observemos cómo aparece el objeto añadido

Cómo asociar una imagen al valor de una celda en Excel 2007.


aunque lo más importante será trabajar en la barra de fórmulas con el objeto seleccionado...
Después de darle un tamaño adecuado al objeto (lo he ajustado al tamaño de la celda C2):

Cómo asociar una imagen al valor de una celda en Excel 2007.


Con el objeto seleccionado, reemplazaremos en la barra de fórmulas donde pone =INCRUSTAR("Paint.Picture";"") por =foto, inmediatamente veremos cómo dentro de dicho objeto aparece la imagen correspondiente al valor de la celda A2 buscado.

Cómo asociar una imagen al valor de una celda en Excel 2007.



También es posible, repitiendo todos los pasos exactamente igual, insertar un objeto desde la Ficha Programador > Controles > Insertar > Controles ActiveX > Imagen:

Cómo asociar una imagen al valor de una celda en Excel 2007.


y seguir el proceso de manera identica a lo explicado anteriormente.

37 comentarios:

  1. Hola gracias por publicar esta info, tengo problemas en la parte donde hay que validar los datos en el origen hay que poner =codigo
    pero no me lo esta tomando, si bien cree el rango en la hoja "base de datos" como codigo, no me lo esta tomando.
    aceptando esto me trae el nombre de la imagen que corresponde al codigo pero no veo la imagen en si espero que me puedas ayudar.
    saludos,

    ResponderEliminar
  2. el error que me tira al intentar validar la lista con el origen =codigo es el siguiente
    "La fuente de la lista debe ser una lista delimitada o bien una referencia a una fila o columna individual"
    desde ya gracias y espero que me puedan ayudar

    ResponderEliminar
  3. Hola,
    asegúrate de crear el nombre Código:
    Código =BaseDatos!$A$2:$A$5
    previamente, se trata de Asignar un nombre a un rango de celdas. Una vez generado el nombre lo utilizaremos para generar una lista desplegable en una celda empleando la Validación de datos.
    Debes verificar que has escrito igual el rango...

    Los pasos de este ejemplo son muy sencillos y no tienen ningún truco, por lo que no deberían fallar...
    Slds

    ResponderEliminar
  4. Wow! very nice information. i was searching article like this.

    Thanks

    http://mlmdevelopers.com/products/mlm-software/mlm-software-beta/features.html

    ResponderEliminar
  5. Hago todo y maravilla aparece a foto, pero cuando le cambio el número en la primera columna, tengo que volver a escribir =Foto para que cambie, además sólo me funciona en la fila 2. No se que hacer, llevo un día tratando de hacer esto y para los macros si no tengo idea. ¿Alguna ayuda?

    ResponderEliminar
  6. Hola Emerson,
    es normal que funciene sólo a partir de la fila 2, ya que hemos definido 'foto' como:
    =DESREF(BaseDatos!$D$2;COINCIDIR(Ficha!$A$2;Código;0)-1;0)
    es decir, coge las imágenes a partir de la segunda fila.
    Realmente todo el trabajo parte de una correcta definición y asignación de nombres definidos; yo he replicado tu caso, y no me devuelve ningún error, esto es, funciona correctamente y no tengo ni que cambiar fórmulas ni reescribir =Foto.
    Asegúrate que tienes bien definidos los nombres, y la celda validación.. si ya reemplazaste
    =INCRUSTAR("Paint.Picture";"") por =foto
    olvídate de nada más.
    Slds

    ResponderEliminar
  7. YAAAAAAAA es que estaba tratando de poner otro desplegable en A2 e incrustar al frente otra de las fotos, sólo cree otro rango foto2 pero dependiendo ya de Ficha!A3 y cuando inserto el objeto al frente de la celda de Ficha!A3 ya le doy es Foto2 y así lo haré sucesivamente porque tengo que poner es algo así como 20 fotos. Gracias
    Todo el día de ayer hasta que alguien dió una solución sencilla sin tener que usar alta ingeniería de programación. Eso es lo bello de la inteligencia "La sencillez"

    ResponderEliminar
  8. Estimado, me ha sido de gran ayuda la información, el único problema es que no he podido ingresar
    =foto
    ya que me dice

    "La referencia no es válida"
    He puesto com Ámbito BaseDatos, Ficha y libro. Aun así, nada de nada.
    TE agradezco de antemano la ayuda.
    Saludos!


    PD: Uso Office 2010, será ese el problema??

    ResponderEliminar
    Respuestas
    1. Hola Danilo,
      ummm.. pues parece que algo falla en 2010, por que a mi me pasa lo mismo. Investigaré sobre el tema.
      Un saludo

      Eliminar
  9. y para el 2010 como hago

    ResponderEliminar
    Respuestas
    1. Hola...
      Revisa esta entrada donde se explica los pasos para construir una macro que inserta imágenes en una celda:
      http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-insertar.html
      Slds

      Eliminar
  10. DISCULPA LLEVO 2 DIAS Y NO ME SALE NADA DE FOTO, USO OFFICE 2007,HE CREADO 2 HOJAS UNA BASE DATOS Y OTRA FICHA, REEMPLACÉ FOTO POR INCRUSTAR SÓLO QUEDA EL MARCO EN BLANCO DE LA FOTO, TE AGRADECERE TU AYUDA.
    PEDRO

    ResponderEliminar
    Respuestas
    1. Hola Pedro,
      tienes que asegurarte de seguir los pasos explicados. Es fundamental definir priviamente los nombres y asignarlos a los rangos correctos.
      Comprueba que has dado el nombre 'foto' como se indica en el post.
      Slds
      P.D.: Por favor, evita escribir en mayúsculas... significa que estás gritando ;-)

      Eliminar
  11. Hola, he utilizado esta herramienta para mis archivos de Excel sobre ligas de fútbol en mi blog www.economiaemergente.com
    El Problema es que cuando actualicé a Excel 2010, ya no me funciona. Al cambiar en la barra de fórmulas el nombre del rango me aparece referencia no valida. Me puedes ayudar a encontrar la solución? quedo muy atento. Gracias!!!! Excelente Blog ...

    ResponderEliminar
  12. tengo un problema al imprimir la imagen no se imprime correctamente podrias ayudarme gracias

    ResponderEliminar
    Respuestas
    1. Hola Hugo,
      necesitaría saber a qué te refieres con 'correctamente', ¿quizá queda fuera del área de impresión?...prueba ajustando el escalado o los saltos de página, para que toda la imagen quede en la página impresa.
      Slds cordiales

      Eliminar
  13. Muchas gracias por compartir este truco.
    Me resolvió un problema que creía imposible de resolver y me agilizó mucho el trabajo.

    ResponderEliminar
    Respuestas
    1. Me alegro te haya sido útil...
      ese es el espíritu de mi blog.
      Cordiales saludos

      Eliminar
  14. por dios, por fin. :)
    llevo un monton de tiempo buscando una buena explicacion.
    gracias, realmente no sabes como me has ayudado con este esplicacion.


    ResponderEliminar
  15. Hola Ismael,
    Gracias por el post. Está genial.
    ¿Sabes qué fórmula o proceso aplicar para que los resultados sean visibles en varias filas a la vez?. Estoy creando una tarifa con 1500 referencias a las que tengo que asignar 100 dibujos (muchas referencias utilizan un mismo dibujo). Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola, y perdona no haberte contestado antes...
      tu comentario se me escapó, lo siento.

      Respecto de tu cuestión, no sé si lo entiendo bien.
      Entiendo que quieres visualizar para cada una de esas 1500 referencias uno de esos 100 dibujos (repetidos), pero no quieres realizar la incrustación de manera manual... si es así, podrías leer esta entrada donde se explica una macro:
      http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-insertar.html

      Espero te sirva.
      Slds

      Eliminar
  16. Muchas gracias por esta explicación. Una vez comprendidos los pasos, realmente es muy sencillo conseguirlo.
    Sólo una duda.
    Al escribir la fórmula del rango "foto", al prinicipio pensé que faltaba un ´;´ después del paréntesis de cierre de COINCIDIR (Donde he puesto el asterisco), <<<..COINCIDIR(Ficha!$A$2;Código;0)*-1;0)>>>>, pero si lo ponía, la foto no se refrescaba con el cambio de referencia a "Código". Una vez que quito el ';', todo va de maravilla.

    ¿Se debe a un error? porque ambas sintaxis las tolera como correctas.

    Un saludo y gracias por el post

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias a tí...

      no es un tema de COINCIDIR, si no de la función DESREF, ésta admite hasta 5 argumento:
      =DESREF(ancal;fila;columna;alto;ancho)
      la función COINCIDIR se emplea, al anidarla, como argumento 'fila'.
      En el caso que planteas, si reemplazas el asterisco por un ';' estás llevando el -1 como argumento 'columna' y el '0' como argumento 'alto'.
      Es decir, la función no te dará error, ya que estás completando argumentos válidos, pero el sistema fallará por que estarías refiriéndote a cualquier otra cosa.

      Espero haberme explicado con claridad ;-)

      Sdls cordiales

      Eliminar
  17. Creo que he comprendido mi error: El argumento fila de tu expresión es el resultado de COINCIDIR menos 1, y el '0' estaría haciendo referencia al argumento 'columna'.

    Claridad meridiana.

    Un saludo y Gracias de nuevo por tu respuesta

    EM

    ResponderEliminar
  18. Hola,

    En el caso de querer insertar una imagen en un formulario, ¿como voy añadiendo imágenes a la siguiente fila? Me explico:
    voy introduciendo datos, y cada dato tiene una imagen asociada.
    Dato Imagen
    A imagen1
    B imagen2
    C imagen3
    A imagen1

    La tabla se va llenando cada vez que se calcula (pulsando F9).
    ¿cómo lo puedo hacer?
    lo he intentado con =DESREF(BaseDatos!$D$2;COINCIDIR(Ficha!$A$2;Código;0)-1;0), pero Ficha!$A$2 va cambiando de posición, es una variable por lo que no sirve...

    gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola,
      aunque no acabo de entender cuál es el proceso que quieres hacer, creoq ue te pude ser útil leer esta entrada
      http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-insertar.html

      Estoy suponiendo que cuando hablas de 'formulario' (por el contexto) te refieres a una plantilla en una hoja de cálculo, y no un UserForm de VBA...

      Espero te pueda orientar...
      Slds cordiales

      Eliminar
  19. no entendí na-dita, me podrían poner un documento como ejemplo???

    ResponderEliminar
    Respuestas
    1. Hola,que tal?
      Espero estés bien.

      Sólo sigue los pasos tal cual se indican.
      También puedes ver otro ejemplo en
      http://excelforo.blogspot.com.es/2012/11/pegar-imagen-vinculada-en-excel-2010.html
      Un cordial saludo

      Eliminar
    2. gracias pero no creo k m funcione a lo k necesito hacer debo de hacer ke la imagen me aparesca junto con el numero de control de una persona... y lo intente con el jemplo ke dan al inicio de la pagina pero no me funciona no sale y esquee tengo el 2010..
      estoy acabada :(

      Eliminar
  20. hola! he seguido alpie de la letra tus instrucciones pero no logro desplegar la imagen solo me aparace un cuadro en blanco. cres que sea la version? uso excel 2007 en ingles.

    ResponderEliminar
    Respuestas
    1. Hola Gabino,
      la explicación está dada sobre la versíon Excel 2007, no creo que tu versión en inglés tenga nada que ver... yo repasaría bien los pasos, especialmente el tema de Nombres definidos y la situación de las diferentes celdas o rangos respecto a estos.
      Comentas cuando lo hayas verificado.
      Slds cordiales

      Eliminar
  21. Una consulta al foro: Al tratar de insertar un cuadro de texto en excel pasa lo siguiente: me enmarca el cuadro pero no puedo escribir dentro del mismo, me sale una advertencia que dice "La Referencia no es Válida" si alguien puede ayudarme le agradeceré, a modo de info tengo en Windows 8

    ResponderEliminar
    Respuestas
    1. Hola,
      no creo tenga nada que ver con la versión de Windows que tengas...
      asegúrate tienes correctamente instalado Office, y en particular Excel.
      De todas formas ese error de 'Referencia no válida' normalmente se dá cuando trabajamos con Tablas dinámicas o con fórmulas que operan sobre rangos o celdas (referencias de Excel) o quizá con nombres definidos; por lo que es muy extraño que al intentar insertar un sencillo objeto (un Cuadro de texto, sin más..) aparezca un error de Referencia, cuando el onjeto no está aún asociado a nada.

      Lo siento, pero no puedo darte una solución...
      :-(

      Eliminar