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.

144 Comentarios

  • Marcos, me funciona super, excelente dato! me funciona perfecto si debo crear un correo igual para todos los destinatarios, pero cómo lo puedo hacer si debo usar combinación de campos, para por ejemplo, cambiar los nombres de los destinatarios en el saludo y mantener el formato de texto?

    • Pones todo lo que quieras que lleve tu correo incluyendo Texto, imagenes, links, colores, etc, luego cortar todo, pegarlo en la página qe convierte Word a HTML (https://wordtohtml.net/), copiar todo el código HTML y pegarlo en la hoja de word, despues haces la combinación de correspondencia buscando en el código lo que quieres sustituir en cada correo (ejemplo los nombres, apellidos, saludo, etc) sigues todos los pasos normales, la combinación se hace ya que tienes el código en el word pegado

      Saludos.

  • Hola, al copiar los emails para crear la tabla no cambian de color, no quedan como hipervinculos. Sera por esto que al ejecutar la macro me dice que no envia ningun email ?

  • Buenos días:
    La macro da el siguiente error:

    Se ha producido el error ‘-214722164 (80040154)’ en tiempo de ejecución:
    Clase no registrada

    ¿Alguien sabe a qué se debe? Gracias

  • Buenos dias,
    La macro funciona excelente pero me gustaría saber si se puede dar un pasito más. Yo tengo varios posibles remitentes de correo dentro de mi outlook, listas de correo a las que pertenezco desde las que puedo remitir. me gustaría que una de estas correspondencias se hiciera desde uno de esos remitente. he probado a ponerlo en la líena de la macro que pone objEmail.from = “info@educadictos.com” pero no me ha funcionado.
    Muchas gracias de antemano.
    un saludo

  • Excelente, gracias me ayudo mucho,pero no envía a ningún correo de gmail, sabes como hacer para que también envié a correos de gmail???

  • Hola!

    Me va estupendamente pero os voy a dejar unos cuantos tips porque ayer me estuve peleando un buen rato:

    1- Si la macro te ha funcionado una vez y ya no te ha vuelto a funcionar: La macro se ha de lanzar desde el archivo en el que aparecen la totalidad de mails a mandar (es decir, cuando en el Documento 1 pinchas en “Finalizar y combinar” y “Editar documentos individuales”, se abre un segundo word, DESDE ESE es en el que se lanza la macro! Yo ayer me olvidé de este paso y estuve dandome cabezazos con el teclado una hora jajaja)

    2- Si quieres mandar mail desde un mail que no es el principal en tu outlook:
    No basta con cambiar el mail en la Macro, vas a tener que hacerte un segundo perfil de outlook para que se mande desde ese buzón, si no, se mandará por defecto desde el tuyo (ayer mandé 200 correos desde mi mail personal que tuve que recuperar uno a uno…). Para hacerte un segundo perfil, en outlook vete a “Archivo” – “Configurción de la cuenta” – “Administrar perfiles” – “Mostrar perfiles” – “Agregar” (abajo de agregar marca “Solicitar un perfil”) y ya te queda solo completar! Cuando vuelvas a abrir outlook, te preguntará con qué buzón quieres entrar. Te aconsejo que te mandes un mail de test a ti mismo por si acaso y no vayas a lo loco como yo.

    3- Para añadir una imagen al cuerpo del mail:
    He de dar las gracias a alguien que especificaba en las respuestas pasar todo a HTML y cambiar en la macro el HTMLBody. La etiqueta a la que se refiere y que neceistáis es la siguiente (necesitáis tener guardada la imagen en vuestro equipo local):
    -Si queréis dejar un salto de linea entre el resto del cuerpo del mail y vuestra imagen:

    -Etiqueta necesaria (no olvidéis las comillas):

    4- Si quieres cambiar el mensaje que devuelve la macro:
    Todo lo que aparece después de “MsgBox” y que se encuentra entre comillas, es lo que se va a mostrar. Los símbolos de & lo que hacen es concatenar el texto plano que tu pongas con alguna función específica (como en caso de este mail, el conteo de los mails).

    5- Da exactamente igual el orden de los mails del excel, los que importan es el orden del Documento 2, me explico: La linea 1 del excel mandará el mail al mail de la línea 1 del Documento 2, coincida o no con el mail que está en la línea 1 del Documento 2 o no (eso si, el mail debe estar contenido a lo largo del Documento 2, si no, no lo mandará).

    Y aquí yo tengo una duda que no conseguí resolver ayer y que necesito que alguien que entienda un poco más de VB que yo me ayude por favor:
    ¿En qué linea la macro compara los mails del excel con los del Doc2? Si no entendéis la pregunta trastead la macro un poco y el excel y el Doc2: Si se eliminan los mails del excel y existen en el Doc2, los mails no se mandan (aunque el último MsgBox diga que si, puesto que cuenta las secciones del word y no los mails enviados realmente). Además, si tienes >2 lineas en el excel en las que solo en las dos primeras aparece mail, queda en bucle el último mail que aparezca en Doc2, por lo que si tienes varias líneas vacías en el excel, te enviará un correo por cada una. Yo lo que quería era obtener el mail que sacara del excel y compararlo con null, pero no encuentro en qué momento la Macro comprueba que el excel deba llevar mails, y ahí me quedé jajajajaja (perdón si la pregunta no es muy clara – igual nadie llega hasta aquí para leerla xD).

    Espero que mis quebraderos de cabeza le sirvan a alguien^^

    • No se han guardado las etiquetas que puse de HTML…. voy a ver si consigo que aparezcan (abrir y cerrar diamante = simbolos de mayor y menor de al lado de la Z):

      -Salto de línea:
      Abres diamante br/ cierras diamante

      -Etiqueta necesaria (no olvides las comillas!):
      Abres diamante “Tu ruta donde esté guardada la imagen (ejemplo C:\firma.png)”/ cierras diamante

      • CORRIJO
        -Etiqueta necesaria (no olvides las comillas!):
        Abres diamante img src=“Tu ruta donde esté guardada la imagen (ejemplo C:\firma.png)”/ cierras diamante

  • Hola, estoy usando la macro y el proceso en dos equipos uno con windows 7 y office 13 (FUNCIONA PERFECTO) y en otro con windows 10 64bit y office 2013 y no funciona, los correos no aparecen en outlook para enviarse. Alguien ha experimentado este problema ????

  • La usé varias veces hasta hace un mes y hoy quise usarla y no funcionó. Alguien sabe por qué puede ser? Me salía un mensaje del antivirus, preguntando si quería continuar o denegar, pero ninguna opción me aceptaba.

  • Gracias, me parece bueno, pero no me funciona, no se si dentro de la operación de Macros debo tener en cuenta que es de la empresa el correo que necesito que emitar correos con adjunto de forma masiva… Si puedes ayudarme te lo agradeceria

  • Hola, he seguido los pasos al pie de la letra y la macros me dice que se envían los correos pero en Outlook no pasa nada, estoy trabajando en Windows 10 de 32Bit, veo que a alguien dejo de funcionarle, alguien sabe a que se deberá?

  • Excelente, gracias por compartir el conocimiento, saludos desde Quetzaltenango, Guatemala C.A., resolvió mi problema para enviar documentos adjuntos a cada remitente, les cuento que si pude enviar dos archivos adjuntos, solo agregue una columna con la ubicación del segundo archivo, gracias!!!!!

  • Hola buenos dias,

    De antemano muchisimas gracias por la herramienta me saco de apuros, ahora la pregunta es, existe alguna forma de que el asunto sea personalizado y que se concatene con algun valor del excel por ejemplo
    “Hola señor <> ”

    Gracias.

Deja una respuesta

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