You are on page 1of 19

Macro para enviar emails usando Outlook

A continuación vamos a explicar cómo mediante una macro podemos generar emails,
adjuntar archivos y mandarlos a través de Outlook. Para ello hemos creado tres ejemplos
de dificultad creciente. En el primer ejemplo vamos a mandar un email con solo texto,
en el segundo ejemplo vamos a añadir archivos adjuntos a este email y en el tercer
ejemplo vamos a crear un Excel donde poder escribir 5 emails de manera simultánea,
adjuntar archivos y después mandarlos todos de una sola vez.

Contenido [Ocultar]

 1 Ejemplo 1: Mandar un email con solo texto

o 1.1 Activar Librería

o 1.2 Código para mandar email con VBA

 2 Ejemplo 2 Mandar un email con archivos adjuntos

o 2.1 Código para adjuntar archivos a email

o 2.2 Código para eliminar archivos adjuntos

o 2.3 Código para mandar email con archivos adjuntos

 3 Ejemplo 3: Mandar 5 emails con Excel de manera simultánea

o 3.1 Creación de controles ActiveX

o 3.2 Adjunar archivos a los diferentes emails

o 3.3 Eliminar los archivos adjuntos de los diferentes emails

o 3.4 Enviar todos los correos de manera simultánea

 4 Bonus track: Descarga estos ejemplos

EJEMPLO 1: MANDAR UN EMAIL CON SOLO TEXTO

En primer lugar y tal como explicamos en el artículo de exportar tablas a Power Point
tenemos que activar la libreria de Microsoft Outlook (Microsoft Outlook 15.0 Object
Library).
ACTIVAR LIBRERÍA

Para activar la librería tenemos que ir a Herramientas>>Referencias. En la nueva ventana


que se nos abre tenemos que activar la Librería de Objetos de Outlook (La versión
depende del Office instalado, en nuestro ejemplo es la version 15.0)

Una vez activada esta librería podremos usar en nuestro código objetos de Outlook.

CÓDIGO PARA MANDAR EMAIL CON VBA

Para mandar un email los campos qué necesitamos rellenar son el de destinatario,
direcciones en copia y contenido del email. El código completo es el siguiente:

Sub enviarcorreo()

Dim i, j As Integer

Dim pagina1 As Worksheet

Set pagina1 = ActiveWorkbook.Worksheets("Ejemplo1")

Dim OutApp As Object

Dim Correo As Object

With Application

.EnableEvents = False

.ScreenUpdating = False

End With
'Comprobar si Outlook esta abierto y en caso de no estarlo abrirlo

On Error Resume Next

Set OutApp = GetObject("", "Outlook.Application")

Err.Clear

If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")

OutApp.Visible = True

Set Correo = OutApp.CreateItem(0)

'Crear el correo y mostrarlo

With Correo

.To = pagina1.Range("C8").value

.CC = pagina1.Range("C9").value

.Subject = pagina1.Range("C10").value

.HTMLBody = pagina1.Range("C11").value

.Display

End With

With Application

.EnableEvents = True

.ScreenUpdating = True

End With

End Sub

En este primer ejemplo como siempre hemos definido primero nuestras variables. En este
caso hemos creado la variable “pagina1” y le hemos asignado la hoja “Ejemplo1”. De esta
manera nos ahorraremos un poco de código posteriormente.

A continuación desactivamos EnableEvents (típicas ventanitas que aperecen con “¿Está


seguro de que…?”) y también ScreenUpdating (es decir, que la pantalla solo se actualice
una vez haya terminado la macro).
Después comprobamos si Outlook está abierto. La manera de comprobarlo es mediante
prueba y error; vamos a intentar seleccionarlo (“GetObject”) y si nos da error, eso quiere
decir que no está abierto. En ese caso lo abriremos mediante “CreateObject”.

Para crear un correo hemos usando el comando “OutApp.CreateItem(0)”. El número entre


paréntesis hace referencia al objecto que vamos a crear. En este caso es un email. Otros
números que podemos usar son:

 CreateItem(1) = Cita

 CreateItem(2) = Contacto

 CreateItem(3) = Tarea

 CreateItem(4) = Entrada del diario

 CreateItem(5) = Nota

 CreateItem(6) = Discusión

 CreateItem(7) = Grupo de contactos

Por último al correo le vamos a asignar un destinatario que hemos escrito en la celda “C7”,
un correo en copia que está en la celda “C8”, un asunto que está en la celda “C9” y un
contenido que está en la celda “C10”.
Con el comando “.Display” vamos amostrar el email en pantalla pero no se va a mandar.
Si queremos que Outlook mande el email de manera automática tenemos que sustituir
“.Display” por el comando “.Send”.

Al final del código volvemos a activar EnableEvents y ScreenUpdating.

EJEMPLO 2 MANDAR UN EMAIL CON ARCHIVOS ADJUNTOS

Este ejemplo es una modificación del anterior. Vamos a crear un email de la misma
manera que en el Ejemplo 1 pero esta vez le vamos a añadir un archivo adjunto al email.

Para añadir un archivo adjunto hemos creado una segunda macro. La nueva macro se
puede escribir en el mismo módulo a continuación de la macro del ejemplo anterior o en
otro módulo diferente.

Mediante esta nueva macro vamos a abrir una ventana de diálogo para poder seleccionar
los archivos que queremos adjuntar. Una vez seleccionados escribiremos la dirección de
los archivos seleccionados en las celdas “C10:C19” (vamos a limitar a 10 el máximo
número de archivos a adjuntar). También vamos a crear un hyperlink a estos archivos
adjuntados para poder abrir rápidamente los archivos que estamos adjuntando.

CÓDIGO PARA ADJUNTAR ARCHIVOS A EMAIL

Sub seleccionararchivosadjuntos()

Dim i As Integer

Dim numeroArchivos As Integer

Dim pagina2 As Worksheet

Set pagina2 = ActiveWorkbook.Worksheets("Ejemplo2")

Dim fldr As FileDialog

Set fldr = Application.FileDialog(msoFileDialogFilePicker)

'determinar cuantos archivos adjuntos hay

numeroArchivos = 0

For i = 1 To 10

If pagina2.Cells(10 + i, 3) <> "" Then

numeroArchivos = numeroArchivos + 1
End If

Next i

'preguntar si desea borrar los archivos ya adjuntados (en caso de que los haya)

If numeroArchivos <> 0 Then

If MsgBox("¿Desea borrar los archivos adjuntados existentes?", vbYesNo) = vbYes Then

ActiveWorkbook.Worksheets("Sheet2").Range("F18:F27").ClearContents

End If

End If

'mostrar ventana con archivos a elegir

With fldr

.Title = "Select a Folder"

.AllowMultiSelect = True

If .Show <> -1 Then Exit Sub

If .SelectedItems.Count > 10 - numeroArchivos Then

MsgBox "Sólo puede adjuntar 10 archivos cómo máximo"

Exit Sub

End If

'escribir los archivos en el excel y asignarles un hyperlink

If .SelectedItems.Count <= 10 Then

For i = 1 To .SelectedItems.Count

pagina2.Cells(10 + i + numeroArchivos, 3) = .SelectedItems(i)

pagina2.Cells(10 + i + numeroArchivos, 3).Worksheet.Hyperlinks.Add _

anchor:=pagina2.Cells(10 + i + numeroArchivos, 3), _

Address:=.SelectedItems(i), _
TextToDisplay:=.SelectedItems(i)

Next i

End If

End With

End Sub

A continuación vamos a crear un botón al que asignaremos esta macro. La primera parte
del código lo que hace es que cuando hagamos clic en el botón compruebe si ya hay algun
archivo adjunto. En caso de que existan archivos adjuntos nos preguntará si queremos
eliminarlos o si simplemente queremos añadir más archivos adjuntos a los ya existentes. Si
no los eliminamos, contará cuantos archivos ya están adjuntados y nos permitirá añadir
más archivos hasta un total de 10.

Después copiará los nombres de los archivos en una lista y asignará un hyperlink a su
contenido.
CÓDIGO PARA ELIMINAR ARCHIVOS ADJUNTOS

Además vamos a crear otro botón que nos permita eliminar todos los archivos adjuntos a
la vez. El código para eliminarlos es el siguiente:

Sub eliminararchivosadjuntos()

Dim pagina2 As Worksheet

Set pagina2 = ActiveWorkbook.Worksheets("Ejemplo2")

pagina2.Range("C11:C20").ClearContents

End Sub

CÓDIGO PARA MANDAR EMAIL CON ARCHIVOS ADJUNTOS

Ahora vamos a modificar la macro del primer ejemplo para que añada los archivos
adjuntos seleccionados:

Sub enviarcorreo()

Dim i, j As Integer

Dim pagina2 As Worksheet

Set pagina2 = ActiveWorkbook.Worksheets("Ejemplo2")

Dim OutApp As Object

Dim Correo As Object

With Application

.EnableEvents = False

.ScreenUpdating = False

End With

'Comprobar si Outlook esta abierto y en caso de no estarlo abrirlo

On Error Resume Next

Set OutApp = GetObject("", "Outlook.Application")


Err.Clear

If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")

OutApp.Visible = True

Set Correo = OutApp.CreateItem(0)

'Contar el numero de archivos adjuntos

Dim numeroArchivos As Integer

numeroArchivos = 0

Do While hoja.Cells(11 + numeroArchivos, 3) <> ""

numeroArchivos = numeroArchivos + 1

Loop

'Crear el correo y mostrarlo

With Correo

.To = hoja.Range("C7").value

.CC = hoja.Range("C8").value

.Subject = hoja.Range("C9").value

.HTMLBody = hoja.Range("C10").value

For i = 1 To numeroArchivos

.Attachments.Add (hoja.Cells(10 + i, 3).Value)

Next i

.Display

End With

End Sub

EJEMPLO 3: MANDAR 5 EMAILS CON EXCEL DE MANERA SIMULTÁNEA

Este ejemplo es simplemente una variación de los ejemplos ateriores que introduce varios
bucles y que nos permite crear 5 emails para despues mandarlos de una sola vez.
CREACIÓN DE CONTROLES ACTIVEX

Ahora vamos a tener 5 botones diferentes para adjuntar archivos y 5 botones para
eliminarlos, cada uno de ellos haciendo referencia a un email diferente. Para solucionar
este problema lo que hemos hecho ha sido crear controles ActiveX como se muestra en la
imagen a continuación. Para añadirlo tenemos que ir a la pestaña de Desarrolador >>
Insertar.

De una manera simple y breve podríamos decir que la diferencia entre los controles de
formulario y los controles ActiveX es que los primeros ejecutan una macro escrita en un
módulo mientras que lo segundos se les puede asignar su propio código que solo se
encuentra asociado a ese botón en particular.

Una vez hayamos creado el control ActiveX lo podremos seleccionar en VBE en la hoja en
que lo hayamos colocado.

En la parte superior derecha en la pestaña desplegable podemos seleccionar cual es el


evento que ejecute el código asociado a este botón.
En nuestro caso hemos seleccionado el evento “hacer click en el botón”.

Ahora vamos a crear una variable global que va a ser el email al que correponde el control.
Vamos a crear dos botones asociados a cada email. El primer boton para adjuntar archivos
y el Segundo para eliminar todos los archivos adjuntos. Cuando hagamos click en un
control asignarnos el número de columna del email a la variable global y esta variable
será pasada a la macro que permite seleccionar ó eliminar los archivos adjuntos. En
función de la variable que le hayamos pasado a la macro esta escribirá los archivos
seleccionados en una columna o en otra.

El código de los controles ActiveX es el siguiente:


Option Explicit

Public nocolumna As Integer

Private Sub CommandButton1_Click()

nocolumna = 3

Call seleccionararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton2_Click()

nocolumna = 3

Call eliminararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton3_Click()

nocolumna = 6

Call seleccionararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton4_Click()

nocolumna = 6

Call eliminararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton5_Click()

nocolumna = 9

Call seleccionararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton6_Click()

nocolumna = 9
Call eliminararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton7_Click()

nocolumna = 12

Call seleccionararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton8_Click()

nocolumna = 12

Call eliminararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton9_Click()

nocolumna = 15

Call seleccionararchivosadjuntos3(nocolumna)

End Sub

Private Sub CommandButton10_Click()

nocolumna = 15

Call eliminararchivosadjuntos3(nocolumna)

End Sub

ADJUNAR ARCHIVOS A LOS DIFERENTES EMAILS

Ahora vamos a modificar el código mostrado en el Ejemplo 2 para que ahora tome una
variable de entrada y sea capaz de adjuntar archivos a cada email de manera individual.

El código completo es el siguiente:

Sub seleccionararchivosadjuntos3(nocolumna As Integer)

Application.ScreenUpdating = False
Dim i, j As Integer

Dim numeroArchivos As Integer

Dim hoja As Worksheet

Set hoja = ActiveWorkbook.Worksheets("Ejemplo3")

Dim fldr As FileDialog

Set fldr = Application.FileDialog(msoFileDialogFilePicker)

'determinar cuántos archivos adjuntos hay

numeroArchivos = 0

Do While hoja.Cells(12 + numeroArchivos, nocolumna) <> ""

numeroArchivos = numeroArchivos + 1

Loop

'preguntar si desea borrar los archivos ya adjuntados (en caso de que los haya)

If numeroArchivos <> 0 Then

If MsgBox("¿Desea borrar los archivos adjuntados existentes?", vbYesNo) = vbYes Then

hoja.Cells(12, nocolumna).Resize(10, 1).ClearContents

End If

End If

'mostrar ventana con archivos a elegir

With fldr

.Title = "Select a Folder"

.AllowMultiSelect = True

If .Show <> -1 Then Exit Sub

If .SelectedItems.Count > 10 - numeroArchivos Then


MsgBox "Sólo puede adjuntar 10 archivos cómo máximo"

Exit Sub

End If

'escribir los archivos en el excel y asignarles un hyperlink

If .SelectedItems.Count <= 10 - numeroArchivos Then

For i = 1 To .SelectedItems.Count

hoja.Cells(11 + numeroArchivos + i, nocolumna).Worksheet.Hyperlinks.Add _

anchor:=hoja.Cells(11 + numeroArchivos + i, nocolumna), _

Address:=.SelectedItems(i), _

TextToDisplay:=.SelectedItems(i)

Next i

End If

End With

Application.ScreenUpdating = True

End Sub

ELIMINAR LOS ARCHIVOS ADJUNTOS DE LOS DIFERENTES EMAILS

Para eliminar los archivos adjuntados al igual que en el código mostrado arriba vamos a
tomar una variable de entrada (dependiendo del botón que se haya seleccionado) y
eliminaremos los archivos adjuntos correspondientes.

Sub eliminararchivosadjuntos3(nocolumna As Integer)

Dim hoja As Worksheet

Set hoja = ActiveWorkbook.Worksheets("Ejemplo3")

Range(hoja.Cells(12, nocolumna), hoja.Cells(21, nocolumna)).ClearContents

End Sub
ENVIAR TODOS LOS CORREOS DE MANERA SIMULTÁNEA

Sub enviarcorreo3()

Dim i, j, k As Integer

Dim hoja As Worksheet

Set hoja = ActiveWorkbook.Worksheets("Ejemplo3")

Dim OutApp As Object

Dim Correo As Object

Dim numeroArchivos As Integer

With Application

.EnableEvents = False

.ScreenUpdating = False

End With

'Comprobar si Outlook está abierto y en caso de no estarlo abrirlo

On Error Resume Next

Set OutApp = GetObject("", "Outlook.Application")

Err.Clear

If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")

OutApp.Visible = True

For k = 1 To 5

Set Correo = OutApp.CreateItem(0)

'Contar el numero de archivos adjuntos

numeroArchivos = 0

Do While hoja.Cells(12 + numeroArchivos, k * 3) <> ""

numeroArchivos = numeroArchivos + 1
Loop

'Crear el correo y mostrarlo

With Correo

.To = hoja.Cells(8, k * 3)

.CC = hoja.Cells(9, k * 3)

.Subject = hoja.Cells(10, k * 3)

.HTMLBody = hoja.Cells(11, k * 3)

For i = 1 To numeroArchivos

.Attachments.Add (hoja.Cells(11 + i, k * 3).Value)

Next i

.Display

End With

seguir:

Next k

End Sub

Ejemplos hay muchos, por ejemplo:

Sub Mail_workbook_Outlook()
'Es necesario añadir la refeerncia Microsoft Outlook Library (herramientas/referencias)
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(olMailItem)
With OutMail
.To = "ejemplo@dominio.com"
.CC = ""
.BCC = ""
.Subject = "Asunto del mensaje"
.Body = "Este es el texto del mensaje"
'Se pueden adjuntar ficheros
.Attachments.Add ("C:\Mi_Fichero.pdf")
.Display 'tambien se puede usar .Send y lo situa en la bandeja de salida
End With
Set OutMail = Nothing
Set OutApp = Nothing

End Sub

Sub Mail_workbook_Outlook()
'Es necesario añadir la refeerncia Microsoft Outlook Library (herramientas/referencias)
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(olMailItem)
With OutMail
.To = "ejemplo@dominio.com"
.CC = ""
.BCC = ""
.Subject = "Asunto del mensaje"
.Body = "Este es el texto del mensaje"
'Se pueden adjuntar ficheros
.Attachments.Add ("C:\Mi_Fichero.pdf")
.Display 'tambien se puede usar .Send y lo situa en la bandeja de salida
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Dim nombreInforme As String

Dim destinatario As String

Dim asunto As String

Dim cuerpo As String

nombreInforme = "PAGO NOVIEMBRE 2"

destinatario = Me.CORREO_ELECTRÓNICO.Value

asunto = "RECIBO DE PAGO DEL MES DE NOVIEMBRE DE " & Me.NOMBRE_Y_APELLIDOS

cuerpo = "Le adjuntamos el recibo de pago del mes de noviembre, vea el PDF

adjunto. Gracias"

DoCmd.SendObject acSendReport, nombreInforme, "PDF", destinatario, , , asunto,

cuerpo, False

You might also like