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…
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.
Veremos ahora una ventana como esta…
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í:
[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…
- En el Documento 1, ya escrito y con los campos de combinación cubiertos, le damos a “Finalizar y combinar” y “Editar documentos individuales”.
- 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.
- 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).
- 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.
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 Fhr Zoo
como lo lograste? me pasa lo mismo me puedes adjuntar tu macro?
Saludos
Hola que tal
Cómo realizaste la corrección? Tengo el mismo problema 🙁
Gracias
buenas noches amigo, me podras ayudar me dice que si envío los correos pero al buscar no salen. Que hiciste necesito ayuda…. gracias
Tengo Office 2013, me funciona bien, pero no me adjunta el o los archivos.
Seguí los pasos al pie de la letra.
Donde puede estar el error?
Tengo el mismo error con outloock 2010, pudiste solucionarlo?, muchas gracias
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.
Usa la ruta absoluta, es decir \\servidor\carpeta\carpeta\AVISO\ETC
Exelente, andube buscando algo asi mucho tiempo, me ahorraste dinero.
Gran aporte!!
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
¡Saludos!
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!
Gran aporte Rikardo, muchas gracias! Trataremos de ponerlo en práctica…
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 “
La primera vez excelente, pero quiero volver a utilizarlo y no quiere ejecutarse el macro, ayudaaaaa
Hola
A mi me funciona con la primera dirección de la tabla. el resto las ignora.
Porque?
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
Buenos dias, habria alguna manera de en vez de enviar el correo automaticamente, dejarlo en la bandeja de salida
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.
Genial!!! Este tutorial ha sido un gran descubrimiento! Millones de gracias por compartirlo.
Oye, súper bueno.
pero pierdo el formato al enviar el correo.
Habrá una forma de que se mantenga en HTML-
saludos
Estimados
Tengo word 2007, pero no me adjunta los archivos. Tengo la ruta en el disco C.
Favor su ayuda!
Gracias por tu publicación,
Tengo una pregunta, se podría añadir varios destinatarios en cada email enviado?
Hola! yo también tengo la misma pregunta! Se puede añadir varios destinatarios a un mismo email?
Amigos, se pierde el formato, alguno sabra como enviar un correo y que no se pierda el formato (HTML).
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, de maravilla, funciona super bien…
Adjunte un archivo excel a 80 personas y funciona super…
agradecido por el aporte…. Saludos
Hola Leonardo, ¡encantados de haberte podido ayudar! Muchas gracias por el feedback. Saludos.
buenas amigo, me podría ayudar… no logro hacerlo… gracias de antemano
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.
Me marca un error diciendo que las las macros de este proyecto estan deshabilitadas
Deberías revisar la configuración del excel que usas como base de correspondencia.
Saludos
Buenas tardes:
Lo he probado y me ha funcionado perfecto. ¡No sabes el tiempo que me ahorra!
Mil gracias.
Un saludo,
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?
Debes pegarlo en el Word, lo he probado y funciona.
Saludos
Excelente aportación. Funciona de maravilla. Gracias.
Increíble, lo acabo de probar con 49 contactos y funciona 100%
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.