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

24 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

  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

¿Te ha gustado?. Deja 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 )

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 )

Google+ photo

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

Conectando a %s