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
Empecemos: utilizaremos una cuenta de Gmail para enviar correos electrónicos desde Excel. Si sos usuario de algún otro web mail, simplemente reemplazá los parámetros indicados.
Analizando un poco este pequeño proyecto, sería adecuado crear en una hoja o formulario los campos requeridos para que el envío se producza de forma satisfactoria. Hagamos el siguiente diseño:
diseñado en una hoja llamada WebMail, a partir de la primer fila. Sencillo. Omito aquí los detalles referentes de la cuenta a traves de la cual enviaremos los correos (gmail, en este caso), mismos que incorporo dentro del código.
Ya definimos los principales campos, comunes a cualqueir servicio de correo. Abrimos VBA (alt + f11) y antes de escribir el código, debemos referenciar la librería de objetos que nos proporcionará los metodos para hacer factible el envio de mails: Microsoft CDO for Windows 2000 Library (CDO= Colaboration Data Object). Accedemos a esto mediante el menú "Herramientas / Referencias" y del formulario emergente buscamos y seleccionamos la mencionada opcion:
si omitimos este paso... nuestra macro no funcionará. los elementos están ordenados alfabeticamente, por lo tanto nos resultará fácil encontrarlos.
Ahora sí, el código, mismo que se encuentra muy comentado, para facilitar su comprensión:
Function EnviarMails_CDO() As Boolean
' Creo la variable de objeto CDO
Dim Email As CDO.Message
Dim Autentificion As Boolean
' ahora doy vida al objeto
Set Email = New CDO.Message
'indicamos los datos del servidor:
Email.Configuration.Fields(cdoSMTPServer) = "smtp.gmail.com"
Email.Configuration.Fields(cdoSendUsingMethod) = 2
'indicamos el nro de puerto. por defecto es el 25, pero gmail usa el 465. hay otro
'(que ahora no recuerdo) pero no me funcionaba... por eso no lo usé mas y lo olvidé
Email.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = CLng(465)
'aqui dejamos en claro si el servidor que usamos requiere o nó autentificación.
'1=requiere, 0=no requiere. Para gmail, entonces, 1
Email.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/" & _
"configuration/smtpauthenticate") = Abs(1)
'segundos para el tiempo maximo de espera. aconsejo no modificarlo:
Email.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
'aqui defino como True (verdadera) a la autentificación para el envío de mails.
Autentificacion = True
'ahora configuramos las opciones de login de gmail:
If Autentificacion Then
'nombre de usuario
Email.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "tuusuario@gmail.com"
'contraseña
Email.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "tucontraseña"
'si el servidor utiliza SSL (secure socket layer). en gmail: True
Email.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
End If
'a partir de ahora tomaremos los datos incluidos en el la hoja de excel:
' Dirección del Destinatario
Email.To = Trim([e1].Value)
' Dirección del remitente
Email.From = Trim([e2].Value)
' Asunto del mensaje
Email.Subject = Trim([e3].Value)
' Cuerpo del mensaje
Email.TextBody = Trim([e4].Value)
'Ruta del archivo adjunto
If [e5].Value <> vbNullString Then
Email.AddAttachment (Trim([e5].Value))
End If
'antes de enviar actualizamos los datos:
Email.Configuration.Fields.Update
'colocamos un capturador de errores, por las dudas:
On Error Resume Next
'enviamos el mail
Email.Send
'si el numero de error es 0 (o sea, no existieron errores en el proceso),
'hago que la función retorne Verdadero
If Err.Number = 0 Then
EnviarMails_CDO = True
Else
'caso contrario, muestro un MsgBox con la descripcion y nro de error
MsgBox "Se produjo el siguiente error: " & Err.Description, vbCritical, "Error nro " & Err.Number
End If
'destruyo el objeto, para liberar los recursos del sistema
If Not Email Is Nothing Then
Set Email = Nothing
End If
'libero posibles errores
On Error GoTo 0
End Function
'este sub es el que asignaré al botón de la hoja:
Sub EnviarMail()
Dim MailExitoso As Boolean
'llamo a la funcion:
MailExitoso = EnviarMails_CDO()
'si me devuelve un resultado Verdadero, todo salió bien:
If MailExitoso = True Then
MsgBox "El mail fué enviado satisfactoriamente", vbInformation, "Informe"
End If
End Sub
Con lo visto hasta el momento podemos enviar mails sin inconvenientes, aunque solo resta decir que es un ejemplo muy básico y mejorable en extremo. Podríamos crear "listas" de destinatarios y evitar así el ingreso manual de cada uno de ellos. O bien abrir un cuadro de diálogo para seleccionar manualmente el archivo que remitiremos adjunto.
Otra opcion muy útil: guardar una determinada hoja (por ejemplo el resumen de venta semanal) como un nuevo libro de excel y enviarla adjunta, sin necesidad de: cerrar excel, abrir el web mail, adjuntar el archivo y enviar, que serían los pasos comunes que debemos realizar.
La automatización puede ser total. Quedo al aguardo de consultas para ampliar el tema.
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...
ResponderEliminarbueno johan, perfecto.
ResponderEliminarme 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
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:
ResponderEliminarEmail.AddAttachment ("C:\ArchivoAdjunto.xls")
obviamente que la ruta puede cambiarse en forma dinámica, según las necesidades de cada uno
Hola,
ResponderEliminarno 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!!!
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.
ResponderEliminarpasamelo y vemos como resolverlo. gracias x tu mensaje
hhh
ResponderEliminarahá, gracias x la triple h. (¿¿??)
ResponderEliminarHola. Muchas gracias por el código, funciona perfectamente. Muy bueno.
ResponderEliminarSaludos,
Ramón.
Muchas gracias Ramón x tu comentario. Un abrazo.
ResponderEliminarhola amigo me urge aprender como usar esta macro; pero con salida desde el outlook, tu crees poder ayudarme
ResponderEliminarBuenos días excelente BLOG.
ResponderEliminarSeria posible mandar dicho correo y en el campo asunto insertar el contenido de una celda del archivo remitido?
Gracias. Feliz AÑO nuevo.
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.
ResponderEliminarEs 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.
ResponderEliminarte 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
Hola Damian, gracias por tu respuesta, no es exactamente lo que busco.
ResponderEliminarTe 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
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
ResponderEliminarDe antemano muchas gracias
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:
ResponderEliminarSub 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.
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.
ResponderEliminarFormidable Damian, el tema del asunto funciona a la perfección. Muchas gracias.
ResponderEliminarHola Damian de nuevo.
ResponderEliminarPara que en el asunto tenga varios valores de varias celdas, que modificación debería realizar??
Muchas gracias.
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:
ResponderEliminarAsunto = 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.
Damian: en primer lugar felicitarte no solo por el contenido sino por la calidad y calidez con la que respondes.
ResponderEliminarLa 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
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.
ResponderEliminarGracias y quedo a la espera de tus novedades.
Hola Damian muy buenos dias,
ResponderEliminarMe 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
Hola Edgar, gracias x tus palabras.
ResponderEliminarEn 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
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é.
ResponderEliminarSaludos.
Edgar Ureña
edgar.urena@sas-automotive.com
Edgar: con la instrucción Activesheet.copy Excel crea automaticamente otro libro, llevando a éste nuevo todo el contenido de la hoja activa.
ResponderEliminarSaca 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
Buena tarde Sr. Damián:
ResponderEliminarInternet 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)
Jorge: agradezco infinitamente tus palabras, son de gran aliento y apoyo para la tarea que me propuse con el Blog.
ResponderEliminarMas 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.
Buena noche Sr. Damián:
ResponderEliminarComo 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
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.
ResponderEliminarte 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
Buenas, en primera quiero felicitarte por la calidad de tu blog, que ya me ha facilitado un par de ideas.
ResponderEliminarMi 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?
mmejia: gracias x tus palabras sobre el blog.
ResponderEliminarte 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.
Hola Damián, felicidades por tu blog, ha sido de gran ayuda para muchas personas como yo.
ResponderEliminarTengo 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
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:
ResponderEliminarSub 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
hola damian!
ResponderEliminarmi 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?
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.
ResponderEliminarcualquier cosa me avisas.
Damian el ejemplo para gmail funciona perfectamente per como poder utilzar tu ejemplo para los correos de hotmail se puede podrias comentarlo gracias
ResponderEliminarEstimado: el ejemplo debería funcionar correctamente con cualquier servidor de correo, sea gmail, hotmail, yahoo, etc, etc.
ResponderEliminarCada 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
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¿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.
ResponderEliminarQuedo al aguardo de tus noticias.
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
ResponderEliminargracias de antemano
hola, mi duda es, como puedo hacer que los destinatarios los tome de una hoja de excel, digamos que mi lista empieza en A1
ResponderEliminarHola. 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:
ResponderEliminarFunction 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.
Hola Jonathan. Contesto tu pregunta:
ResponderEliminartené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.
Hola Damian, Tu blog ESTA MUY CHINGON!!! FELICIDADES.
ResponderEliminarHe 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
Hola Francisco, gracias por tus palabras.
ResponderEliminarConozco 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)
Muy buena tarde Sr. Damián:
ResponderEliminar¿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
Hola Jorge: estuve trabajando con tu archivo, pero aún no doy en la tecla... sigue arrojando error.
ResponderEliminarPude 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.
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.
ResponderEliminarAbrí una cuenta en Gmail y cambiá estos parámetros:
smtp: smtp.gmail.com
puerto: 465
y listo, enviaras correos sin problemas
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.
ResponderEliminarSaludos desde Paraguay
Jaja, que buena pregunta la tuya.
ResponderEliminarTe 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.
¡¡¡Felicidades por tu ayuda, Damián!!!
ResponderEliminarHe 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.
Hola Salva, muchas gracias x tus palabras.
ResponderEliminarNecesito 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
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?
ResponderEliminarMuchas gracias!
Hola Damian,
ResponderEliminarMuy 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
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.
ResponderEliminarDame un poco mas de detalles, enviandome el proyecto a la casilla de correo que figura al pié del formulario.
gracias x tu mensaje
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?
ResponderEliminarManuel: 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.
ResponderEliminarHola 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.
ResponderEliminarHola Damian! Gracias por compartir tus conocimientos!
ResponderEliminarDamian, 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!!!
si quieres agregar esa característica, solo debes incorporar en el código lo siguiente:
ResponderEliminarEmail.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
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.
ResponderEliminarHola Damian, de verdad muchisimas gracias por compartir tus conocimientos, me han servido demasiado.
ResponderEliminarEstimado, 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
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.
ResponderEliminarLa 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.
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!
ResponderEliminardale una mirada a mi segundo post sobre el tema:
ResponderEliminarhttp://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
Hola Daniel,
ResponderEliminarTu 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
Joey: date una vuelta por esta entrada:
ResponderEliminarhttp://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
Hola Damian, excelentes tus aportaciones...me han despejado muchas de las dudas que tenía..Mil gracias por el apoyo.
ResponderEliminarExcel ente!!!!!!!!!!!!1
ResponderEliminar