AutomatiseOffice
VBAOUTLOOKEXCEL

Macro de envío de correo Excel Outlook en 4 niveles de dificultad

·9 min de lectura

Introducción

4 niveles para crear una macro de envío de correo Excel Outlook. Automatizar el envío de correo desde Excel.

1. Nivel principiante - usa esta macro simple para enviar un correo Outlook desde Excel

¿Quieres poder enviar automáticamente un correo Outlook desde Excel? Sigue el código súper simple a continuación:

Sub envoi_mail_debutant()

Dim OutApp As Object 'Declaración del objeto aplicación Outlook
Dim OutMail As Object 'Declaración del objeto correo Outlook

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

With OutMail
    .To = "contact@sap-automation.com"
    .CC = "contact@sap-automation.com; youremailadress@gmail.com" 'direcciones en copia
    .BCC = Worksheets("mail").Range("B3") 'busca el valor en la celda B1 de la
                                          'hoja "mail" // direcciones en copia oculta

    .Subject = "Mail" & " a " & Date & " " & Time
              'separa dos valores con un &
              'el texto escrito 'en duro' siempre debe estar rodeado de ""
              'Date & Time son funciones que devuelven la fecha/hora de creación del correo

    .Body = "Este es un mensaje de prueba" & vbCrLf & "salto de línea"
            'añade & vbCrLf & para ir a la línea entre dos valores

    .Attachments.Add ActiveWorkbook.FullName 'Añade el libro activo como archivo adjunto
    '.Attachments.Add "C:\MiCarpeta\MiArchivo.xlsx"
    'Añade un archivo adjunto a tu correo, indica la ruta completa hacia el archivo que quieres
    'adjuntar

    .Display 'muestra el correo como borrador en Outlook
    '.Send 'envía directamente el correo
    '.Save 'guarda el correo

End With

Set OutMail = Nothing 'limpia la memoria limpiando las variables
Set OutApp = Nothing

End sub

2. Nivel Intermedio - formatea el correo (negrita, subrayado, cursiva, colores, saltos) con HTML simple

Gracias a HTML, puedes fácilmente:

  • Dar formato al texto de tu correo
  • Poner tu texto en cursiva, negrita, subrayado, en rojo, etc.
  • Para más opciones de formateo de texto HTML, consulta este sitio - ¡las posibilidades son inmensas!
Sub envoi_mail_intermediaire()

    ' Declara los objetos aplicación y elemento de mensajería Outlook
    Dim OutApp As Object
    Dim OutMail As Object

    ' Crea una nueva instancia de la aplicación Outlook
    Set OutApp = CreateObject("Outlook.Application")
    ' Crea un nuevo elemento de mensajería
    Set OutMail = OutApp.CreateItem(0)

    ' Con el elemento de mensajería
    With OutMail
        ' Define la dirección de correo del destinatario
        .To = "contact@sap-automation.com"
        ' Muestra el correo
        .Display
        ' Define el asunto del correo para incluir la fecha y hora actuales
        .Subject = "Informe del: " & Date & " " & Time
        ' Define el cuerpo HTML del correo
        .HTMLBody = "Esto es una prueba" & "<br><br>" & _
                    "Este es un texto después de un salto de línea " & "<br>" & _
                    "Este es un texto en la línea" & "<br>" & _
                    "<b> este es un texto en negrita </b> " & "<br>" & _
                    "<u> este es un texto subrayado </u> " & "<br>" & _
                    "<b><u> este es un texto en negrita y subrayado </u></b> " & "<br>" & _
                    "<i> este es un texto en cursiva </i> " & "<br>" & _
                    "<FONT COLOR=RED> este es un texto en rojo </FONT>" & "<br>" & _
                    .HTMLBody

    ' Fin de la instrucción With
    End With

    ' Libera los objetos elemento de mensajería y aplicación Outlook
    Set OutMail = Nothing
    Set OutApp = Nothing

End sub

3. Nivel Avanzado - Correo Outlook con rango de datos Excel en el cuerpo del correo usando una función

Usando una función (muy simple), puedes integrar una tabla o una serie de datos en el cuerpo de tu correo.

Sub envoi_mail_avance()

Dim OutApp As Object
Dim OutMail As Object
Dim plage_mail As Range 'Declara un rango de celdas para el correo

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

Set plage_mail = ThisWorkbook.Sheets("mail").Range("A1").CurrentRegion 'Define el rango de celdas para el correo

    With OutMail
        .To = "contact@sap-automation.com"
        .Display 'muestra el correo como borrador en Outlook
        '.Send 'envía directamente el correo
        '.Save 'guarda el correo
        .Subject = "Informe del: " & Date & " " & Time
        .HTMLBody = "Por favor encuentre el informe a continuación," & "<br><br>" & _
                    RangetoHTML(plage_mail) & "<br><br>" & _
                    .HTMLBody 'Define el cuerpo del correo en HTML
    End With

Set OutMail = Nothing 'Libera el objeto correo
Set OutApp = Nothing 'Libera el objeto aplicación Outlook

End sub

Para que esta macro funcione, debes añadir la función a continuación en el mismo módulo:

Public Function RangetoHTML(rng_mail As Range)
    Dim fso As Object 'Declara el objeto sistema de archivos
    Dim ts As Object 'Declara el objeto flujo de texto
    Dim TempFile As String 'Declara la variable de cadena para el archivo temporal
    Dim TempWB As Workbook 'Declara el libro temporal

    TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    'Define la ruta del archivo temporal

    'Copia el rango y crea un nuevo libro para pegar los datos
    rng_mail.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
        .Cells(1).PasteSpecial Paste:=8
        .Cells(1).PasteSpecial xlPasteValues, , False, False
        .Cells(1).PasteSpecial xlPasteFormats, , False, False
        .Cells(1).Select
        Excel.Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        On Error GoTo 0
    End With

    'Publica la hoja en un archivo htm
    With TempWB.PublishObjects.Add( _
        SourceType:=xlSourceRange, _
        Filename:=TempFile, _
        Sheet:=TempWB.Sheets(1).Name, _
        Source:=TempWB.Sheets(1).UsedRange.Address, _
        HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With

    'Lee todos los datos del archivo htm en RangetoHTML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    'Cierra TempWB
    TempWB.Close savechanges:=False

    'Elimina el archivo htm utilizado en esta función
    Kill TempFile

    Set ts = Nothing 'Limpia el objeto flujo de texto
    Set fso = Nothing 'Limpia el objeto sistema de archivos
    Set TempWB = Nothing 'Limpia el libro temporal

End Function

4. Nivel Avanzado 2 - Correo Outlook con gráfico como archivo adjunto

Añade un gráfico como archivo adjunto al correo Outlook.

Sub envoi_mail_graphique()

Dim OutApp As Object 'Declara el objeto aplicación Outlook
Dim OutMail As Object 'Declara el objeto correo Outlook
Dim xChartName As String 'Declara una variable de cadena para contener el nombre del gráfico
Dim xChartPath As String 'Declara una variable de cadena para contener la ruta del gráfico
Dim xPath As String 'Declara una variable de cadena para contener la ruta
Dim xChart As ChartObject 'Declara una variable ChartObject para contener el objeto gráfico

On Error Resume Next 'Ignora cualquier error y continúa la ejecución

xChartName = "chart" 'Asigna el nombre del gráfico
If xChartName = "" Then Exit Sub 'Sale de la subrutina si el nombre del gráfico está vacío
Set xChart = ThisWorkbook.Sheets("graph").ChartObjects(xChartName) 'Define el objeto gráfico en el gráfico especificado de la hoja "graph"

If xChart Is Nothing Then Exit Sub 'Sale de la subrutina si el objeto gráfico no está definido
Set OutApp = CreateObject("Outlook.Application") 'Crea una nueva instancia de Outlook
Set OutMail = OutApp.CreateItem(0) 'Crea un nuevo elemento de mensajería

xChartPath = ThisWorkbook.Path & "\" & Environ("USERNAME") & VBA.Format(VBA.Now(), "DD_MM_YY_HH_MM_SS") & ".bmp" 'Define la ruta del gráfico con la ruta del libro actual, el nombre de usuario y la fecha/hora actuales
xChart.Chart.Export xChartPath 'Exporta el gráfico a la ruta especificada

With OutMail
    .To = "contact@sap-automation.com" 'Define el destinatario del correo
    .Subject = "Informe de gráfico del: " & Date & " " & Time 'Define el asunto del correo
    .Attachments.Add xChartPath 'Añade el gráfico exportado como adjunto
    .HTMLBody = "Por favor encuentre el gráfico adjunto." & "<br><br>" & _
                .HTMLBody 'Define el cuerpo del correo
    .Display 'Muestra el correo
End With

Kill xChartPath 'Elimina el archivo temporal del gráfico
Set OutMail = Nothing 'Limpieza
Set OutApp = Nothing 'Limpieza

End Sub

5. Nivel Experto - Correo Outlook con tabla y gráfico en el cuerpo del correo

Añade una tabla y un gráfico en el cuerpo del correo Outlook.

Sub envoi_mail_expert()

Dim OutlookApp As Object 'Declara el objeto aplicación Outlook
Dim OutlookMail As Object 'Declara el objeto correo Outlook
Dim consolidationSheet As Worksheet 'Declara el objeto para la hoja de consolidación
Dim chartObject As chartObject 'Declara el objeto gráfico
Dim tableRange As Range 'Declara el objeto de rango para la tabla
Dim chartFilePath As String 'Declara la variable de cadena para la ruta del archivo gráfico
Dim tableHTML As String 'Declara la variable de cadena para el HTML de la tabla

'Define la hoja de consolidación
Set consolidationSheet = ThisWorkbook.Worksheets("CONSOLIDATION")
Set chartObject = consolidationSheet.ChartObjects("chart_example") 'Define el objeto gráfico
'Define el rango de la tabla
Set tableRange = consolidationSheet.ListObjects("CONSOLIDATION").Range

'Guarda la imagen del gráfico como archivo temporal
chartFilePath = Environ$("temp") & "\chart.jpg"
chartObject.Chart.Export chartFilePath, "JPG"

tableHTML = ConvertRangeToHTML(tableRange) 'Convierte el rango de la tabla a HTML

Set OutlookApp = CreateObject("Outlook.Application") 'Crea un nuevo correo Outlook
Set OutlookMail = OutlookApp.CreateItem(0)

With OutlookMail
    .To = "contact@sap-automation.com"
    .Subject = "Informe de consolidación del: " & Date & " " & Time
    .HTMLBody = .HTMLBody & "<p>Hola, por favor encuentre a continuación la tabla y el gráfico del día:</p>"
    .HTMLBody = .HTMLBody & "<table border='1' cellpadding='5' style='border-collapse: collapse;'>"
    .HTMLBody = .HTMLBody & tableHTML
    .HTMLBody = .HTMLBody & "</table>"
    .HTMLBody = .HTMLBody & "<br><img src='cid:chart' width='600' height='400'>"
    .HTMLBody = .HTMLBody & "</body></html>"

    'Adjunta la imagen del gráfico como imagen integrada
    .Attachments.Add chartFilePath, 1, 0, "chart.jpg"
    .Attachments("chart.jpg").PropertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x3712001F", "chart"
    .Display 'Muestra el correo (cambia a .Send para enviar sin mostrar)
End With

Kill chartFilePath 'Elimina el archivo temporal
Set OutlookMail = Nothing 'Limpieza
Set OutlookApp = Nothing 'Limpieza

End Sub

Para que esta macro funcione, debes añadir la función a continuación en el mismo módulo:

Function ConvertRangeToHTML(rng As Range) As String

    Dim htmlTable As String 'Declara la variable de cadena para la tabla HTML
    Dim row As Range 'Declara el objeto de rango para la fila
    Dim cell As Range 'Declara el objeto de rango para la celda

    'Inicio de la tabla HTML
    htmlTable = "<thead><tr>"
    For Each cell In rng.Rows(1).Cells
        htmlTable = htmlTable & "<th>" & cell.Value & "</th>" 'Añade cada celda de la primera fila al encabezado de la tabla
    Next cell
    htmlTable = htmlTable & "</tr></thead><tbody>"

    'Añade las filas y celdas a la tabla
    For Each row In rng.Rows
        If row.row <> rng.Rows(1).row Then
            htmlTable = htmlTable & "<tr>"
            For Each cell In row.Cells
                htmlTable = htmlTable & "<td>" & cell.Value & "</td>"
            Next cell
            htmlTable = htmlTable & "</tr>"
        End If
    Next row

    htmlTable = htmlTable & "</tbody>"

    ConvertRangeToHTML = htmlTable

End Function

Artículos relacionados

Conectar SAP y Excel en 4 pasos simples
SAPEXCELVBA

Conectar SAP y Excel en 4 pasos simples

Aprende a establecer una conexión entre SAP GUI y Excel para automatizar tus exportaciones de datos. Guía paso a paso con la API SAP GUI Scripting.

¿Quieres ir más lejos?