INSERTAR FOTOGRAFÍA EN CONTROL DE IMAGEN

A diario recibo bastantes consultas directamente al buzón de contacto de Excel Signum, hace unos días, un lector realizaba una consulta para resolver una situación problemática de una idea que quería realizar.

Se proponía realizar su currículum en Excel, algo que le pareció interesante, sobre todo por la versatilidad para mostrar información, ya que podría incluir cronogramas, gráficos, diseños, cálculos, porcentajes (incluso vídeos).

Dado que aún estaba comenzando, tenía la duda de cómo realizar una macro para poder insertar su fotografía, y además modificar tamaños y formatos.

Normalmente las imágenes se suelen insertar en los formularios para realizar programas, como por ejemplo, de almacén, donde la fotografía del artículo acompaña a la descripción del mismo. Además la imagen se suele almacenar en una carpeta o directorio desde el cual cuando el formulario se abra cargue la foto, de otra forma, si almacenásemos cientos imágenes en un archivo, pesaría demasiado y su gestión sería inviable.

Pero para este caso, lo que se busca es insertar una fotografía en la propia hoja Excel (que la almacene) y que además cada vez que elija una nueva, elimine la anterior.

Para ello, antes de nada, debemos insertar en nuestra hoja un control ActiveX (imagen).

INSERTAR FOTOGRAFÍA EN HOJA EXCEL EN UN CONTROL DE IMAGEN

Una vez realizado esto, procedemos a introducir en nuestro editor de VBA el siguiente código en un módulo estándar:

Sub INSERTA_FOTO()
Dim foto As Variant
'Abrimos directorio y buscamos solo archivos de imagen
foto = Application.GetOpenFilename(FileFilter:= _
"Imagen (*.gif;*.jpg;*.jpeg;*.bmp), *.gif;*.jpg;*.jpeg;*.bmp", _
Title:="Seleccionar imagen", MultiSelect:=False)
'si no elegimos ninguna fotografía entonces salimos del proceso
If foto = False Then
Exit Sub
End If
'Si elegimos la foto pero antes ya teníamos otra, antes de insertar, borramos la anterior
With Sheets(1)
If Not IsEmpty(.Image1.Picture) Then
.Image1.Picture = Nothing
End If
'luego subimos la foto.
.Image1.Picture = LoadPicture(foto)
' y le damos formato, en este caso Strech (justificamos la imagen)
.Image1.PictureSizeMode = fmPictureSizeModeStretch
' si deseamos dar formato al ancho y al alto, lo podemos hacer asi
.Image1.Width = 120
.Image1.Height = 120
End With
End Sub

Ahora que ya lo tenemos, podemos elegir entre nuestros archivos la imagen que nos interesa y además darle formato.

Con esta propiedad estamos ajustando la imagen al control ActiveX:

.Image1.PictureSizeMode = fmPictureSizeModeStretch

Pero también podemos subir la imagen sin ajustar:

.Image1.PictureSizeMode = fmPictureSizeModeClip

O realizando un zoom del 50%, por ejemplo:

.Image1.PictureSizeMode = fmPictureSizeModeZoom = 50

Y eso es todo, ahora nuestro compañero ya tiene la herramienta perfecta para seleccionar y subir su fotografía en su futuro currículum.

El resultado sería un pequeño formulario para subir nuestra imagen, (en este caso os dejo una vista panorámica desde el Duomo, en Florencia. Qué gran viaje 🙂

INSERTAR FOTOGRAFÍA EN HOJA EXCEL EN UN CONTROL DE IMAGEN1

Aunque considero que no es necesario, si queréis incluir un botón para eliminar la foto, el código sería este:

Sub ELIMINA_FOTO()
'Formulario en blanco
With Sheets(1)
.Image1.Picture = Nothing
End With
End Sub

Y este sería el pequeño ejercicio de hoy, espero que os resulte de interés y os pueda servir en alguno de vuestros proyectos, o currículums 🙂

* Nota: los formatos de imagen “png” y “tiff” no son soportados por VBA, por ello no los incluyo en el ejemplo. Existen algunos desarrollos con el API de Microsoft para poder subir archivos png, pero eso ya lo trataré en otro post.

Descarga el archivo de ejemplo pulsando en: INSERTAR FOTOGRAFÍA EN HOJA EXCEL EN UN CONTROL DE IMAGEN

 

Anuncios

40 pensamientos en “INSERTAR FOTOGRAFÍA EN CONTROL DE IMAGEN

  1. Hola José, es cierto. Por error he incluido en la programación archivos Png y Tiff, copiar y pegar … ( en breve modifico la entrada ). Este problema se debe a que en VBA el control load picture no soporta estos formatos. Solo se puede solucionar con el API de Microsoft y programación adicional. Las imágenes permitidas serían el resto. Gracias por avisar!!!

    Me gusta

  2. Hola, he estado tratando de hacer algo similar pero no encuentro nada relacionado, tengo una macro que inserta fotografías en un controlador de imágenes (Image1) en la “hoja1” de un directorio establecido y que lo único que cambia es el nombre del archivo, que se encuentra dentro de la “hoja1” en la celda “M1” (que llame [xCODIGO]), al ejecutar la macro desde la “hoja1” funciona perfectamente, incluso si cambio el valor de la celda M1 me inserta la imagen correcta, posteriormente cree otra hoja llamada “hoja2” con un valor distinto en la celda M1, quisiera ejecutar la macro en ambas hojas a la vez, y que me insertara la imagen que corresponde a cada hoja. en todas las hojas tengo el controlador de imagen llamado Image1 y el valor (nombre del archivo) se encuentra en la celda M1, quiero ejecutar la macro y que inserte las imágenes de acuerdo a su nombre (Celda M1). esta es la instrucción que uso, cuando la ejecuto desde la hoja activa funciona perfectamente, quisiera esa misma instrucción pero que se ejecutara en todo el libro, que me insertara la imagen que corresponda a la celda M1 ([xCODIGO]), ¿alguna idea?

    ActiveSheet.Image1.Picture = LoadPicture(ActiveWorkbook.Path & “\imágenes\” & “\Croquis\” & [xCODIGO].Text & “.jpg”)

    Gracias

    Me gusta

    • Hola Gabriel,

      Supongo que tienes el código en el modulo de la hoja. Para hacer que funcione en todo el libro debes utilizar el módulo “ThisWorkbook”
      y ahí debes escribir la siguiente macro:

      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      ActiveSheet.Image1.Picture = LoadPicture(ActiveWorkbook.Path & “ \ imágenes \ ” & “ \ Croquis \ ” & [xCODIGO].Text & “.jpg”)
      End Sub

      Suponiendo que el evento que active la macro sea un cambio en la celda.

      Espero haberte ayudado.

      Me gusta

        • De casualidad sabe, ¿como puedo comprimir una imagen que esta dentro de un controlador de imagen? inserte las imágenes como lo mencione anteriormente, sólo que las dimensiones del controlador de imagen son algo grandes y el archivo cuando tiene bastantes imágenes se vuelve pesado y difícil de trabajar.

          Muchas gracias

          Me gusta

          • Hola Gabriel,

            Lo mejor para estos casos es que realices la compresión de la imagen antes de subirla a Excel. De todas formas, si ya las tienes subidas e incrustadas en la hoja, con este proceso puedes cambiarlas todas al mismo tamaño: Esta macro cambia el tamaños de todas las imágenes de la primera hoja del archivo.

            Sub tamaño()
            Dim Shape As Excel.Shape
            i = 1
            For Each Shape In Sheets(1).Shapes
            With Sheets(1).Shapes(i)
            .Height = 50 'Alto
            .Width = 180 'Ancho
            End With
            i = i + 1
            Next
            End Sub

            Saludos.

            Me gusta

            • Muy amable por responder, lo que realice fue comprimir las imágenes antes de subirlas, pero, como el archivo lo utilizaremos varios, ¿existe una manera de “condicionar” que cuando se inserte una imagen mediante una macro esta se comprima? el tamaño ya lo ajusto, pero ¿que se comprima y las baje a calidad WEB 150 PPP? Muchas gracias

              Me gusta

              • Hola Gabriel,

                Puedes incluir esto en la macro, si la imagen excede los 150 píxeles, se mostrará el mensaje y la macro finalizará.
                Declara esta variable:
                Dim vSize As Integer

                y coloca este código justo después de” .Image1.Picture = LoadPicture(foto)”

                vSize = .Image1.Picture.Width
                If vSize > 3969 Then
                MsgBox ("EL TAMAÑO DE LA IMAGEN EXCEDE LOS 150 PPP, POR FAVOR REDUCE EL TAMAÑO")
                Exit Sub
                End If

                Saludos.

                Me gusta

    • Hola Marco,

      Exactamente, de qué forma quieres subir las imágenes?, seleccionándolas previamente una a una, mediante un bucle? Dónde las vas a cargar?

      Es necesario tener más información para poder responderte.

      Saludos.

      Me gusta

  3. Quisiera saber como lo puedo hacer para cuando, en el directorio “imágenes”, no encuentre la imagen y no deje pegada la anterior. si no que deje el control de imagen en blanco.

    Me gusta

    • Hola Sergio: Si te he entendido bien, quieres que cuanto NO se seleccione nada, el control quede vacío y no conserve la imagen anterior.

      Para hacer esto, incluye esta línea en esta parte de la macro: Sheets(1).Image1.Picture = Nothing

      Así:

      If foto = False Then
      Sheets(1).Image1.Picture = Nothing
      Exit Sub
      End If

      Saludos.

      Me gusta

      • Hola
        Excelentes ideas..!
        Me sirvieron para una cuestión de asistencias del personal que tengo en la Oficina.
        Una duda: Que el control, quede vacío cuando no hay imagen está bien… Pero no indica nada.
        Para un servidor sería mejor poner un aviso que diga por ejemplo: No hay imagen para este Item. O algo por el estilo.
        Me pueden ayudar a hacerlo con un mensaje en el control o en la celda donde esta ubicado el Control..?
        Muchas gracias…!

        Me gusta

        • Hola Francisco:

          No es posible realizar lo que solicitas. El problema es que estamos tratando con un control ActiveX y no es posible escribir sobre él, solo podemos incluir una imagen, cambiar el color y poco más. No se refiere a una celda, es un objeto.

          Podrías utilizar un msgbox y cada vez que ejecutes la macro, se muestre un mensaje indicando que el control está vacío, tipo:

          If foto = False Then
          Sheets(1).Image1.Picture = Nothing
          Msgbox(“No existe imagen”)
          Exit Sub
          End If

          Saludos.

          Me gusta

  4. Hola:
    Ante todo, agradecer su esfuerzo en ayudar a resolver nuestras dudas de esta gran aplicación que es Excel.
    Siguiendo este hilo, ¿podría capturar una foto tomada desde la cámara integrada o una webcam externa, desde Excel con VBA?. He buscado por Internet, pero es información antigua y creo que no funciona por las características de mi software (Windows 10, 64 bits y Office 365).
    Agradeciendo de antemano su interés , cordiales saludos.

    Me gusta

    • Muchas gracias Carlos:

      Pues no tengo ninguna aplicación relacionada con capturar la imagen de una web cam. Déjame que lo investigue y te contesto tan pronto como pueda.
      Saludos y gracias por comentar.

      Me gusta

  5. hola, ¿qué tal? de nuevo por aquí a molestarte un poco, de casualidad tienes un post en el que expliques como hacer esta tarea “Normalmente las imágenes se suelen insertar en los formularios para realizar programas, como por ejemplo, de almacén, donde la fotografía del artículo acompaña a la descripción del mismo. Además la imagen se suele almacenar en una carpeta o directorio desde el cual cuando el formulario se abra cargue la foto, de otra forma, si almacenásemos cientos imágenes en un archivo, pesaría demasiado y su gestión sería inviable.” Ando tratando de programar los reportes que te comenté en el post de combinar correspondencia, pero me ha quedado un poco grande lograrlo, de antemano gracias. Feliz día.

    Me gusta

  6. Buen dia, quisiera que me resolvieras una duda, la carga de imagenes desde la pc no tengo ningun problema funciona todo, el problema o duda es que las imagenes se almacenan desde cualquier lugar al picturebox y este almacena una direccion en la celda asignada. Lo que quiero es que al cargar esa imagen y guardar “este guardar me cambie la extension de esa imagen y me copie esa imagen a otra carpeta que este en mi proyecto” para que a la hora de realizar consultas no importa la maquina donde se encuentre siempre me dara las imagenes sin perder la ruta del proyecto.
    De antemano gracias

    Me gusta

  7. Hola buen día, me gustaría saber de qué forma puedo duplicar o reflejar la imagen del Imane1 a otro control Image2 en una hoja diferente, ya me funciona cargar la imagen pero me gustaría que se viera también en la hoja 3 que es donde finalmente imprimiré el formulario. Te agradezco de antemano.

    Me gusta

    • Hola Mauro:

      Tendrías que insertar el mismo control en la hoja 3 y luego modifica el código para que suba la imagen en las dos hojas al mismo tiempo, así:

      Sub INSERTA_FOTO()
      Dim foto As Variant
      ‘Abrimos directorio y buscamos solo archivos de imagen
      foto = Application.GetOpenFilename(FileFilter:= _
      “Imagen (*.gif;*.jpg;*.jpeg;*.bmp), *.gif;*.jpg;*.jpeg;*.bmp”, _
      Title:=”Seleccionar imagen”, MultiSelect:=False)
      ‘si no elegimos ninguna fotografía entonces salimos del proceso
      If foto = False Then
      Exit Sub
      End If
      ‘Si elegimos la foto pero antes ya teníamos otra, antes de insertar, borramos la anterior
      With Sheets(1)
      If Not IsEmpty(.Image1.Picture) Then
      .Image1.Picture = Nothing
      End If
      ‘luego subimos la foto.
      .Image1.Picture = LoadPicture(foto)
      Sheets(3).Image1.Picture = LoadPicture(foto)
      ‘ y le damos formato, en este caso Strech (justificamos la imagen)
      .Image1.PictureSizeMode = fmPictureSizeModeStretch
      Sheets(3).Image1.PictureSizeMode = fmPictureSizeModeStretch
      ‘ si deseamos dar formato al ancho y al alto, lo podemos hacer asi
      .Image1.Width = 120
      .Image1.Height = 120
      Sheets(3).Image1.Width = 120
      Sheets(3).Image1.Height = 120
      End With
      End Sub

      Saludos.

      Me gusta

  8. Buenos días,

    Estoy intentando acoplar esta macro a una hoja de control de ensayos que realizamos en mi empresa. Necesitan incorporar unas imágenes que sacan y guardan en el ordenador y luego de forma manual la introducen en el archivo de control, y quiero añadirles esta herramienta para facilitarles la labor de incluir dichas imágenes.
    El problema aparece cuando incluyo la macro en mi hoja de control, al ejecutarla me aparece un error que dice: “Se ha producido el error ‘438’ en tiempo de ejecución: El objeto no admite esta propiedad o método.”
    He probado la macro en una hoja en blanco de Excel y funciona correctamente, en cambio, en la que estoy trabajando no funciona ¿A que puede ser debido? Espero que puedas ayudarme.

    Un saludo y gracias,
    Erik

    Me gusta

    • Hola Erik:

      Tendría que ver la hoja en la que estás utilizando la macro. Debería funcionar correctamente. haz una copia del archivo y borra el contenido y envíame la hoja para verificar por qué te muestra ese error.

      Saludos.

      Me gusta

      • Muy buenas. Ya he conseguido que funcione la macro en mi hoja, el error básicamente estaba en la definición de la hoja a la que aplicaba la macro. Al ser una hoja con varias pestañas, era necesario definir a que hoja debía aplicarse, ya que, no quiero que esta influya en todo el archivo. Vamos, que una tontería.

        Un saludo y muchas gracias,
        Erik

        Me gusta

  9. De antemano muchas gracias, me ha servido mucho su ayuda en otro temas de macros, en verdad gracias a esta comunidad, aclaro soy nuevo en macros. Tengo una duda con respecto a las imágenes, bueno muchas, pero por lo pronto es una; tengo una Macro de un archivo de excel hecho en Mac con versión Excel 2011 y al trabajar en versión de 64 bits el código no funciona, es decir tu código o ejemplo trabaja bien en una PC con Windows 10 de 64 bits, pero al adaptarlo al archivo original que es un .xlsm que fue creado en Mac excel 2011 emite error de “No se ha definido Sub o Function” y hace referencia a LoadPicture … ¿Tiene solución?

    Me gusta

¿Te ha gustado?, Realiza un comentario.

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.