Professional Documents
Culture Documents
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]
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
Una vez activada esta librería podremos usar en nuestro código objetos de Outlook.
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
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
'Comprobar si Outlook esta abierto y en caso de no estarlo abrirlo
Err.Clear
OutApp.Visible = True
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.
CreateItem(1) = Cita
CreateItem(2) = Contacto
CreateItem(3) = Tarea
CreateItem(5) = Nota
CreateItem(6) = Discusión
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”.
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.
Sub seleccionararchivosadjuntos()
Dim i As Integer
numeroArchivos = 0
For i = 1 To 10
numeroArchivos = numeroArchivos + 1
End If
Next i
'preguntar si desea borrar los archivos ya adjuntados (en caso de que los haya)
ActiveWorkbook.Worksheets("Sheet2").Range("F18:F27").ClearContents
End If
End If
With fldr
.AllowMultiSelect = True
Exit Sub
End If
For i = 1 To .SelectedItems.Count
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()
pagina2.Range("C11:C20").ClearContents
End Sub
Ahora vamos a modificar la macro del primer ejemplo para que añada los archivos
adjuntos seleccionados:
Sub enviarcorreo()
Dim i, j As Integer
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
OutApp.Visible = True
numeroArchivos = 0
numeroArchivos = numeroArchivos + 1
Loop
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
Next i
.Display
End With
End Sub
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.
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.
nocolumna = 3
Call seleccionararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 3
Call eliminararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 6
Call seleccionararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 6
Call eliminararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 9
Call seleccionararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 9
Call eliminararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 12
Call seleccionararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 12
Call eliminararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 15
Call seleccionararchivosadjuntos3(nocolumna)
End Sub
nocolumna = 15
Call eliminararchivosadjuntos3(nocolumna)
End Sub
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.
Application.ScreenUpdating = False
Dim i, j As Integer
numeroArchivos = 0
numeroArchivos = numeroArchivos + 1
Loop
'preguntar si desea borrar los archivos ya adjuntados (en caso de que los haya)
End If
End If
With fldr
.AllowMultiSelect = True
Exit Sub
End If
For i = 1 To .SelectedItems.Count
Address:=.SelectedItems(i), _
TextToDisplay:=.SelectedItems(i)
Next i
End If
End With
Application.ScreenUpdating = True
End Sub
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.
End Sub
ENVIAR TODOS LOS CORREOS DE MANERA SIMULTÁNEA
Sub enviarcorreo3()
Dim i, j, k As Integer
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
Err.Clear
OutApp.Visible = True
For k = 1 To 5
numeroArchivos = 0
numeroArchivos = numeroArchivos + 1
Loop
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
Next i
.Display
End With
seguir:
Next k
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
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
destinatario = Me.CORREO_ELECTRÓNICO.Value
cuerpo = "Le adjuntamos el recibo de pago del mes de noviembre, vea el PDF
adjunto. Gracias"
cuerpo, False