Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado

Enviar un rango de celdas como adjunto en correo

| 7 comentarios

Cuando se trata de enviar información a través del correo electrónico muchas veces el factor practicidad es fundamental para agilizar el tiempo en el que se concretan conversaciones. Básicamente VBA, como herramienta, nos permite, mediante el uso de macros, seleccionar la data específica dentro de un archivo Excel y, una vez seleccionada dicha data, hacer referencia a otros programas para su utilización; es decir, se puede discriminar la data que se se necesita para poder usarla en otros programas referentes.

En este caso, se utilizará VBA para seleccionar el rango de celdas deseado y enviar la data que se  tiene en él para poder enviarlo adjunto en un correo, que para efectos del programa se utilizará el programa referente Microsoft Outlook.

Es necesario primero, activar en la pestaña referencia la opción del Microsoft Outlook habilitado en ese momento. Para ellos ingresaremos a nuestra interfaz VBA luego a herramientas, referencia y marcamos la versión de Microsoft Outlook, de esta manera:

adadas2

(Para mayor visualización de la imagen, hacer click en la misma)

Una vez habilitada la referencia a Microsoft Outlook, abrimos un módulo en el cual desarrollaremos el código para la macro:

Primero:

- Se declaran las variables necesarias

Dim OLApp As Outlook.Application
Dim OLMail As Object

Nótese que una vez se declaró la referencia, se nos dispone de mayor diversidad de declaraciones, por lo que declaramos nuestras variables, la primera haciendo referencia al programa  y la segunda como el objeto (correo) de dicha aplicación.

Segundo:

- Mediante la macro, se extraerá y copiará la data de un rango de celdas en específico( desde A1 hasta C4), la cual será guardada temporalmente en un dirección de Excel específica para luego ser usada.

Sheets(“Revenue Table”).Range(“A1:C4”).Copy
Workbooks.Add
Range(“A1”).PasteSpecial xlPasteValues
Range(“A1”).PasteSpecial xlPasteFormats
ActiveWorkbook.SaveAs ThisWorkbook.Path & “\TempRangeForEmail.xlsx”

Tercero:

- Es necesario que nosotros tengamos ya nuestros datos registrados en nuestra cuenta de Oulook, ya que se procederá a ordenar que la macro inicie sesión e inmediatamente envíe el mensaje que deseamos, dicha macro tomará la información por defecto registrada en su cuenta de Outlook ( por lo que se le indica que debe estar ya configurado su correo con los datos propios pertinentes)

Set OLApp = New Outlook.Application
Set OLMail = OLApp.CreateItem(0)
OLApp.Session.Logon

Así, se iniciará sesión automáticamente a Outlook, esta macro hará referencia al botón de nuevo mensaje que cualquier mensajería electrónica usa.

Cuarto:

-  Una vez estructurada la ruta macro para la apertura de nuestro Outlook, procedemos a construir el "correo" que enviaremos, donde indicaremos, al dirección a ser enviada, de hecho, si también se realizarán copias de la misma, etc.

With OLMail
.To = “123pucp@outlook.com; info123pucp@pucp.edu.pe”
.CC = “correocopia@pcp.pe”
.BCC = “correocopia2@pcp.pe”
.Subject = “Correo Prueba Macros Excel”
.Body = “Se envía adjunto el rango de celdas solicitado”
.Attachments.Add (ThisWorkbook.Path & “\TempRangeForEmail.xlsx”)
.Display
End With

Como se puede apreciar en el código, hacemos referencia a los destinatarios, tanto los principales como las copias, además el título del mensaje, el cuerpo del correo. Luego, la dirección temporal asignada a nuestra data en el archivo excel solicitado; además existen dos opciones, la opción .display y .send, la primera hará un revisión del correo a enviar, la segunda enviará el correo automáticamente sin hacer una previa revisión del correo.

Quinto:

- Una vez enviado el correo, por razones de seguridad es preciso no dejar los archivos temporales acumulándose sin uso alguno, por lo que una manera práctica de gestionarlos es eliminándolos. Para ello se usa el siguiente código:

ActiveWorkbook.Close  Save Changes = True
Kill ThisWorkbook.Path & “\TempRangeForEmail.xlsx”

Sexto:

- Naturalmente es necesaria la limpieza de la memoria de nuestra macro:

Set OLMail = Nothing
Set OLApp = Nothing

Finalmente nuestra macro puede ser asignada a un botón dinámico o simplemente asignada a un comando de tecla ( sin utilizar) para automatizar nuestro trabajo.

Sub Enviar_rangodeceldas_xcorreo()

Dim OLApp As Outlook.Application
Dim OLMail As Object

Sheets(“Revenue Table”).Range(“A1:C4”).Copy
Workbooks.Add
Range(“A1”).PasteSpecial xlPasteValues
Range(“A1”).PasteSpecial xlPasteFormats
ActiveWorkbook.SaveAs ThisWorkbook.Path & “\TempRangeForEmail.xlsx”

Set OLApp = New Outlook.Application
Set OLMail = OLApp.CreateItem(0)
OLApp.Session.Logon

With OLMail
.To = “123pucp@outlook.com; info123pucp@pucp.edu.pe”
.CC = “correocopia@pcp.pe”
.BCC = “correocopia2@pcp.pe”
.Subject = “Correo Prueba Macros Excel”
.Body = “Se envía adjunto el rango de celdas solicitado”
.Attachments.Add (ThisWorkbook.Path & “\TempRangeForEmail.xlsx”)
.Display
End With

ActiveWorkbook.Close  Save Changes = True
Kill ThisWorkbook.Path & “\TempRangeForEmail.xlsx”

Set OLMail = Nothing
Set OLApp = Nothing

End Sub

De esta manera, se estructuraría nuestra macro para el envío de información específica adjunta a través de un correo electrónico.

Saludos.

Oliver Giancarlo

 

7 comentarios

  1. Hola Oliver,
    Tu macro me es de mucha ayuda, pero necesito saber como pudiera hacer que el rango que se envía sea el área de impresión de la hoja y que además pueda enviarse el adjunto como imagen!
    Por favor ayúdame!

  2. usando la opccion de display, hay algun condicion para si despues de haber abierto el email, yo decidiera cerrar el email o cancelarlo, vba me indique que el email no se envio ya sea con un msgbox o en una celda . gracias

  3. hola, me marca error el algunas paginas

    Sheets(“Revenue Table”).Range(“A1:C4”).Copy
    me marca error de sintasis
    el editor me lo marca en rojo al igual que:
    .To = “correo@gmail.com”

    .Subject = “Correo de prueba”
    .Body = “Se envía adjunto el rango de celdas solicitado”

    ActiveWorkbook.Close Save Changes = True

    ya active la casilla pestaña referencia la opción del Microsoft Outlook, solo que es version 15

    como lo puedo corregir, soy de Mexico, por si sirve de algo este dato (por cuestion de regiones y configuraciones)

    mil gracias por la atencion

    • quise decir lineas, en lugar de "paginas"

  4. Hola;

    Como puedo hacer que dentro de un rango de datos se envien diferentes correos de manera automatica a difertentes destinatarios, es decir que filtre por correo y envie ese rango de datos y asi vaya filtrando hasta terminar los registros?

    muchas gracias por su atencion

  5. Me marca error de un error que dice User-Defined type not defined

    podrias ayudarne

    te agradezco

  6. Tengo una hoja de excel que se alimenta de datos externos, los cuales se actualizan de forma automática. Tras editar esos datos, si alguno cumple unos criterios impuestos, me lo coloca en una tabla. También he desarrollado una macro que al ejecutarse me manda esa tabla por email. Me gustaría que cuando se coloque algún dato en la tabla, excel me mande la tabla por email automáticamente. Es decir que mientras esté la tabla vacía no haga nada, pero cuando se coloque un valor en una casilla, excel me mande un email con esta tabla. La tabla se llama Tabla4, se encuentra en la Hoja2, y su extensión es O2:X11 (cabecera incluida). ¿Teneis alguna idea de como construir esta macro?

Deja una respuesta

Los campos requeridos estan marcados con *.