Macros para enviar tablas de Excel como imágenes al cuerpo de un correo

Comunicarse a distancia, y en especial en estos tiempos, suele tener sus desventajas por cada cosa buena que presenta. Por ejemplo, tener que enviar un correo electrónico a muchas personas y tener que agregar tablas para presentar cierta información. Ahí la cosa se complica un poco, pero para estos casos podemos hacer uso de macros para poder hacer los correos bastante más presentables y cómodos de leer.

Aquí abajo te muestro el código de cómo puedes conseguir este efecto, pero primero recuerda que antes de correr un macro que hace uso de Outlook debes activar la librería en VBA.

El código

Para que esto funcione, introduce este código en un nuevo módulo:

Sub Mail_small_Text_And_JPG_Range_Outlook()
Dim OutApp As Object 
Dim outMail As Object 
Dim strbody As String 
Dim MakeJPG As String 
Dim PictureRange As Range 
Dim outPA As Outlook.PropertyAccessor 
Dim colAttach As Outlook.Attachments 
Dim outAttach As Outlook.Attachment

 With Application 
    .EnableEvents = False 
    .ScreenUpdating = False 
End With 

'Para evitar temas de seguridad, activamos el tag de propagacion de microsoft
Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"

Set OutApp = CreateObject("Outlook.Application") 
Set OutMail = OutApp.CreateItem(0) 
strbody = "Hola a todos" & "<br><br>" & _ 
    "Adjunto pueden encontrar la informacion de las tablas" & "<br>" & _ 
    "Quedo al pendiente para cualquier aclaracion." & "<br><br>" & _ 
    "Saludos! S<br>"

'Aqui creas una imagen JPG desde un rango de Excel 
    With ActiveWorkbook 
    On Error Resume Next 
    .Worksheets(1).Activate 
    Set PictureRange = .Worksheets(1).Range("A1:H20") 
    PictureRange.CopyPicture 
    With .Worksheets(1).ChartObjects.Add(PictureRange.Left, PictureRange.Top, PictureRange.Width, PictureRange.Height) 
        .Activate 
        .Chart.Paste 
        .Chart.Export Environ$("temp") & Application.PathSeparator & "NamePicture.jpg", "JPG" 
    End With     
.Worksheets(1).ChartObjects(.Worksheets(1).ChartObjects.Count).Delete 
End With 
MakeJPG = Environ$("temp") & Application.PathSeparator & "NamePicture.jpg" 
Set PictureRange = Nothing

'Paso para crear la imagen sin adjuntar el archivo, manipulamos las propiedades del correo
Set colAttach = outMail.Attachments
Set outAttach = colAttach.Add(MakeJPG)
Set outPA = outAttach.PropertyAccessor
outPA.SetProperty PR_ATTACH_CONTENT_ID, "NamePicture.jpg" '<------- aqui va el nombre de tu imagen

On Error Resume Next 
With OutMail 
    .To = "something@somewhere.mx" 
    .CC = "" 
    .BCC = "" 
    .Subject = "Faltas por empleado" 
    .HTMLBody = "<Body>" & strbody & "<img src=""cid:NamePicture.jpg"" width=750 height=700></Body>" 
    .Display 
End With 
On Error GoTo 0 
With Application 
    .EnableEvents = True 
    .ScreenUpdating = True 
End With 
Set OutMail = Nothing 
Set OutApp = Nothing
 End Sub

Ahora bien, estas son las cosas que tendrás que necesitas saber para poder ajustar este macro a tus preferencias:

Crear la imágen por medio de un rango, el cual se consigue con estas líneas:

Set PictureRange = .Worksheets(1).Range("A1:H50")     PictureRange.CopyPicture 
        With .Worksheets(1).ChartObjects.Add(PictureRange.Left, PictureRange.Top, PictureRange.Width, PictureRange.Height) 
        .Activate 
        .Chart.Paste 
        .Chart.Export Environ$("temp") & Application.PathSeparator & "NamePicture.jpg", "JPG"

Cambiando los valores que están en el rango y la hoja para que se ajusten a lo que deseas enviar, puedes tomar cualquier tabla en tu libro de trabajo y convertirtla en una imágen temporal que será borrada en cuanto apagues la computadora.

El cuerpo HTML

.HTMLBody = "<Body>" & strbody & "<img src=""cid:NamePicture.jpg"" width=750 height=700></Body>"

Es importante usar siempre el cuerpo HTML en este macro, de otro modo no podremos insertar imágenes. Si te interesa saber cómo se puede modificar y qué parámetros se pueden usar, en este link encontrarás información.

El código para tomar la imagen

<img src=""cid:NamePicture.jpg"" width=750 height=700></html>"

Esta es la línea que se encarga de insertar la imagen en el correo, por lo cual puedes ponerla en cualquier parte del Body para que salga al inicio, al final o en medio dependiendo de dónde la prefieras. Por ejemplo, si quisiera que la imagen estuviera al final, quedaría así:

"<html><p>" & "Hola a todos" & "<br><br>" & _ 
      "Adjunto puedes encontrar una table con los datos presentados." & "<br>" & _ 
      "Cualquier duda quedo a la orden." & "<br><br>" & _ 
      "S.<br>"    "</p><img src=""cid:NamePicture.jpg"" width=750 height=700></html>"

Y si quisiera que quedara en medio, tendría que quedar así:

"<Body>" & "Hola a todos" & "<br><br>" & _ 
      "Adjunto puedes encontrar una table con los datos presentados." & "<br>" & _ 
      <img src=""cid:NamePicture.jpg"" width=750 height=700>" & "<br>" _ 
      & "Cualquier duda quedo a la orden." & "<br><br>" & _ 
      "S.<br><Body>”

Muestra mejor presentación en tus correos electrónicos con tablas de Excel y automatiza tus actividades con macros para simplificar tus tareas.

Cualquier duda nos leemos abajo.

Macros para enviar tablas de Excel como imágenes al cuerpo de un correo

15 comentarios en «Macros para enviar tablas de Excel como imágenes al cuerpo de un correo»

  1. Estimado, me podrias ayudar por favor?

    Set PictureRange = .Worksheets(1).Range(«C3:F5») PictureRange.CopyPicture

    en esta linea me indica:

    Error de Compilacion Se esperaba: Fin de la instruccion

  2. Hola… excelente el código, me funcionó a la perfección, solo le hice unos cambios para que fuera de acuerdo con mis necesidades, pero hace una semana (luego de meses de uso) me regresa un correo de error, qué podrá ser?

    Error:
    Diagnostic information for administrators:
    Generating server: *******.******.prod.outlook.com
    ……@ddd.com
    Remote Server returned ‘554 5.6.0 STOREDRV.Submit.Exception:CorruptDataException; Failed to process message due to a permanent exception with message [BeginDiagnosticData]Store ID ‘************’ with type ‘Folder’ isn’t an ID of a folder, item or mailbox. CorruptDataException: Store ID ‘************’ with type ‘Folder’ isn’t an ID of a folder, item or mailbox.[EndDiagnosticData]’

  3. Hola
    Me indica «Error de compilación: No se ha definido el tipo definido por el usuario»
    Sombreando: Dim outPA As Outlook.PropertyAccessor

    ¿Por qué puede ser?

  4. hola AngeldeOdin,
    Este codigo es exactamente lo que estaba buscando para realizar mis envios de mails automaticos, pero me ocurre un problema y es que al enviar el mail, la imagen aparece en blanco y outlook me dice que no es posible encontrarla.
    me podrias ayudar porfavor?

    1. Hola Omar.
      1. ¿Cambiaste algúna parte de la macro?
      2. ¿Cuando hace display al correo puedes ver la imágen sin problemas?
      3. ¿Si te lo envías a ti mismo ocurre el mismo problema?

      Con todo gusto te ayudo, pero necesito mas detalles para hacerlo mejor jeje.
      Si gustas respondeme a svallejo@excelcute.com
      Saludos.

  5. Hola Angel!
    Adapte tu codigo a mis necesidades, pero al momento de adjuntar la imagen la adjunta con el siguiente mensaje «the linked image cannot be displayed»
    Me podrías ayudar?

    1. ¡Hola Mony!
      Claro que te puedo ayudar :D. Si gustas escríbeme a svallejo@excelcute.com para checar el código adaptado.
      Adelantándome un poco, estas dos líneas son casi mandatarias, por lo que hay que tener cuidado con ellas:


      ' MakeJPG = Environ$("temp") & Application.PathSeparator & "NamePicture.jpg"
      ' .Attachments.Add MakeJPG, 1, 0

      Saludos!

  6. Hola, se podría mejorar la calidad de la imágen que se pega en el cuerpo del mail… es como que baja un poco la calidad

    saludos

  7. Hola.

    Este código es justo lo que necesitaba, muchas gracias. El problema es que, al pegarlo en un módulo me dice que hay dos líneas erróneas (las marca de color rojo):

    End With .Worksheets(1).ChartObjects(.Worksheets(1).ChartObjects.Count).Delete
    MakeJPG = Environ$(«temp») & Application.PathSeparator & «NamePicture.jpg» Set PictureRange = Nothing

    ¿Podrías ayudarme?

    Muchas gracias!

    1. ¡Hola Albert! Me da gusto saber que te sirvió.
      Al parecer el blog decidió que era una buena idea poner algunas líneas juntas >:O
      Solo hay que darle un par de enters. En la entrada ya esta corregido el código.
      Espero se corrija, y si no escríbeme a svallejo@excelcute.com para revisarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll hacia arriba