En esta lección vas a aprender cómo enviar un email de manera automática desde Microsoft Excel usando VBA a través de la aplicación Lotus.
He elegido esta plataforma ya que es la de mayor uso corporativo y más compleja de programar. Sin embargo, si hay alguien interesado en usar otro tipo de programa como, por ejemplo, Outlook o similar, solo tiene que comentármelo y organizo una lección para ello.
Además, hoy también aprenderás a usar funciones. De hecho, el programa de envío de emails lo he confeccionado como función. Pero, no te asustes. En realidad, una función es un programa estándar con una serie de parámetros que le tienes que especificar para poder ejecutarse.
Al definir una función, entre paréntesis, definimos que parámetros tendremos que darle a la hora de ejecutarla. Por ejemplo, la siguiente función necesita que le demos el asunto (subject) cuando la llamemos.
Sub SendEmail(Subject)
Dentro del código de la función se llamará a ese parámetro (subject) y si no se lo hemos pasado, nos dará error.
Por otro lado, para llamar a una función, solo tenemos que poner su nombre, rellenando los parámetros que necesita. Para el ejemplo anterior, llamaríamos a la función enviar email, que lo enviaría con el asunto “Control de gastos”.
Probablemente, vamos a abordar el caso más complejo, enviar un email desde Microsoft Excel usando VBA a varios destinatarios con adjuntos (para poder enviar emails de manera automática, debes tener abierta la sesión en Lotus).
En primer lugar, crea un libro nuevo e inserta un módulo. Después, copia el código completo. Los campos a personalizar por ti se encuentran coloreados en rojo.
Seguidamente, crea un botón y asígnale la macro.
A continuación, te dejo el enlace del tema donde explico cómo asignar una macro a un botón.
Macro 1. Enviar un email (Lotus).
SendEmail "Control de gastos"
End Sub
Dim Maildb As Object
Dim mailDoc As Object
Dim body As Object
Dim session As Object
Dim Recipient As Variant
'Inicio de sesión en Lotus
Set session = CreateObject("Notes.NotesSession")
'Abre la base de datos de Lotus
Set Maildb = session.GetDatabase("", "names.nsf")
If Not Maildb.IsOpen = True Then
Call Maildb.Open
End If
'Crea un nuevo email
Set mailDoc = Maildb.CreateDocument
Call mailDoc.ReplaceItemValue("Form", "Memo")
'Elegimos los destinatarios
Recipient = Array("email1@direccion.com", "email2@direccion.com", "email3@direccion.com")
Call mailDoc.ReplaceItemValue("SendTo", Recipient)
'Insertamos el asunto elegido
Call mailDoc.ReplaceItemValue("Subject", Subject)
'Escribimos el contenido del email
Set body = mailDoc.CreateRichTextItem("Body")
Call body.AppendText("Buenos días,")
Call body.AddNewLine(2)
Call body.AppendText("Se adjunta archivo con control de gastos.")
Call body.AddNewLine(2)
Call body.AppendText("Saludos.")
'Insertamos un archivo adjunto
Call body.AddNewLine(2)
Call body.EmbedObject(1454, "", "C:\Users\usuario\Desktop\Control de gastos.xls")
Call body.AddNewLine(2)
Call body.EmbedObject(1454, "", "C:\Users\usuario\Desktop\Control de gastos.doc")
Call body.AddNewLine(2)
mailDoc.SaveMessageOnSend = True
Call mailDoc.ReplaceItemValue("PostedDate", Now())
Call mailDoc.send(False)
'Limpiamos
Set Maildb = Nothing
Set mailDoc = Nothing
Set body = Nothing
Set session = Nothing
End Sub
Antes de pulsar el botón, vamos a repasar el código y te voy a ir explicando qué hacemos en cada paso.
La primera parte del código es la macro, de nombre “email”. Solo contiene una línea, que es la llamada a la función “SendEmail”. En realidad, lo único que hacemos es pasarle el parámetro (subject) con el valor “Control de gastos”, que será el asunto del correo electrónico.
SendEmail "Control de gastos"
End Sub
Y, la segunda parte del código es la función. Su nombre es SendEmail y entre paréntesis aparece el único parámetro que necesita para ejecutarse (Subject), que ya se lo hemos pasado al llamarla desde la macro.
Sub SendEmail(Subject)
En primer lugar, declaramos una serie de variables que vamos a usar posteriormente.
Dim Maildb As Object
Dim mailDoc As Object
Dim body As Object
Dim session As Object
Dim Recipient As Variant
Seguidamente iniciamos la sesión en Lotus con nuestro usuario.
Set session = CreateObject("Notes.NotesSession")
Después, abrimos la base de datos de Lotus para poder trabajar.
Set Maildb = session.GetDatabase("", "names.nsf")
If Not Maildb.IsOpen = True Then
Call Maildb.Open
End If
A continuación, creamos un nuevo email.
Set mailDoc = Maildb.CreateDocument
Call mailDoc.ReplaceItemValue("Form", "Memo")
Para poder enviar un correo a varios destinatarios es necesario crear un array de direcciones, como si se tratara de una matriz.
Recipient = Array("email1@direccion.com", "email2@direccion.com", "email3@direccion.com")
Call mailDoc.ReplaceItemValue("SendTo", Recipient)
Ahora insertamos en el asunto el texto que introdujimos en el parámetro cuando llamamos a la función “Control de gastos”.
Call mailDoc.ReplaceItemValue("Subject", Subject)
Podemos establecer el contenido del email con un texto estándar, tipo “Buenos días, se adjunta archivo con control de gastos.”
El comando Call body.AddNewLine(2) simplemente inserta un espacio para separar párrafos.
Set body = mailDoc.CreateRichTextItem("Body")
Call body.AppendText("Buenos días,")
Call body.AddNewLine(2)
Call body.AppendText("Se adjunta archivo con control de gastos.")
Call body.AddNewLine(2)
Call body.AppendText("Saludos.")
Así mismo, si queremos insertar archivos adjuntos, tan solo tenemos que saber la ruta de los mismos.
Call body.AddNewLine(2)
Call body.EmbedObject(1454, "", "C:\Users\usuario\Desktop\Control de gastos.xls")
Call body.AddNewLine(2)
Call body.EmbedObject(1454, "", "C:\Users\usuario\Desktop\Control de gastos.doc")
Call body.AddNewLine(2)
Elegimos que se guarde en enviados.
Call mailDoc.ReplaceItemValue("PostedDate", Now())
Call mailDoc.send(False)
Por último, limpiamos y salimos.
Set Maildb = Nothing
Set mailDoc = Nothing
Set body = Nothing
Set session = Nothing
End Sub
Con esto llegamos al final de la vigesimotercera lección, en la que has aprendido a enviar un email desde Microsoft Excel usando VBA.
Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.
Nos vemos en el próximo capítulo.
Si te ha servido y quieres donar
Descarga el archivo del ejemplo
2 Comentarios
Enviar un comentario
« L22. Evento Change e Intersect en VBA.
EP1. Cómo importar datos de otra hoja con macros. »
Es un curso excepcional, mi enhorabuena.
Estoy muy interesado enviar un mail desde Excel pero para Outlook, te estaría muy agradecido si pudieras ponerlo. A ser posible que el mail tuviera mismo formato que la hoja Excel, fotos links etc.
Ahora mismo doy a Seguir en YouTube.
Mil gracias
Hola Arturo!
Muchas gracias por tu comentario. Respecto a lo de Outlook, tienes este post donde lo explico
https://www.vbatotal.com/enviar-un-email-a-traves-de-outlook-desde-excel/
Saludos.