viernes, 22 de junio de 2012

VBA: Exportar una imagen desde Excel.

En un reciente comentario, un lector preguntaba por la forma de guardar o exportar una imagen insertada previamente en nuestra Hoja de cálculo de Excel hacia un archivo en nuestro equipo.
El asunto no es sencillo de aplicar, ya que no existe una instrucción directa que permita guardar o exportar de alguna manera una imagen a un archivo en nuestro PC; sin embargo, una solución válida consiste en incluir nuestras imágenes a exportar dentro de un objeto Gráfico; puesto que estos objetos si son exportables fácilmente con la instrucción chart.Export.


Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub ExportarImagen()
Dim img As Shape

Application.ScreenUpdating = False
For Each img In ActiveSheet.Shapes
'añadimos un gráfico
Charts.Add
'lo situamos como objeto en la Hoja 3
ActiveChart.Location Where:=xlLocationAsObject, Name:="Hoja1"
Set chrt = ActiveSheet.ChartObjects(1)

    nombreimg = img.Name
    'adaptamos tamaño de imagen y gráfico
    With img
    chrt.Width = .Width
    chrt.Height = .Height
    'copiamos la imagen
    .Copy
    End With
    'pegamos dentro del gráfico la imegen
    ActiveChart.Paste
    'exportamos el gráfico con el nombre del objeto (imagen)
    chrt.Chart.Export Filename:="C:\" & nombreimg & ".gif"
chrt.Delete
Next img

Application.ScreenUpdating = True
End Sub


Observamos que la macro recorre todas las formas/objetos de la hoja de Excel activa, y para cada imagen creamos un nuevo gráfico que inmediatamente localizamos como objeto (no como Nueva Hoja), para inmediatamente adecuar el tamaño del gráfico al de la imagen; finalmente copiamos la imagen y la pegamos en el gráfico activo recién creado.
Sólo nos queda seleccionar este gráfico y exportarlo con el nombre que tuviera definida la imagen. Para terminar eliminamos el gráfico y no dejar rastro del trabajo que hemos realizado.

19 comentarios:

  1. Muy ingenioso, funciona bien. Gracias por compartirlo!

    ResponderEliminar
  2. Excelente, funciona perfecto. Gracias

    ResponderEliminar
  3. hola que tal, tengo un problema donde mi aplicación tiene una imagen en la pantalla de inicio donde esta imagen se cambia por un usuario cuando lo desee, esta aplicación la pienso pasar a varias personas el problema es que la imagen la guardo en una hoja de excel como la puedo tomar de ahí para mostrarla en un control image.

    Viendo este blog se me ocurrio este metodo donde se exporta la imagen y la cargo en el image control, pero tengo un proble de como exportar un objeto imagen?

    saludos

    ResponderEliminar
    Respuestas
    1. Hola Daniel,
      pues sólo conozco esta forma de exportar imágenes desde Excel... hasta donde yo sé, no existe una manera de hacerlo directamente.

      Lo siento.

      Un cordial saludo y suerte!!

      Eliminar
  4. Buen días tengo un problema, al correr la macro me sale error 70 permiso denegado. ¿Que debo hacer? Gracias de antemano =)

    ResponderEliminar
    Respuestas
    1. Hola Racudu,
      asegúrate existe la hoja y un gráfico en ella...
      Este es un código muy simple que no necesita nada, excepto insertar el procedimiento en el proyecto de VBA.

      Saludos

      Eliminar
  5. Hermano... pues felicitaciones, no sabes cuanto tiempo llevaba buscando esto... Es ud un señor ninja. jajjajajaa. Gracias miles

    ResponderEliminar
  6. Hola Amigos!!

    Como puedo hacer para que cada imagen se guarde con la celda adyacente?
    Por ejemplo, tengo imágenes desde A2 hacia abajo y necesito guardar cada imagen con el nombre de esa imagen
    que se encuentra en B2 respectivamente.

    Por favor!!!

    ResponderEliminar
    Respuestas
    1. Hola,
      la idea la tienes en este mismo post...
      Emplea para cada imagen (usa un loop del tipo FOR...NEXT):
      .Export Filename:="C:\" & nombreimg & ".gif"
      y por la variable 'nombreimg' toma el nombre del objeto imagen sobre el que estar operando

      Espero haberte orientado
      Saludos

      Eliminar
  7. Creo que es de esta forma:

    Donde aparece nombreimg = img.Name
    Reemplazar por nombreimg = img.TopLeftCell.Offset(, 1)

    Saludos!!!

    ResponderEliminar
  8. Estimado Ismael, el siguiente codigo me servía a la perfección hasta windows 7, ahora con el windows vista la imagen que se exporta va en blanco

    de antemano gracias

    Sub exportar()
    Sheets("tablero").Select
    Dim Izq As Single, Arr As Single, Ancho As Single, Alto As Single
    Application.DisplayAlerts = False
    With Range("a1:y45")
    Izq = .Left: Arr = .Top: Ancho = .Width: Alto = .Height: .CopyPicture
    End With
    With ActiveSheet.ChartObjects.Add(Izq, Arr, Ancho, Alto)
    .Chart.Paste
    .Chart.Export "\\**ruta**\imagen1.png"
    .Delete
    End With
    Application.DisplayAlerts = True
    End Sub

    ResponderEliminar
  9. perdon, ahora con el windows 10 es el problema**

    ResponderEliminar
    Respuestas
    1. Hola Eduardo,
      no podría decirte la incompatibilidad con W10...
      quizá alguna actualización, alguna librería afectó algo del paquete office (pasa más a menudo de lo que nos gustaría)...
      De hecho, yo personalmente sigo empleando W7, después de ver todos los problemas que generaba la última versión de Windows.

      A priori no se ve nada raro en el código que adjuntas...
      Si acaso revisa la ruta de la exportación

      Siento no poder decirte nada más
      Un saludo y suerte (comparte si consigues solucionarlo)

      Eliminar
    2. gracias Ismael... si logro solucionarlo con gusto lo comparto. Un saludo!

      Eliminar
  10. Hola, me funciona perfecto con mi WinXP y Off2007, pero siempre exporta con el (1) y lo he cambiado al nombre de la imagen que SOLO QUIERO exportar (tengo varias imagenes en mi sheet). Hay algun ajuste? (Las imagenes ya tienen nombre....)

    ResponderEliminar
    Respuestas
    1. Hola roberto,
      si sabes el nombre del gráfico, puedes emplearlo

      .ChartObjects("NombreGafico")...

      no hace falta emplear el índice de ese gráfico

      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.