Muchas veces deseamos que nuestros trabajos en Excel, o en otros programas de Office incluso, se puedan enviar a través de nuestro correo electrónico. Podríamos decir que si tenemos dicho correo configurado en nuestro Microsoft Outlook no será muy difícil lograrlo.
A través de VBA podemos manejar desde Excel nuestro Microsoft Outlook como un objeto y así enviar mensajes adjuntando incluso archivos o nuestra firma digital, si es que la tenemos.
Lo primero que recomiendo hacer es activar la referencia respectiva en el editor de VBA:
En mi caso dice 15.0 por la versión de Office que tengo en la respectiva PC pero se debe activar la que a cada uno le corresponda.
Para continuar, lo que vamos a hacer ahora es crear un objeto “Outlook” y también usaremos el método “CreateItem” con el parámetro del tipo “olMailItem” que creará un nuevo mensaje (objeto “MailItem”):
Dim OutlookApp As Outlook.Application
Dim objItem As MailItem
Set OutlookApp = CreateObject("Outlook.Application")
Set objItem = OutlookApp.CreateItem(olMailItem)
Tal y como cuando enviamos un mensaje desde nuestro correo o desde el propio Microsfot Outlook, el objeto creado tiene propiedades que representan los campos “Para”, “Asunto”, “Cuerpo”, etc:
With objItem
.To = "destinatario@ejemplo.com" 'Para
.CC = "segundodestinatario@ejemplo.com" 'Con copia
.Subject = "Prueba" 'Asunto
.Body = "Este es un mensaje de prueba" 'Cuerpo
End With
Lo único que faltaría es que usemos el método “Send” para enviar el mensaje:
.Send
Toda nuestra macro junta podría quedar así:
Sub EnviarMensajeOutlook() Dim OutlookApp As Outlook.Application Dim objItem As MailItem
Set OutlookApp = CreateObject("Outlook.Application") Set objItem = OutlookApp.CreateItem(olMailItem)
With objItem .To = "destinatario@ejemplo.com" 'Para .CC = "segundodestinatario@ejemplo.com" 'Con copia .Subject = "Prueba" 'Asunto .Body = "Este es un mensaje de prueba" 'Cuerpo .Send End With Set OutlookApp = Nothing Set objItem = Nothing End Sub
Si deseamos poder ir cambiando el correo de destino o el texto del cuerpo del mensaje o etc., sin tener que modificar la macro, podemos colocar los datos en celdas o variables:
With objItem
.To = Range("A1").Value
.CC = Range("A2").Value
.Subject = Range("A3").Value
.Body = Range("A4").Value
.Send
End With
En este momento ya se deben de haber dado cuenta (o ya sabían) que el cuerpo del mensaje se envía sin formato y quizá lo que queremos es más bien que dicho mensaje tenga formato como ya estamos, casi todos, acostumbrados hoy en día cuando usamos el correo electronico. Para lograr eso ya no debemos usar la propiedad “Body” sino que ahora usaremos la propiedad “HTMLBody” pero tendremos que aplicar algo de “HTML” en nuestro VBA:
.HTMLBody = "<html>" & _
"<body><font color=""#FF0000"" size=""6"" face=""Comic Sans MS, cursive""><strong>Hola mi querido y estimado amigo</strong></font>" & _
"</body></html>"
Si lo que queremos, además, es adjuntar algún archivo a nuestro mensaje, debemos usar la propiedad “Attachments” y su método “Add”. Podemos agregar más de un archivo del siguiente modo:
.Attachments.Add "D:\Miarchivouno.xlsm"
.Attachments.Add "D:\MiArchivoNuevo.xlsx"
Es bueno recordar que también podemos usar un bucle y/o variables para agregar más archivos.
Siguiendo con los adjuntos, probablemente tengamos nuestra firma en formato “JPG” y queremos incluirla en el cuerpo del mensaje; de ser así, lo primero que debemos hacer es adjuntar el archivo:
.Attachments.Add “D:\MiFirma.jpg"
Después incluiremos dicha imagen en el cuerpo del mensaje del siguiente modo y/o similar:
.HTMLBody = "<html>" & _
"<body>" & _
"<p>Aqui tu mensaje</p>" & _
"<br>" & _
"<br>" & _
"<img src='cid:'" & .Attachments.Item(1).Filename & "'' height=100 width=75>" & _
"</body>" & _
"</html>"
Los archivos adjuntos tienen un índice, si se tiene más archivos adjuntos, considerar el índice adecuado. En este caso he usado el uno (1).
Hasta la próxima.
Abraham Valencia
PD: En realidad cuando se usa el objeto "Outlook", y sobre todo se nota cuando se hacen envíos masivos, lo que ocurre es que se van colocando los mensajes en la "Bandeja de salida" así que es recomendable que se tenga el Microsoft Outlook configurado para el envío automático al abrir/cerrar para que el proceso continúe el envío así se cierre el Excel. Igual si se desea que se haga casi al instante el envío desde la macro, se puede añadir un Application.Wait después del "Send" o tener el Outlook abierto.
Extras:
En ocasiones deseamos enviar un rango de nuestra hoja como parte del cuerpo del mensaje, hay algunas alternativas como convertir el rango en imagen y colocarla en el cuerpo del mensaje, similar a lo que se hace con las firmas pero la mejor alternativa que he visto es usar una “Función Definida por el Usuario” (UDF) que convierte el rango en lenguaje “HTML” y permite incluirlo en el cuerpo del mensaje a través de la propiedad “HTMLBody”. EL autor es Ron de Bruin y la UDF podemos encontrarla aquí:
http://www.rondebruin.nl/win/s1/outlook/bmail2.htm
Cuando tenemos más de un correo configurado en el Outlook, recomiendo usar una UDF (Autor: Antoni - Galicia, España) para poder elegir el correo que queremos usar:
https://ayudaexcel.com/foro/topic/32737-elegir-cuenta-de-correo-de-outlook/
De no elegir alguno de los correos con la UDF, se usará el correo configurado como predeterminado.
Yo tengo una inquietud respecto a este tema, en el posto en la linea "Después incluiremos dicha imagen en el cuerpo del mensaje del siguiente modo y/o similar:" posteriormente aparece el lenguaje html para agregar la imagen, es posible diseñar el correo en una interfaz de usuario como en el caso de outlook, que a su vez lo traduzca en el lenguaje html requerido para la macro. Diseñar el cuerpo del correo sin escribir una sola linea de código por el usuario.
ResponderBorrarHola. Gracias por comentar. Se puede hacer algo como lo que comentas usando un Userform de Excel, por ejemplo, y claro que se puede hacer que por ejemplo lo de un TextBox (u otro objeto) se convierta en HTML, como tú dices, sin que el usuario use VBA. Claro, hay que programar todo y no es tan simple. Saludos.
BorrarBuen día Abraham, espero te encuentres bien
ResponderBorrarSeguí atento tus indicaciones, pero me arroja error en las lineas del cuerpo de correo cuando se incluye la firma.
El error es el siguiente: Array index out of bounds
Espero me puedas ayudar
Gracias
Hola, sin ver al menos la línea del problema, es complicado ayudarte. Saludos.
BorrarHola Abraham, me podes pasar la macro completa en donde se incluya la firma en JPG, no se donde puedo incluirla en el codigo, gracias.
ResponderBorrarTengo este codigo y lo unico que me falta es agregar la imagen al cuerpo del corre, si me ayudas te agradeceria:
ResponderBorrarSub Correo_Paso5()
'Por.Dante Amor
col = Range("H1").Column
For i = 2 To Range("B" & Rows.Count).End(xlUp).Row
Set dam = CreateObject("outlook.application").createitem(0)
dam.To = Range("B" & i) 'Destinatarios
dam.CC = Range("C" & i) 'Con copia
dam.Bcc = Range("D" & i) 'Con copia oculta
dam.Subject = Range("E" & i) '"Asunto"
dam.body = Range("F" & i) '"Cuerpo del mensaje"
'
For j = col To Cells(i, Columns.Count).End(xlToLeft).Column
archivo = Cells(i, j)
If archivo <> "" Then dam.Attachments.Add archivo
Next
dam.send 'El correo se envía en automático
'dam.display 'El correo se muestra
Next
MsgBox "Correos enviados", vbInformation, "SALUDOS"
End Sub
Pudiste agregar la imagen? Tengo el mismo problema en ese mismo código :(
BorrarHola, si pude
ResponderBorrarClarísimo y muy instructivo.
ResponderBorrarNo he encontrado nada parecido en la web.
¡Gracias!
Hola Abraham muchas gracias por tu información seguí la instrucción de tu código y la imagen adjunta se muestra como firma. Sin embargo cuando hago esta operación y envio mensajes a correos de Gmail. la imagen no se muestra. Tu me podrías dar alguna sugerencia. Muchas gracias por tu atención
ResponderBorrarAca esta la solucion.
Borrarhttps://answers.microsoft.com/es-es/msoffice/forum/msoffice_excel-mso_win10-mso_o365b/excel-env%C3%ADo-de-e-mail-con-imagen/2b5b12e0-7360-4440-95ce-3abb579269ee
Hola Como vinculo la fecha de vencimiento del archivo excel a outlook
ResponderBorrarHola. Podria en lugar de enviar directamente guardar los correos en borrador para revisarlos antes de enviar?
ResponderBorrar