programador - combinar correspondencia

Combinación de correspondencia con archivos adjuntos

La utilización de Word y Outlook para combinar correspondencia es excelente, pero limitada cuando nos enfrentamos a un lista de, por ejemplo, 100 emails personalizados con 1 archivo diferente para cada destinatario… Por defecto, la combinación no se puede hacer, pero si trabajamos un poco, podremos preparar una macro que haga el trabajo por nosotros.

Necesitaremos un par de ingredientes:

  • MS Word 2007, 2010, 2013 o superiores
  • MS Outlook 2007, 2010, 2013 o superiores

 

Tiene varias limitaciones de formato, pero es un mal menor con el que tendremos que vivir… El tiempo que nos ahorraremos suplirá el inconveniente de no poder añadir una imagen de cabecera en el email, no?

Continuamos tras el salto, para no saturar la ventana principal…

PROGRAMAR PARA COMBINAR CORRESPONDENCIA

En primer lugar, vamos a tener que localizar la pestaña programador en Word (entra en este enlace si no la encuentras). En Opciones de Word…

programador - combinar correspondencia

Aceptamos, cerramos y ya vemos la ficha programador en la cinta de opciones… nos centramos en el primer bloque de opciones.

Le damos al botón de Macros, escogemos un nombre como “combina”,  y le damos a Crear.

combina - combinar correspondencia

Veremos ahora una ventana como esta…

macros combinar correspondencia

 

Macro para combinar correspondencia

Vamos a vaciarla y pegarle este código que tenemos aquí abajo (os marco en rojo la dirección de email, que deberéis cambiar por la vuestra para evitar posibles errores):

Sub combina()
Dim Source As Document, Maillist As Document, TempDoc As Document
Dim Datarange As Range
Dim i As Long, j As Long
Set objEmail = CreateObject("CDO.Message")
objEmail.from = "info@educadictos.com"
Dim bStarted As Boolean
Set oOutlookApp = CreateObject("Outlook.Application")
' Dim oItem As Outlook.MailItem
Dim mysubject As String, message As String, title As String
Set Source = ActiveDocument
' Check if Outlook is running. If it is not, start Outlook
On Error Resume Next
Set oOutlookApp = GetObject(, "Outlook.Application")
If Err <> 0 Then
Set oOutlookApp = CreateObject("Outlook.Application")
bStarted = True
End If
' Open the catalog mailmerge document
With Dialogs(wdDialogFileOpen)
.Show
End With
Set Maillist = ActiveDocument
' Show an input box asking the user for the subject to be inserted into the email messages
message = "Escribe el asunto que llevarán todos los emails" ' Set prompt.
title = " Email Subject Input" ' Set title.
' Display message, title
mysubject = InputBox(message, title)
' Iterate through the Sections of the Source document and the rows of the catalog mailmerge document,
' extracting the information to be included in each email.
For j = 1 To Source.Sections.Count - 1
Set oItem = oOutlookApp.CreateItem(olMailItem)
With oItem
.Subject = mysubject
.Body = Source.Sections(j).Range.Text
Set Datarange = Maillist.Tables(1).Cell(j, 1).Range
Datarange.End = Datarange.End - 1
.To = Datarange
For i = 2 To Maillist.Tables(1).Columns.Count
Set Datarange = Maillist.Tables(1).Cell(j, i).Range
Datarange.End = Datarange.End - 1
.Attachments.Add Trim(Datarange.Text), olByValue, 1
Next i
.Send
End With
Set oItem = Nothing
Next j
Maillist.Close wdDoNotSaveChanges
' Close Outlook if it was started by this macro.
If bStarted Then
oOutlookApp.Quit
End If
MsgBox Source.Sections.Count - 1 & " messages have been sent."
'Clean up
Set oOutlookApp = Nothing
End Sub

Una vez pegado… guardamos y cerramos.

Ahora para combinar correspondencia necesitaremos otros 2 archivos Word…

  • Documento 1: Cuerpo del email que queremos enviar, con el texto, nombres, etc… En resumen, el email que vamos a combinar. Supondré que ya sabes hacer combinación, así que no te diré nada más. Tú simplemente ten el email preparado para enviar sin adjuntos.
  • Documento 2: Otro word con una tabla de 2 columnas, una con el email del destinatario (que ha de coincidir con uno de los destinatarios del documento 1, lógicamente), y otra con la ruta en tu ordenador del documento que ha de recibir. Y una fila por cada destinatario… algo así:

 

tabla - combinar correspondencia

[alert]La tabla no lleva encabezados.[/alert]

Este Documento 2 lo guardaremos con un nombre reconocible, como “Tabla de adjuntos”, o similar. Y ahora viene lo bueno…

  1. En el Documento 1, ya escrito y con los campos de combinación cubiertos, le damos a  “Finalizar y combinar” y “Editar documentos individuales”.
  2. En el documento donde vemos el resultado de los emails, nos vamos a la pestaña Programador, le damos al botón de Macros, seleccionamos “Combina” y le damos a ejecutar.
  3. La macro nos pedirá que le indiquemos dónde está el Documento 2, así que lo llevamos hasta el nuestro y le damos a aceptar. (Este documento tiene que estar cerrado, o la macro dará error).
  4. Ahora nos pide que añadamos el asunto que llevarán los emails. Aceptamos y listo… Si no tenemos Outlook abierto, lo abrirá, y si ya lo tenemos abierto, irá enviando los emails con los adjuntos rápidamente hasta darnos el resultado de los envíos. Una vez termine, si Outlook estaba abierto, lo dejará abierto, y si estaba cerrado, lo cerrará.

Podéis hacer las pruebas para combinar correspondencia vosotros mismos, veréis que es una macro impresionante

Si queréis añadir más de 1 adjunto, en lugar de tener 2 columnas: destinatario/ruta de archivo, tenemos que tener 3: destinatario/ruta de archivo1/ruta de archivo2… Aunque esta opción no la he probado, prefiero añadirle un archivo único, que puede ser un ZIP con los documentos que vaya a recibir cada destinatario. Cuantas menos cosas puedan dar problema, mejor.

122 Comentarios

  • Una excelente aportacion me funciono de lo mejor !!! Si en algo les puedo apoyar pero algunos veo que no les funciono, vi unos comentarios que decia que se envio correo y no lo ven en enviados, eso significa que no se enviaron (me paso) pero a prueba y error me funciono al final : diferentes adjuntos a diferentes destinatarios tengo outlook 2007
    Saludos.

  • HOLA, TENGO OFFICE 2012 SALEN LOS CORREOS, PERO NO SE VAN LOS ARCHIVOS , LA RUTA ESTA EN RED, NO ES C, PROPIAMENTE Y ESTA EN VARIOS SUBACARPETA, EJEMPLO K:\AVISO\ETC, HAY ALGUN PROBLEMA, EL CORREO SALE SUPER BIEN

    • Yo también he tenido el mismo problema cuando el archivo esta colocado en una unidad de red. No he encontrado el motivo de este problema, pensaba que era por algún tipo de permisos. Pero la solución está en colocar el archivo en una carpeta situada en ordenador con el que se envía el correo, al menos de momento.
      Saludos.

  • Excelente la Macro, felicitaciones
    Tengo un consulta de pronto tenga una macro para que en una combinación de correspondencia, entre ord y excel, el cuerpo de texto, viaje como dato adjunto, es decir se refleje en el mail del destinatario solo el dato adjunto personalizado los datos extraidos de la base de datos(excel) muchas gracias

  • Excelente! Pero me tomo la libertad de añadirle una mejora, y es que, a mi por lo menos me interesa saber si el mensaje se ha recibido. Se le añade a la macro lo siguiente, justo después de la línea “objEmail.from = “micorreo@midominio.es””:

    With objEmail
    .Fields(“urn:schemas:mailheader:disposition-notification-to”) = _
    “micorreo@midominio.es”
    .Fields(“urn:schemas:mailheader:return-receipt-to”) = _
    “micorreo@midominio.es”
    .Fields.Update
    End With

    tal que donde pone”micorreo@midominio.es” se colocará la dirección de correo electrónico en particular de cada uno.
    Así sabremos si leen dicho correo. Saludos!

  • Hola amigos que alguien me ayude por fa, uso Office 2013, la combinación salió bien, los destinatarios recibieron correo personalizados, sin embargo, no me adjunta el archivo.

    Utilicé la ruta del escritorio para el adjunto, ¿es por eso?, ¿hay que modificar una instrucción de la macro o algo así?

    Ayúdenme amiguitos, Gracias 🙂

    • Hola otra vez, luego de múltiples intentos lo conseguí, se enviaron los correos personalizados y con su respectivo adjunto. Lo que hice fue modificar un poco una de las instrucciones :

      en la línea 44 dice:
      .Attachments.Add Trim(Datarange.Text), olByValue, 1

      y le modifiqué por:
      .Attachments.Add “C:\Prueba\imagen.jpg”

      Es decir :

      .Attachments.Add “ruta del archivo a adjuntar” .

      Sólo me queda el inconveniente de que se pierde el formato origen en el cuerpo del mail (negritas, cursivas, centrado, etc). Si alguien lo ha resuelto, por favor compártalo.

      Éxito con sus macros. Saludos 🙂

  • alguien puede ayudarme, mensaje que me da:
    ” se ha producido el error ´429´ en tiempo de ejecución:
    El componente ActiveX no puede crear el objeto “

    • En el código de la macro existe un problema. Sustituye el código referente al ciclo anidado por el siguiente. Observa que estoy comentando el ciclo interno y asignado el valor del camino del fichero antes de entrar a tal ciclo. Espero que esto te resuelva, a mi me funciono con este arreglo.
      For j = 1 To Source.Sections.Count – 1
      Set oItem = oOutlookApp.CreateItem(olMailItem)
      With oItem
      .Subject = mysubject
      .Body = Source.Sections(j).Range.Text
      Set Datarange = Maillist.Tables(1).Cell(j, 1).Range
      Datarange.End = Datarange.End – 1
      .To = Datarange.Text
      Set Datarange = Maillist.Tables(1).Cell(j, 2).Range
      Datarange.End = Datarange.End – 1
      .Attachments.Add Trim(Datarange.Text), olByValue, 1
      ‘ For i = 2 To Maillist.Tables(1).Columns.Count
      ‘ Set Datarange = Maillist.Tables(1).Cell(j, i).Range
      ‘ Datarange.End = Datarange.End – 1
      ‘ .Attachments.Add Trim(Datarange.Text), olByValue, 1
      ‘ Next i
      .Send
      End With
      Set oItem = Nothing
      Next j

  • Hola, hago todos los pasos en el codigo del macro solo cambio el correo electronico por el correo con el que tengo configurado el outlook 2013, ejecuto el macro y me sale un letrero de que fueron enviados tantos correos. pero al momento de consultar la bandeja de salida estos nuncan han salido, no aparecen en borradores. ni tampoco le llega al destinario. alguien me puede informar si al macro hay que cambiarle otra linea. los pasos que realice con word 2010 es la siguiente

    primero creo la tabla con el correo y la ruta completa donde esta el archivo de la persona.

    cierro ese
    abro un nuevo documento y creo el macro solo colocando mi correo

    cuarto paso creo un documento con lo que quiero que diga mi correo electronico

    hago una combinación de correspondencia con los documentos individuales con este archivo resulto ejecuto el macro

    en la ventana emergente selcciono el archivo con las rutas

    escribo el asunto

    y luego parece un letreo que dice se enviaron tantos correos de forma correcta.

    pero estos nuncan llegan a los destinatarios, ni aparecen en la bandeja de enviados o borradores.

    todo esto lo estoy haciendo con officie 2013

  • En el código de la macro existe un problema. Deben sustituir el código referente al ciclo anidado por el siguiente. Observar que estoy comentando el ciclo interno y asignado el valor del camino del fichero a adjuntar antes de entrar a tal ciclo. Espero que esto les resuelva, a mi me sucedia lo mismo y ya ahora funciona con este arreglo.
    For j = 1 To Source.Sections.Count – 1
    Set oItem = oOutlookApp.CreateItem(olMailItem)
    With oItem
    .Subject = mysubject
    .Body = Source.Sections(j).Range.Text
    Set Datarange = Maillist.Tables(1).Cell(j, 1).Range
    Datarange.End = Datarange.End – 1
    .To = Datarange.Text
    Set Datarange = Maillist.Tables(1).Cell(j, 2).Range
    Datarange.End = Datarange.End – 1
    .Attachments.Add Trim(Datarange.Text), olByValue, 1
    ‘ For i = 2 To Maillist.Tables(1).Columns.Count
    ‘ Set Datarange = Maillist.Tables(1).Cell(j, i).Range
    ‘ Datarange.End = Datarange.End – 1
    ‘ .Attachments.Add Trim(Datarange.Text), olByValue, 1
    ‘ Next i
    .Send
    End With
    Set oItem = Nothing
    Next j

    • Buenas tardes Carlos:
      He probado con tu código y se manda bien, lo único es que al recibirse se pierde el formato y el logo de empresa que tengo en el cuerpo del mensaje. Y ademas se manda mismo adjunto 2 veces. Lo he probado en la versión 2010. Me puedes ayudar?
      Gracias

    • UNA CONSULTA EN EL CRUCE DE CORRESPONDENCIA DEL CORREO DEBE SER MUY SENCILLO YA QUE SI INSERTO UNA IMAGEN O UNA TABLA ESTE NO LA RECONOCE.
      Muchas Gracias Por la colaboración

      • El proceso no afecta al documento que se envía, debe respetar imágenes u otros elementos insertados sin ningún problema.
        Saludos

    • Buenas tardes, yo creo que eso ya depende de como está configurado el Outlook. Es posible manejar eso en Opciones.

    • Buenos días,
      si cambias .Sent por .Display te aparecerá en la pantalla todos los correos con el texto y los datos adjuntos y no se enviarán. Es muy útil si quieres revisarlos o hacer cambios previo a enviarlos.

  • Excelente post, me ha salvado de más de una… Pero ahora necesito que al enviarse el correo no se pierda el formato del mensaje (Negritas, cursivas y esas cosas) … alguien ha logrado solucionarlo?? me podrían indicar el paso a paso por favor!
    Gracias!!!

  • Hola no lo he probado, pero y si lo que quiero ademas de enviar varios adjuntos es enviar el mismo email ya combinado, con un excel que contenga mas de un email por cada nombre? Es posible? O incluso , cuando realice la combinación se puede además si tengo un excel con las facturas de clientes, una fila por cada factura que las agrupe.?

    • El tutorial os marca como combinar correspondencia, pero existen muchas problemáticas diferentes, para el caso de diferentes mails te recomiendo generar varios registros para cada mail. En el caso de las facturas serán archivos diferentes por lo que no te sirve este proceso.

  • Hola, tu macro funciona de maravilla. Lo he utilizado para mandar el reporte de calificaciones de alumnos. Pero ahora me piden que le llegue también ese correo a su titular, Como se le puede hacer?
    Muchas gracias.

  • solo me envia 9 correos y de ahi nada tengo que volver a ejecutar
    hay algun comando que deba modificar
    tengo una lista de 400 correos cada uno con su adjunto

  • Buenas tardes Lo logré tabién y queda perfecto con todo el formato que quieras y con todos los adjuntos que quieras, lo hice gracias a los comentarios de Mikel y Johan, primero Mikel con lo de cambiar .Body por .HTMLBody y luego Johan diciendo que debemos cambiar todo lo que queramos que vaya en el cuerpo del correo, lo que yo agregaría es que para hacer esto, se puede hacer muy facil en esta página que sirve para convertir todo a HTML, es decir, después de que tienes todo en word con el formato que tu quieres (color de letra, negritas, cursivas, fotos, firma, etc) lo copias todo y lo pegas en https://wordtohtml.net/ Esta página te regresa un código completo, lo copias todo y lo sustituyes por todo lo que hay en la hoja de word

    • Buenas tardes Marcos, podrías por favor aclarar un poco más el tema de la conversión del word al formato HTML por favor.
      Se traduce en la página y se pega en la hoja de word o en el módulo de la macro?

  • Buenas tardes Marcos, podrías por favor aclarar un poco más el tema de la conversión del word al formato HTML por favor.
    Se traduce en la página y se pega en la hoja de word o en el módulo de la macro?

  • Hola, no me funciona al final el mensaje dice que envio 0 correos, alguen me podria ayudar de favor :(, tengo una urgencia de enviar 300 mails con dos archivos adjuntos.

Deja un comentario

Tu dirección de correo electrónico no será publicada.