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.

13 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