Ir al contenido principal

macros: como enviar mails desde Excel (vba)

Un gran amigo "on-line", Johan Moreno, de Colombia, me hizo llegar la inquietud de cómo enviar mails desde Excel. Si bien contaba con algunas líneas de código sobre el particular, decidí retomar mi ejemplo y adaptarlo mejor a las circunstancias. Hace unos minutos termino de remitirle un correo con la solución a Johan... desde Excel y con un archivo adjunto, mismo que transcribo a continuación para ayudar a todos con esta tarea.

Veamos primero las dos formas principales de enviar mails: mediante Outlook o nuestro Web Mail (yahoo, gmail, hotmail, etc, etc) No soy usuario de Outlook en lo absoluto: no confío en los agujeros de seguridad que continuamente aparecen y, por otro lado, teniendo a mi alcance una herramienta tan poderosa (y gratuita) como Gmail, la cual ahora también permite sincronizar los mensaje con la Pc para verlos offline (deben activarlo en "google labs")... no creo que me haga usuario ni hoy ni mañana. Igualmente mas adelante daré una solución para aquellos que "no les queda otra", lo cual generalmente se produce por motivos laborales.


[+/-] Ver el resto / Ocultar

Comentarios

  1. HOLA Amigo solo intento que con este codigo en un archivo de ejemplo y trabaja muy bien, lo que intento es que pueda enviar supongamos la hoja1 y la hoja2 adjunto en un archivo que se agregue automaticamentre al correo...

    ResponderEliminar
  2. bueno johan, perfecto.
    me tenés que decir cual de los dos códigos utilizarás (el de outlook o el otro) y vemos como agregar esas dos hojas. fijate que en el ejemplo que te pasé la primer vez, creo un nuevo archivo con las dos hojas y lo adjunto. mirá si te sirve ese forma y avisame

    ResponderEliminar
  3. la solucion al problema planteado por johan fué la siguiente: copio las dos hojas en un nuevo libro, guardo ese nuevo libro con el nombre "ArchivoAdjunto.xls" (o el que le convenga al usuario) y luego lo envío por mail, utilizando el siguiente comando:
    Email.AddAttachment ("C:\ArchivoAdjunto.xls")
    obviamente que la ruta puede cambiarse en forma dinámica, según las necesidades de cada uno

    ResponderEliminar
  4. Hola,

    no me funciona.

    usando el puerto 465 me sale el error:
    "Error -2147220973 The transport failed to connect to the server"
    usando el puerto 25 me sale el error:
    "Error -2147220975 The message could not be sent to the SMTP server. The transport error code was 0x80040217. The server response was not available."

    sabes que puedo estar pasando?

    Muchas gracias!!!

    ResponderEliminar
  5. deberías enviarme el archivo la direccion de mail que figura al pié del formulario, así lo pruebo en mi pc y verifico que no tengas algún problema de conexión.
    pasamelo y vemos como resolverlo. gracias x tu mensaje

    ResponderEliminar
  6. Hola. Muchas gracias por el código, funciona perfectamente. Muy bueno.

    Saludos,

    Ramón.

    ResponderEliminar
  7. Muchas gracias Ramón x tu comentario. Un abrazo.

    ResponderEliminar
  8. hola amigo me urge aprender como usar esta macro; pero con salida desde el outlook, tu crees poder ayudarme

    ResponderEliminar
  9. Buenos días excelente BLOG.
    Seria posible mandar dicho correo y en el campo asunto insertar el contenido de una celda del archivo remitido?
    Gracias. Feliz AÑO nuevo.

    ResponderEliminar
  10. bueno estimado, me vas a tener que dar un tiempo para levantar la entrada al respecto, así de paso queda el ejemplo en el blog y pueden utilizarlo todos los lectores.

    ResponderEliminar
  11. Es posible. Estimo que la forma mas sencilla es abrir el archivo y almacenar el "asunto" en una variable, cerrar el archivo y enviar el mail.
    te paso un pequeño código, adaptá la ruta y que celda necesitas leer para que funcione correctamente:

    'abro el archivo que anexaré:
    Workbooks.Open Filename:="C:\ElArchivoQueSea.xls"
    'aqui guardo el contenido de la celda A2 para usarlo en
    'el asunto de mail
    asunto = Range("a2").Value
    ActiveWindow.Close
    'y sigue el código para enviar el mail

    espero que te sirva, cualquier cosa me avisas
    gracias x el mensaje

    ResponderEliminar
  12. Hola Damian, gracias por tu respuesta, no es exactamente lo que busco.
    Te paso el código que tengo, de echo es para mandar correos utilizando Outlook, quisiera no tener que abrir el archivo como tu indicas:
    Sub OutlookMailExcelAdjunto()
    Dim OutApp As Object
    Dim OutMail As Object

    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.logon
    Set OutMail = OutApp.CreateItem(0)

    ActiveWorkbook.Save

    On Error Resume Next
    With OutMail
    .To = ""
    .CC = ""
    .BCC = ""
    .Subject = "(que esto haga referencia a una celda del archivo)"
    .Body = "Adjunto a este correo os mando el control de kilometraje e incidencias del vehículo utilizado en mi jornada laboral, recibir un cordial saludo "
    .Attachments.Add ActiveWorkbook.FullName
    .Send
    End With
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
    End Sub

    ResponderEliminar
  13. Buenas, me funciona perfecto el codigo, lo malo que al momento de mandar el correo, me aparece un cuadro de advertencia que dice sobre un posible virus, al apretar que si me manda el correo en caso contrario obviamente no lo manda, mi consulta es como controlo esto si el codigo esta dentro de un archivo que se ejecutara por tarea programada, no se como controlar esta situacion
    De antemano muchas gracias

    ResponderEliminar
  14. Hola estimado. Ahora veo que estás adjuntando el propio archivo desde donde se ejecuta la macro ¿no? Si es así, antes de darle al método Send habría que tomar el "asunto". Supongamos que dicha cadena de texto está en la celda A1:
    Sub OutlookMailExcelAdjunto()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim Asunto as String

    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.logon
    Set OutMail = OutApp.CreateItem(0)

    'aqui es donde guardas el libro:
    ActiveWorkbook.Save

    'y acá comienza el "proceso de envío"
    'en una variable guardo el contenido de A1
    Asunto = Range("A1").Value
    On Error Resume Next
    With OutMail
    .To = ""
    .CC = ""
    .BCC = ""
    'y agregamos la variable:
    .Subject = Asunto
    .Body = "Adjunto a este correo os mando el control de kilometraje e incidencias del vehículo utilizado en mi jornada laboral, recibir un cordial saludo "
    .Attachments.Add ActiveWorkbook.FullName
    .Send
    End With
    On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing
    End Sub

    Fijate si te funciona y me avisas.

    ResponderEliminar
  15. por el tema del aviso sobre el virus me enviaste un correo, te contesto por esa vía (ya que tengo algunas dudas) y luego posteamos aquí la solución.

    ResponderEliminar
  16. Formidable Damian, el tema del asunto funciona a la perfección. Muchas gracias.

    ResponderEliminar
  17. Hola Damian de nuevo.
    Para que en el asunto tenga varios valores de varias celdas, que modificación debería realizar??
    Muchas gracias.

    ResponderEliminar
  18. Hola estimado. Habría que ver cuantas celdas hay en juego. Si son unas pocas, podés concatenar en una variable el contenido de dichas celdas, por ejemplo:
    Asunto = Range("a1") & " " & Range("a2") & " " _
    & Range("a3") & ", " & Range("a4")

    En "Asunto" quedaran almacenados los valores presentes en los 4 rangos. Fijate que a cada valor lo separo con un espacio y al ultimo, con una coma. Armalo de acuerdo a tus necesidades, ya que es solo de ejemplo y para que veas como se pueden agregar caracteres intermedios.
    Suerte y cualquier cosa me avisas.

    ResponderEliminar
  19. Damian: en primer lugar felicitarte no solo por el contenido sino por la calidad y calidez con la que respondes.
    La segunda es solicitarte ayuda. Tenemos en un libro de exel cerca de 800 contactos que pertenecen a una institución benefica sin fines de lucro. En dicha lista hay miembros mujeres, hombres, menores de edad, mayores, de distintas provincias, etc. Nosotros enviamos quincenalmente info a miembros de esa lista, dependiendo la edad, lugar de residencia, ect. Esta lista queda exportada a una hoja del mismo libro.
    La pregunta es, teniendo en cuenta la macro con la que inicias este blog, (con webmail) como podemos hacer para utilizar el rango en donde se encuentran las direcciones de mail como lista de distribución ya que como esta presentado deberíamos ir cargando uno por uno.
    Disculpa la molestia, es que lo poco que hacemos lo hacemos a pulmon y no tenemos mucha experiencia en macros.
    Más allá de tu respuesta te agradezco lo que puedas hacer.
    atte
    jose juan alvarez
    alvarezjo@ufasta.edu.ar

    ResponderEliminar
  20. Jose: hacer lo que necesitas es posible y no requiere de muchos cambios, pero necesitaría que me envíes un ejemplo de la tabla en donde están esas direcciones de correo electrónico, así armo el ejemplo en base a ella.
    Gracias y quedo a la espera de tus novedades.

    ResponderEliminar
  21. Hola Damian muy buenos dias,

    Me cayo como anillo al dedo este foro, tengo la siguiente rutina:



    Sub DHL()
    Application.ScreenUpdating = False
    ruta = "Z:\Usuarios\Logistica\Supply Chain Management\Material Planning\Conteos Cíclicos\Edgar Ureña\5 Herramientas\Ordenes de Embarque\Ordenes de Embarque DHL"
    nbre = "Orden de embarque DHL " & Format(Now, "dd-mm-yy hh mm ss")
    ActiveSheet.Copy
    Application.DisplayAlerts = False
    Set wb = ActiveWorkbook
    On Error Resume Next
    With wb
    .SaveAs ruta & "\" & nbre & ".xls"
    .Close True
    End With
    Set wb = Nothing
    Application.DisplayAlerts = False
    Sheets("Hoja1").Select
    End Sub


    Esto corre muy bien, solo que ahora necesito que el libro nuevo que se genera se envie por outlook en ese momento al email x@x.com , creo que es algo tan simple que yo no he podido programar jaja, espero que me puedas ayudar, un abrazo amigo.


    Edgar Ureña

    edgar.urena@sas-automotive.com

    ResponderEliminar
  22. Hola Edgar, gracias x tus palabras.
    En esta entrada: http://damianexcel.blogspot.com/2012/01/como-enviar-mails-desde-excel-con.html
    explico como utilizar Outlook a traves de Excel.
    Podes adaptar ese código a tu proyecto, definiendo:
    1) dirección de correo (x@x.com)
    2) asunto
    3) cuerpo del mensaje
    4) archivo a enviar (que ya lo tienes generado)

    si necesitas mas ayuda avisame, que veo como juntas ambos procedimientos y te lo hago llegar x mail
    Un abrazo

    ResponderEliminar
  23. Lo olvidaba, si tambien me pudieras orientar en como indicar en la rutina que el libro que se guarda lleve solo valores para hacerlo mas ligero te lo agradeceré.

    Saludos.

    Edgar Ureña

    edgar.urena@sas-automotive.com

    ResponderEliminar
  24. Edgar: con la instrucción Activesheet.copy Excel crea automaticamente otro libro, llevando a éste nuevo todo el contenido de la hoja activa.
    Saca del procedimiento ese: "Activesheet.Copy"
    y reemplazalo por esto:
    'copio todas las celdas del libro activo:
    Cells.Copy
    'creo un nuevo libro
    Workbooks.Add
    'y solo pego los valores
    Cells.PasteSpecial xlPasteValues
    'quito la seleccion de la copia
    Application.CutCopyMode = False

    y que siga el procedimiento, que todo funciona correctamente.
    cualquier cosa me avisas.
    un abrazo

    ResponderEliminar
  25. Buena tarde Sr. Damián:
    Internet tiene sinfín de recursos, mas, tras varios años, mi búsqueda para obtener apoyo en código informático, sobre todo para VBA (actualizado) había sido infructuoso.
    Leyendo las entradas en su foro, me asombro de la amabilidad y sobre todo prontitud con la que trata a sus visitantes.
    Esta es la primera página que combina, aparte de la amabilidad y prontitud en la respuesta, información clara y muy útil sobre el tema de Excel que en ninguna otra parte he encontrado, está obsoleta o incompleta.
    Pronto estaré enviándole mis dudas. Por el momento, aprovecho la ocasión para externarle mis felicitaciones por su utilísimo blog y trato.
    Jorge García
    Mérida, México
    (gaej220979@hotmail.com)

    ResponderEliminar
  26. Jorge: agradezco infinitamente tus palabras, son de gran aliento y apoyo para la tarea que me propuse con el Blog.
    Mas allá de las entradas básicas que no pueden faltar en todo sitio de Excel que se precie como tal, trato de escribir sobre aquello que me hizo "renegar" mucho hasta encontrarle la "vuelta" y, como vos bien decís, no existe demasiada documentación al respecto; aparte me gusta sacarle el jugo a las "cosas raras" que el mundo de las macros nos pone a nuestro alcance.
    Intento ser lo menos técnico posible (salvo que algún lector me requiera lo contrario), ya que como leí en un libro de stephen hawking: "-mi editor me alertó que por cada función pierdo el doble de lectores"... jajaja, y es muy cierto.
    Me pone muy contento poder lograr ese cometido.
    Gracias y a tus órdenes por cualquier cosa en la que pueda ayudarte.
    Un abrazo.

    ResponderEliminar
  27. Buena noche Sr. Damián:
    Como comentaba en mi primer mensaje (del cual agradezco su respuesta, muy cierta en su filosofía), aquí va mi primera duda:
    Probando el código aquí publicado, resulta que comparto el mismo problema que un visitante anónimo envió el 25 de noviembre de 2010 en este foro.
    Haciendo los cambios en el código del dominio de GMail a Hotmail y del puerto del 465 al 25, se produce el siguiente error: "Error de transporte en la conexión al servidor".
    Aparentemente ese problema se resolvió aquí, pero no fue publicada la solución. ¿Podría decirme cuál es la solución?
    Muchas gracias.
    Jorge Gárcía

    ResponderEliminar
  28. Jorge: la verdad que no recuerdo de que forma solucionamos ese error, muchas veces el intercambio de datos finaliza aquí o bien cerramos el tema mediante correo electrónico.
    te pediría que por favor me pases el archivo en cuestión al correo que figura al pié del formulario, así lo reviso en "vivo" y desde mi propia PC.
    un abrazo

    ResponderEliminar
  29. Buenas, en primera quiero felicitarte por la calidad de tu blog, que ya me ha facilitado un par de ideas.
    Mi consulta es la siguiente, estoy utilizando el código que posteaste acá para enviar por correo un archivo de excel, pero al momento de envío sale un cuadro de advertencia del Outlook que dice:

    "Un programa esta tratando de enviar correo electrónico automáticamente en su nombre.
    ¿Desea Permitirlo?
    Si esto es inesperado, puede que sea un virus y debería elegir No"

    ¿Como puedo evitar que salga esta advertencia?

    ResponderEliminar
  30. mmejia: gracias x tus palabras sobre el blog.
    te comento: existen varias soluciones a ese problema, que nace en "opciones/centro de confianza/configurar centro de confianza/acceso mediante programación" de Outlook. Allí no reconoce debidamente al antivirus y se generan los inconvenientes. Seguí la ruta que te indiqué y habilitá la opción respectiva.

    si esto no te llegara a funcionar, te brindo dos soluciones que me dieron los propios lectores del blog:
    1)Damian: la solucion que encontre fue
    "ClickYes Pro 2010"
    sacado en su version evaluacion de http://www.contextmagic.com/express-clickyes/
    este s/w te elimina el mansaje dandole q si
    saludos.

    2) luego de la instrucción .Send, escribí lo siguiente:
    Application.SendKeys "%(r)"
    Application.SendKeys "%(r)"
    lo que hace sendkeys es "enviar" la presión de una tecla, en este caso el alt+r.

    cualquier cosa avisame. un abrazo.

    ResponderEliminar
  31. Hola Damián, felicidades por tu blog, ha sido de gran ayuda para muchas personas como yo.
    Tengo una consulta, es posible crear un boton que permita seleccionar la ruta del archivo a adjuntar, sin necesidad de hacerlo de manera manual. Algo como el boton examinar que utilizan muchas web para cargar archivos.
    Te agradezco de antemano

    ResponderEliminar
  32. Gracias por tus palabras. En realidad es muy sencillo y se puede lograr llamando a uno de los objetos de Excel: FileDialogs, como te muestro a continuación:
    Sub SeleccionarArchivo()
    Dim Fd As FileDialog
    Dim Ruta As String
    'seteo al objeto y lo muestro:
    Set Fd = Application.FileDialog(msoFileDialogFilePicker)
    'dejo seleccionar UN SOLO ARCHIVO
    Fd.AllowMultiSelect = False
    'si el usuario presionó "aceptar"
    If Fd.Show = -1 Then
    'almaceno la ruta del item seleccionado
    Ruta = Fd.SelectedItems(1)
    MsgBox Ruta
    End If
    'destruyo al objeto para liberar recursos
    Set Fd = Nothing
    End Sub

    en este Sub solo muestro la variable Ruta en un MsgBox (para que veas que funciona correctamente), pero vos podes usar esa variable para otros propósitos, como por ejemplo para anexar el archivo seleccionado al correo electrónico.
    cualquier duda me avisas. un abrazo

    ResponderEliminar
  33. hola damian!
    mi pregunta es la siguiente, estoy creando una macro para enviar varios correos a la vez. el problema es que para cada uno de los correos me aparece un cartel de advertencia del outlook al que le tengo que dar que si para enviar el mensaje. mi pregunta es como saco esa advertencia? y si vos ya lo probaste?

    ResponderEliminar
  34. Date una vuelta por la entrada que trata el tema de enviar mails desde outlook, allí hay varios comentarios con ese problema (que tiene origen en el centro de seguridad de la aplicación) y un par de soluciones.
    cualquier cosa me avisas.

    ResponderEliminar
  35. Damian el ejemplo para gmail funciona perfectamente per como poder utilzar tu ejemplo para los correos de hotmail se puede podrias comentarlo gracias

    ResponderEliminar
  36. Estimado: el ejemplo debería funcionar correctamente con cualquier servidor de correo, sea gmail, hotmail, yahoo, etc, etc.
    Cada webmail tiene su propio servido smtp y un nro de puerto específico a traves del cual trabaja.
    Busca en Google "smtp + puertos + hotmail" y vas a encontrar una gran cantidad de información al respecto.
    En la entrada puse a Gmail como ejemplo por que es el que habitualmente uso, pero configurando esos dos datos que te mencioné podrás manejar cualquier.
    Gracias x tu mensaje, cualquier duda o problema me avisas

    ResponderEliminar
  37. Hola Damian,he leido con interes la manera rapida y clara en la que nos ayudas (a los novatos).siguiendo el hilo, tengo un problema comunmente envio con una macro multiples correos con adjunto de excel (filtrado por por ejemplo proveedor) sin embargo necesito ahora que el adjunto se incruste dentro del cuerpo del mail y no como un adjunto de excel

    ResponderEliminar
  38. ¿Como seria eso de enviar un adjunto encrustado en el cuerpo del Mail.... y no como adjunto? Explicarme un poco mas por que no entiendo muy bien el planteamiento. Dame un ejemplo asi puedo "procesarlo" bien.
    Quedo al aguardo de tus noticias.

    ResponderEliminar
  39. disculpe tengo una duda soy algo nuevo en vba, hice una macro q adjuntara un archivo ed excel y lo enviara a un correo de outlook, mi duda es acerca de como adjuntar mas de un archivo, ya que la idea es adjuntar un archivo de excel y uno de word el cual es un resumen de tabla de una hoja de excel, necesito adjuntar los dos archivos y enviarlo al mismo correo

    gracias de antemano

    ResponderEliminar
  40. hola, mi duda es, como puedo hacer que los destinatarios los tome de una hoja de excel, digamos que mi lista empieza en A1

    ResponderEliminar
  41. Hola. Voy a intentar "modularizar" un poco la respuesta. Creo que realizando una función sería lo mejor. Colocá esto dentro del módulo en donde pusiste el código que envía el mail:

    Function UnirDestinatarios() As String
    Dim Destina As String
    Dim UltFila As Long

    'almaceno la ultima fila ocupada de la
    'columna A
    UltFila = Cells(Cells.Rows.Count, "A").End(xlUp).Row
    'y voy recorriendo las celdas
    For x = 1 To UltFila
    Destina = Destina & Cells(x, "A") _
    & ", "
    Next x
    'ahora quito la última coma:
    Destina = Left(Destina, Len(Destina) - 2)
    UnirDestinatarios = Destina
    End Function

    Ahora, dentro del procedimiento que envía el mail, hay que definir una variable (al comienzo)
    Dim Destinatarios a String

    Y antes de asignar las direcciones de correo electrónico, llamamos a la función creada, almacenando en la variable Destinatarios el resultado:
    Destinatarios = UnirDestinatarios
    y enviamos:
    Email.To = Destinatarios

    Cada mail va separado por una coma, estimo que te debería funcionar sin problemas. Seguí paso a paso las instrucciones y avisame.

    ResponderEliminar
  42. Hola Jonathan. Contesto tu pregunta:
    tenés que colocar la instruccion dos veces (para tu caso) indicando la ruta de ambos archivos.
    Ejemplo:
    .Attachments.Add "C:\kesimomayor2.xls"
    .Attachments.Add "C:\ManualKesimoMayor.doc"

    como habrás vistos utilizo dos veces la línea
    .Attachments.Add, en una enviando un xls y en otra un word. De esta forma podrás mandar dos archivos dentro de un mismo correo.
    cualquier cosa me avisas.

    ResponderEliminar
  43. Hola Damian, Tu blog ESTA MUY CHINGON!!! FELICIDADES.
    He seguido las dudas de todos y tus respuestas y me ayudo muchisimo, es lo que andaba buscando. La verdad muchas felicidades por tu aportacion.

    Solo tengo una duda. Ya logre adjuntar un archivo y se envio sin problema alguno. Pero crees que se pueda incrustar una imagen en JPG o BMP no como archivo adjunto sino que al abrir el correo junto al texto del saludo o del mensaj aparezca la imagen?
    Por darte un ejemplo: en outlook 2010, redactas un texto en el cuerpo del email, luego en el menu superior te vas a [insertar] ahi seleccionas el icono de [imagen] y de ahi con el explorador buscas y seleccionas la imagen y se incrusta directamente en el cuerpo del email.
    Saludos
    Francisco Hernandez

    ResponderEliminar
  44. Hola Francisco, gracias por tus palabras.
    Conozco un método que es el mas sencillo y requiere de muy poco código para funcionar, pero tiene una condición: la imagen debe estar cargada en la web. Estimo que esto hoy en día no supone ningún problema, con todos los servicios gratuitos de almacenamiento que existen.
    Una vez que tienes dicha imagen solo hay que agregar una línea de código:

    Mensaje.HTMLBody = "img src=http://www.joharigautier.com/blog/wp-content/uploads/2011/09/87caribe.jpg /"

    Al objeto lo llamo "Mensaje" (reemplazalo por el tuyo) y le aplico la propiead HTMLBody (cuerpo html), colocando un Tag "image", pasando como src la ruta en donde tengo alojada dicha imagen. Cabe destacar que a ese tag le puede agregar todas las propiedades: border, width, etc, etc, como lo haces al crear una página web.
    suerte y cualquier cosa me avisas.
    (ojo: a la instrucción le faltan las etiquetas de apertura y cierre de "image" (<>) por que blogger no me deja colocarlas)

    ResponderEliminar
  45. Muy buena tarde Sr. Damián:
    ¿Recibió mi respuesta con respecto a la clave de mi archivo de Excel? Se la envié el mismo dia que lo solicitó?
    Agradezco nuevamente el interés que demuestra por atender los casos de sus visitantes.

    Jorge García
    Mérida, México

    ResponderEliminar
  46. Hola Jorge: estuve trabajando con tu archivo, pero aún no doy en la tecla... sigue arrojando error.
    Pude ver que el servidor smtp está mal: no es "smtp.hotmal.com", sino "smtp.live.com"

    pero como te dije, aun tira errores.

    si no te funciona cambiando el servidor, te diría que pruebes con enviar el correo mediante outlook, sobre el cual tengo una entrada levantada.
    si puedo arreglarlo te aviso.

    ResponderEliminar
  47. Mirá, probando con mis distintas cuentas funcionó sin problemas desde Gmail, o sea que el inconveniente (cosa muy común en Microsoft) se da entre sus productos.
    Abrí una cuenta en Gmail y cambiá estos parámetros:
    smtp: smtp.gmail.com
    puerto: 465

    y listo, enviaras correos sin problemas

    ResponderEliminar
  48. Buenas Daniel excelente todos tus trabajos que has expuesto, la verdad que más de uno ya ma han sacado de apuro. Ahora mi consulta es lo siguiente: dispongo de una base de datos donde estan registrados el número de celular, el importe que adeuda y el respectivo nombre del cliente, existe alguna manera que pueda enviar mensajes (sms) desde excel.
    Saludos desde Paraguay

    ResponderEliminar
  49. Jaja, que buena pregunta la tuya.
    Te comento: me parece que tendrás que buscar de que forma puedes enviar, desde Paraguay, sms vía webmail. Si yo tengo, por ejemplo, que disparar un sms al celular 0111556432024 (de Argentina), algunas compañías me permiten hacer lo siguiente:
    1156432024@sms.algomas.com.ar
    Como verás, es el mismo nro de teléfono, pero sin el 0 del código de área ni el 15 del nro principal. Este mail va directo al celular, haciendo llegar el mensaje que especifiques en el body. Habría que ver como funciona en Paraguay, pero estimo que cambiando algunos detalles debería correr sin problemas.

    ResponderEliminar
  50. ¡¡¡Felicidades por tu ayuda, Damián!!!
    He realizado una hoja de cálculo para llevar el control y facturación de un comedor escolar. Entre otros datos tengo los correos electrónicos del padre y/o madre de cada alumno.
    Necesito enviar por correo electrónico u resumen mensual a final de mes de la situación contable de cada alumno: menús consumidos, cantidad a pagar... Todos esos datos los tengo en mi hoja.
    NO tengo Outlok y utilizo gmail como servidor de correo.
    ¿Existe alguna macro ya creada que pueda combinar los datos del excel en distintos correos electrónicos para las familias?
    Cada correo tendrá los datos particulares de cada alumno.
    Con ello trato de evitar imprimir cerca de 500 folios cada mes...
    Gracias por tu segura respuesta.

    ResponderEliminar
  51. Hola Salva, muchas gracias x tus palabras.
    Necesito que me pases al correo que figura al pié de formulario tu archivo, así analizo la estructura del mismo y de que forma puedo armar el mail para enviarlo. Estimo que es 100% realizable, hice trabajos de ese estilo: tomar datos del registro de una tabla y enviarlo a la dirección de correo que se encuentre en alguno de sus campos.
    Me gustaría tener ese archivo, por que me resultaría mucho mas fácil y rápido ayudarte, y directamente lo usas, sin necesidad de tener luego que adaptar el código.
    quedo al aguardo de tus noticias

    ResponderEliminar
  52. Hola Damian, tengo un problema con unas macros, una de ellas y es en la que he estado trabajando edita y da formato a un libro con varias hojas, para que despues del codigo en una de dichas hojas (carta), esa hoja seria el cuerpo del email y dentro tambien tiene los datos del destinatario y el subject del correo, me puedes ayudar? si quieres puedo enviarte mi archivo! o darte mi user de team viewer como tu me digas va?

    Muchas gracias!

    ResponderEliminar
  53. Hola Damian,

    Muy bueno el blog, tenía una consulta y espero que puedas ayudarme.
    Quiero enviar varias cartas que están en formato word, pero desde varias cuentas de correo.

    ¿Habría la posibilidad de hacerlo con una macro?

    Muchas gracias por tu apoyo y amabilidad puesta en este blog.

    André Miranda

    ResponderEliminar
  54. André: se puede hacer sin problemas, por lo que pude entender. Vos tenes una carta diseñada en word, la cual debe ser "disparada" desde <> cuentas de correo. Lo mejor sería, sin lugar a dudas, que esas cuentas sean de un mismo webmail, como x ejemplo Gmail. Y te nombro el producto de Google x q es el que menos problemas arroja a la hora de trabajar, aunque parezca mentira.
    Dame un poco mas de detalles, enviandome el proyecto a la casilla de correo que figura al pié del formulario.
    gracias x tu mensaje

    ResponderEliminar
  55. Hola Damian! a que cuenta de correo puedo enviarte mis archivos para que me ayudes con el codigode la macro qe ya hice! se puede?

    ResponderEliminar
  56. Manuel: figura en el pié del formulario de comentarios. Es una imagen, no la escribo para evitar que los robots la tomen y luego la utilicen para enviarme spam.

    ResponderEliminar
  57. Hola Damian, tu blog me ha ayudado mucho sin embargo te tengo una consulta, tengo un archivo de excel con 1000 registros de correos electronicos y otra columna con un #de contrato, a esos correos que se encuentran en el archivo les tengo q adjuntar un archivo de pdf que se guardo con el #de contrato. Me puedes ayudar para poder enviar el correo con el adjunto del # de contrato.

    ResponderEliminar
  58. Hola Damian! Gracias por compartir tus conocimientos!

    Damian, basandose en este ejemplo, ¿es posible agregar copias ocultas (CCO o BCC)? y de ser posible, ¿se puede automatizar de alguna manera para que al hacer click, selecionar o usar un checkbox se puedan ir ingresando esas selecciones al campo CCO? (la idea seria enviar el mismo mail a varios destinatarios, pero que estos no vean las direcciones de los demás)

    gracias!!!

    ResponderEliminar
  59. si quieres agregar esa característica, solo debes incorporar en el código lo siguiente:
    Email.Cc = "usuario1@xxx.com; usuario2@xxx.com"
    Email.Bcc = = "usuario3@xxx.com; usuario4@xxx.com"

    las direcciones de correo van separadas por punto y coma. lo mas conveniente sería que los coloques en una celda y luego hagas referencia a dicha celda para enviarlos:
    Email.Cc = range("a1").value

    ResponderEliminar
  60. Chantal: dale una mirada a mi nuevo post sobre el envío de mails tomando los datos desde una tabla. creo que apenas modificando ese código podrías adaptarlo a tu proyecto.

    ResponderEliminar
  61. Hola Damian, de verdad muchisimas gracias por compartir tus conocimientos, me han servido demasiado.

    Estimado, basandose en el ejemplo que expones en este post.¿es posible enviar un mail desde excel, pero que incluya un texto en el cuerpo del mensaje y ademàs incluir una imagen en el mismo cuerpo del mensaje?

    aclaro que puedo hacer ambas cosas, pero por separado, al momento de intentar hacer las 2 cosas a la vez, el correo llega solo con la imagen y el texto simplemente desaparece.


    Espero que puedas ayudarme.

    Atte Gonzalo

    ResponderEliminar
  62. Estimado: la verdad es que utilizando el ejemplo que brindo en el post me llegan ambas cosas: texto e imágenes. No comprendo por que una de ellas te está "fallando" a la hora de enviar los correos.
    La imagen es un adjunto y el texto parte del cuerpo del mail, deberían llegar ambos sin problemas, ya que son dos propiedades distintas.
    Pasame el código en donde realizas la tarea que mencionas.

    Para el caso de enviar imágenes y texto, del tipo a los boletines de promociones que nos llegan a nuestro correo, yo aconsejo no usar:
    Email.Body
    sino reemplazarlo por otra instrucción:
    Email.HTMLBody
    en donde especificas que envías texto con formato Html. Esto te permitirá crear toda la estructura de una página web dentro del cuerpo del correo. Por ejemplo:
    Body
    Html
    Table
    font Hola, que tal /font
    img src=www.aaa.com/imagen.jpg
    /table
    /html
    /body

    ¿Se entiende? La imagen en cuestión alojada en un servidor cualquier y la incluyes dentro del cuerpo mediante el tag IMG.
    Cualquier cosa avisame.

    ResponderEliminar
  63. Hola Damian, tengo un excel con personas a los que hay que citar. Cada línea corresponde a una persona y a una determinada fecha en que serán citados. Quiero agregar un botón por cada línea para enviar por Outlook la citación con un subject predefinido y en el cuerpo de mensaje un texto, que siempre será el mismo, más un determinado rango de celdas de la misma línea donde está el botón para enviar la citación a esa persona. Gracias por tu ayuda!

    ResponderEliminar
  64. dale una mirada a mi segundo post sobre el tema:
    http://damianexcel.blogspot.com.ar/2012/06/macros-como-enviar-mails-desde-excel.html
    ahí verás como sacar las direcciones de correo electrónico de una tabla de datos, en donde cada persona es un registro.
    deberías agregar una columna a esa tabla y (por ejemplo) si dicha celda tiene una "x" a es persona se le dispara el mail.
    es una buena alternativa y así evitarías colocar tantos botones

    ResponderEliminar
  65. Hola Daniel,
    Tu codigo funciona, genial,
    Gracias..

    pero podrias poner el mismo codigo pero cogiendose los datos de otra hoja excel.

    En la hoja1 llamada "Clientes" de mi tabla estan asi las columnas. Hay 525 registros.


    A1= para
    B1= de
    C1= asunto
    D1= Mensaje
    E1= RUTA ARCHIVO adjunto

    1= ¿Como hacer para que se envien los emails automaticamente a todos los registros?.
    Podrias poner el codigo?.

    Gracias Joey

    ResponderEliminar
  66. Joey: date una vuelta por esta entrada:
    http://damianexcel.blogspot.com.ar/2012/06/macros-como-enviar-mails-desde-excel.html

    ahí explico como tomar datos de una tabla y enviar un correo a cada uno de los registros.
    Solo deberías cambiar de que celda la macro debe leer cada parámetro (para, de, asunto, etc, etc)
    Es muy fácil de modificar, creo que va justo para lo que necesitas.
    cualquier cosa me avisas. Gracias x tu mensaje

    ResponderEliminar
  67. Hola Damian, excelentes tus aportaciones...me han despejado muchas de las dudas que tenía..Mil gracias por el apoyo.

    ResponderEliminar
  68. Excel ente!!!!!!!!!!!!1

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

funciones: convertir numeros a letras con excel

En realidad hace tiempo que vienen consultándome sobre esto... quizás cinco o seis años . Debe ser una de las funciones mas buscadas de Excel, por lejos: la posibilidad de escribir: 1.534,63 y que en una celda aparezca magicamente "un mil quinientos treinta y cuatro c/15/100". Aquí les dejo una solución, basada en funciones , sin utilizar macros, la cual preparé exclusivamente para este Blog. A pesar de los millones de usuarios que requieren esta herramienta, no viene incorporada en Excel, debemos armarla nosotros mismos .  Luego de la imagen irá la explicación de como llegué a lograr esto, dado que es un proceso medianamente complejo , que utiliza tres o cuatro funciones básicas y requiere de varios pasos. así quedará nuestra planilla y siempre devolverá en letras el valor que ingresemos en A1 [+/-] Ver el resto / Ocultar Desde ya aclaro: esta no es " la forma " de hacerlo, simplemente es una mas, evitando el uso de macros. Sobre esta base, comencemos: 1) El núme

buscarv con varios resultados

Es de las preguntas mas recurrentes que he tenido: ¿se puede lograr que la función BUSCARV() devuelva varios resultados? Si recordamos el uso de esta función, sabremos que la misma buscar en valor en el rango especificado, retornando un solo resultado. Si en la tabla tenermos varios registros iguales BUSCARV() solo nos devolverá el primero de ellos, omitiendo el resto. Entonces ¿se puede? Bueno, aplicando otra técnica sencilla que se me ocurrió al intentar solucionar el planteamiento de un lector... si, puedo hacerlo.... pero sin usar BUSCARV(). la idea es que coloquemos en E1 el código del producto a buscar y a partir de E2 nos devuelva todas las coincidencias de la tabla. [+/-] Ver el resto / Ocultar Vamos a necesitar una columna "auxiliar" para llevar a buen término este proyecto. Con macros el tema sería mas sencillo, pero aquí la cuestión es resolverlo con las funciones de Excel, sin VBA. Paso a paso: Como primer medida chequeamos que valores de la columna A coincide co