jueves, 7 de diciembre de 2017

VBA: Enviar Rango a Destinatario de correo

Una opción ya en desuso de Excel es el envío a destinatario de correo, que permite adjuntar un rango de celdas seleccionado en el cuerpo de un email, gestionado todo desde nuestra aplicación Excel favorita.

Para las últimas versiones deberemos sacar a la luz el enterrado botón que habilita esta posibilidad;
así pues desde el desplegable de la barra de herramientas de acceso rápido > Más comandos... > Todos los comandos > Enviar a destinatario de correo

VBA: Enviar Rango a Destinatario de correo



Una vez sacado el botón, podemos ejecutarlo, lo que nos llevará a la siguiente ventana... desde donde controlaremos el destinatario/s, el asunto o una breve introducción (en sustitución del típico cuerpo de un email).

VBA: Enviar Rango a Destinatario de correo



Accediendo a Outlook podremos comprobar el envío de dicho email:

VBA: Enviar Rango a Destinatario de correo



Este mismo proceso lo podemos replicar desde nuestra programación y así poder automatizarlo...

Así pues añadimos la siguiente macro dentro de un módulo estándar de nuestro proyecto de VB:

Sub Enviar_Rango_a_Destinatario_de_correo()
   
'Seleccionamos el rango de celdas a enviar Select
ActiveSheet.Range("A1:B5").Select

' Show the envelope on the ActiveWorkbook.
ActiveWorkbook.EnvelopeVisible = True

'Llamamos al envío...
With ActiveSheet.MailEnvelope
   .Item.To = "excelforo@excelforo.com"
   '.Item.cc = "cursos@excelforo.com"            'con copia a...
   '.Item.bcc = "consultoria@excelforo.com"      'con copia oculta a...
   .Item.Subject = "Asunto: Envío rango de Excel por email"
   .Introduction = "Ejemplo de rango adjunto con formato..."
   .Item.Send
End With
End Sub



Al ejecutarlo verificaremos que el resultado es equivalente...

46 comentarios:

  1. Muchas gracias por esta entrada Ismael! Estoy intentando ejecutar esta macro pero me da el siguiente error: "class does not support Automation or does not support expected interface". El código falla en la línea "With ActiveSheet.MailEnvelope".
    Me gustaría utilizar esta función de Excel "envío a destinatario de correo" automatizando los correos a adjuntar así como el asunto.
    Espero que me puedas echar una mano. Gracias!

    ResponderEliminar
    Respuestas
    1. Hola!
      ¿¿??, no sabría decirte con certeza
      ¿con qué versión de Excel trabajas?...

      Saludos

      Eliminar
    2. Pues no hay ningún motivo para el fallo..salvo que tengas alguna librería/referencias como FALTA.
      Entra en el editor de VB > menú Herramientas > REferencias y busca si hubiera alguna marcada como FALTA o cualquier otra cosa 'rara'

      Es lo único que ahora mismo se me ocurre

      Saludos y suerte!

      Eliminar
    3. Funciona de lujo y a la primera, solo que teneis un correo mio por el error. ;)

      Le estoy modificando para que pueda serme útil, pero a funcionado genial. Gracias por el aporte.

      Eliminar
    4. :DD
      si, me llegan muchos por no quitar mi dirección
      ;-)

      Un saludo

      Eliminar
    5. Y cual seria el codigo para poder adjuntar una imagen adjunta

      Eliminar
    6. Hola, qué tal?
      un placer saludarte igualmente...

      Puedes usar la propiedad
      .Attachments.Add Ruta_de_la_imagen

      Puedes ver un ejemplo de doc adjunto en
      https://excelforo.blogspot.com/2015/09/vba-adjuntar-hoja-activa-como-pdf-al.html

      Slds

      Eliminar
    7. hola gracias por la pronta respuesta, pero me gustaría usar el código en el cual se adjunta un rango de celdas y sumado pueda enviar una imagen; tomando la ubicación del archivo alojado en una celda, creeme he intentado varias cosas y logro agregar el codigo correcto a tu ejemploe.

      Sub Enviar_Rango_a_Destinatario_de_correo()
      02

      03
      'Seleccionamos el rango de celdas a enviar Select
      04
      ActiveSheet.Range("A1:B5").Select
      05

      06
      ' Show the envelope on the ActiveWorkbook.
      07
      ActiveWorkbook.EnvelopeVisible = True
      08

      09
      'Llamamos al envío...
      10
      With ActiveSheet.MailEnvelope
      11
      .Item.To = "excelforo@excelforo.com"
      12
      '.Item.cc = "cursos@excelforo.com" 'con copia a...
      13
      '.Item.bcc = "consultoria@excelforo.com" 'con copia oculta a...
      14
      .Item.Subject = "Asunto: Envío rango de Excel por email"
      15
      .Introduction = "Ejemplo de rango adjunto con formato..."
      16
      .Item.Send
      17
      End With
      18
      End Sub

      Eliminar
    8. Se trata de juntar ambas macros..
      En todo caso ya he comprobado que lo has conseguido, por que me ha llegado un email con la imagen y el rango ajdunto...
      Saludos

      Eliminar
  2. Hola Ismael, te he enviado como 10 adjuntos jajajaja, una pregunta, tendras el codigo para aparte de enviar el rango, se adjunte ese mismo workbook? yo tengo uno, lo puse pero no funciono.

    *Attachments.Add ActiveWorkbook.FullName

    No se que codigo usar para adjuntar el archivo tambien,

    Nita: Me funciono muy bien el codigo.

    Gracias!!

    ResponderEliminar
    Respuestas
    1. Hola Ulises
      :DD
      en realidad 31 :DD (estoy acostumbrado.. diariamente me llegan unos pocos)

      Pues en realidad te debería funcionar...
      prueba con paréntesis
      .Attachments.Add (ActiveWorkbook.FullName)

      Saludos

      Eliminar
  3. Buenos días,

    tengo una macro que envia el correo automaticamente.

    pero necesitaria lo siguiente:

    tengo varias ventas en una hoja de excel y necesitaria que en la misma macro se agruparan las ventas por cliente y luego se le enviaran todas juntas como body del email

    un ejemplo:

    Juan realizo 4 compras
    Roberto 10
    Andres 3
    y las tengo todas ordenadas por fecha.


    necesitaria que la macro ordenara por cliente y luego hiciese algun tipo de loop, si tengo un cliente cliente con una sola venta enviar correo, luego seguir hasta el proximo cliente si tiene 2 ventas enviar correo con dos ventas y asi hasta que se termine por completo de verificar todos los campos seria posible?




    saludso

    ResponderEliminar
    Respuestas
    1. Hola,
      claro... todo es posible ;-)

      Pero cuál es la duda concreta que evita que sigas???

      Slds

      Eliminar
  4. Hola yo tengo una duda :/ si quisiera que la macro solamente me copiara el rango seleccionado , pero me lo dejará sin enviar, cómo seria? es decir, primero selecciona el rango, copia y después pega la imagen en el cuerpo de un correo y quue hasta ahí se detenga, me ayudan :(

    ResponderEliminar
    Respuestas
    1. Hola Manuel
      solo quita la línea 16 del código
      donde dice:
      .Item.Send

      Saludos

      Eliminar
    2. Hola he estado intentando resolverlo, pero me sale el siguiente recuadro :
      " Se ha producido el error '-2147319779(8002801d)' en tiempo de ejecución:

      Interfaz no compatible

      Ese es el mensaje que me sale, y el código que usé fue el siguiente :

      Sub Correo()

      ActiveSheet.Range("C16:L32").Select


      ActiveWorkbook.EnvelopeVisible = True


      With ActiveSheet.MailEnvelope
      .Item.to = ""
      .Item.Subject = ""
      .Introduction = ""
      End With
      End Sub

      Eliminar
    3. Lo resolví utilizando un on error goto , pero amm ahora tengo otra duda jaja como supongamos que el usuario no quiere enviar el correo, que le dio click por accidente , hay alguna manera de cerrarlo? sin necesidad de darle click en enviar?

      Eliminar
    4. Hola MAnel
      no entiendo.... te refieres una vez enviado el email???

      Eliminar
  5. Hola Ismael
    Intento enviar un rango que no se encuentra en la hoja principal. He conseguido hacerlo pero de vez en cuando me da "Error en el método Select de la classe Range.
    Adjunto lo que he hecho:

    Sub Enviar_correo_a_Roser()

    Sheets("roser").Range("a1:G9").Select
    ActiveWorkbook.EnvelopeVisible = True

    With Sheets("roser").MailEnvelope
    .Item.To = "mmmmmmm@gmail.com"
    .Item.Subject = "Asunto: Tens un missatge..."
    .Introduction = "Trucades de telèfon"
    .Item.Send
    End With

    End Sub

    ResponderEliminar
    Respuestas
    1. Hola!
      muy raro... entiendo siempre existe la hoja 'roser' ??
      Prueba a separarlo en dos líneas
      Sheets("roser").select
      Range("a1:G9").Select

      quizá así funcione mejor...

      Slds

      Eliminar
  6. Hola Ismael,
    Cómo podría hacer para que seleccione dos rangos, pero necesito que uno de ellos sea predeterminado, ya que es donde van los títulos, y el rango otro rango no lo sea, sino que tome el rango que tengo seleccionado actualmente en la hoja activa.
    Gracias desde ya.

    ResponderEliminar
    Respuestas
    1. Hola Victor,
      el problema de este método es que siempre envía lo seleccionado de la hoja activa...

      Para otras opciones habría que usar otros métodos de envío.. básicamente consistiría en crear un libro nuevo con el rango copiado y adjunto al email...

      :(

      No muy práctico pero...
      Saludos

      Eliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Hola Ismael,

    Estoy intentando usar el codigo que nos compartiste, pero me aparece el siguiente error:

    Method 'MailEnvelope' of object '_Worksheet' failed

    Sabes cual podria ser la razon?

    ResponderEliminar
    Respuestas
    1. Hola Dorothy,
      este es un método que sigue siendo válido hoy día... y funciona sobre la hoja activa Activesheet...
      No sabría darte una respuesta alternativa a lo expuesto en otros comentarios.
      Saludos

      Eliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Hola, me ocurre igual que a Dorothy. Pongo lo siguiente

    ActiveSheet.Range("C16:L32").Select


    ActiveWorkbook.EnvelopeVisible = True


    With ActiveSheet.MailEnvelope
    .Item.to = ""
    .Item.Subject = ""
    .Introduction = " "
    .Item.Send
    End With
    End Sub

    Y me sale lo siguiente:
    Method 'MailEnvelope' of object '_Worksheet' failed

    Esto solo me ocurre cuando utilizo un ordenador con la versión de Excel y Outlook 2013, si lo ejecuto en otro con la 2010 no le da ningún problema. He revisado la referencias que tiene activas uno y otro y son las mismas.
    Si me pudierais ayudar, os lo agradecería :)

    ResponderEliminar
    Respuestas
    1. Hola Ángela,
      he probado, por si acaso, con versiones 2010,2013 y 2016 y funciona bien
      Algo obvio, ¿Tenéis cuenta de email en Outlook activa?

      Envíame el fichero a
      excelforo@gmail.com
      y lo reviso.. algo os está pasando ¿¿??

      Saludos

      Eliminar
  11. Hice unas modificaciones. Al igual que uno de los comentarios de arriba necesito algo más complicado. En una hoja de Excel tengo todas las facturas de mis clientes pendientes de pago. Un cliente me debe 1 factura, otro me debe 30. Lo que intento hacer )con buscarv, indice y coincidir) que en la hoja resumen se pongan todas las facturas de cierto cliente y luego mandar un rago de filas que para el cliente de una sola factura, llevará una larga sección de celdas en vacío.

    Cuando finalmente tenía todo configurado, intento ejecutar la macro, y todo aparentemente funciona, pero al entrar a las cuentas de correo (que yo sí tuve la precaución de cambiar) no aparece nada.

    ¿Alguna idea?

    ResponderEliminar
    Respuestas
    1. Hola!
      te refieres que al ir a Enviados de tu Oulook no ves lo enviado??
      Tendría que ver el fichero o la macro para verificar.. pero si no te salta ningún error es complicado darte una explicación
      ...
      Gracias

      Eliminar
  12. Estimado en la parte de ActiveWorkbook.EnvelopeVisible = True me da error y en el depurador me aparece como que el valor otorgado es false antes me funcionaba mi Excel es 2016

    ResponderEliminar
    Respuestas
    1. Hola!
      solo puedo referirte a comentarios previos de hace pocos días...

      A fecha de hoy, en versiones 2010,2013 y 2016 sigue funcionando (al menos a mí) con W10.

      Slds

      Eliminar
  13. tengo una duda, nesesito que se mande masivamente a vasios correos como puedo integrar una seleccion de celdas donde esten los correos.

    saludos

    ResponderEliminar
    Respuestas
    1. Hola qué tal?
      puedes aplicar un bucle que recorra el rango con los distintos correos y sustituir la variable en .Item.To
      ....
      for each destino in range("A1:A10")
      With ActiveSheet.MailEnvelope
      .Item.To = destino
      ....
      next destino

      suponiendo que en A1:A10 tienes los correos.. debería funcionar

      Saludos

      Eliminar
  14. Buenos días estimado. Espero se encuentre bien.
    Antes que nada, debo agradecerle el valioso aporte que hizo con este video.
    En mi caso funciona de maravilla, pero le quería preguntar.
    ¿Como puedo hader, para que dicho correo pueda ser editado por el destinatario?
    Esta consulta es debido a que en mi caso yo envió registros a los cuales le faltan datos. Los cuales son suministrados por un cliente.
    Desde YA MUY AGRADECIDO

    ResponderEliminar
  15. Hola, buen día.
    La opción "Enviar a destinatario de correo" me aperece en gris en excel, no puedo seleccionarla pese a que la agregué ¿Sabes qué puede ser el problema?

    Mil graias!

    ResponderEliminar
    Respuestas
    1. Hola!
      quizá tengas una celda editada o seleccionado algún objeto...
      De momento la utilidad sigue siendo operativo.
      Lo acabo de comprobar por si acaso
      Saludos

      Eliminar
    2. Tengo el mismo problema agrego el boton pero no me lo deja usar, entiendo que tiene que ver con la configuracion de correo

      Eliminar
    3. Podría tener con la configuración de Outlook (¿?), en mi caso no tengo nada especial en ésta, y funciona en diferentes versiones
      Slds

      Eliminar
  16. Hola!!

    No se si me puedes ayudar requiero enviar correos con dos o mas destinatarios en cc pero de la forma en que la tengo programado solo me trae uno solo y no ambos.

    .To = FILTRO_REPORTE_CORREO
    .Cc = FILTRO_REPORTE_CORREO1
    .Cc = FILTRO_REPORTE_CORREO2

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola!
      podrías concatenar ambos correos
      .CC=email1 & ";" & email2

      debería funcionarte
      Saludos

      Eliminar
  17. Hola Ismael!
    te consulto, en mi outlook tengo configurada más de una cuenta,
    con que código especifico de cual quiero que se envíe el correo?


    muchas gracias!
    saludos

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      la próxima semana publico al respecto...
      ;-)

      Saludos cordiales

      Eliminar
  18. Buen día, gracias por el Video. Tengo un problema, ya que corre la macro sin niguna interrupción pero no se envía ningún correo. Tengo abierta la sesión en Excel pero sale un error en el icono minimizado de Outlook "otro programa esta usando outlook". Agradecería cualquiera ayuda. Saludos Lo probé también en otro pc y sale igual.

    ResponderEliminar
    Respuestas
    1. Hola,
      solo se me ocurre que trates de enviarlo empleando el botón estándar de Excel para enviar un rango adjunto (sin macros) y ver lo que ocurre...
      En principio no debería fallarte
      Quedo atento
      Slds

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.