Estimo que el título de la entrada es bastante descriptivo, no necesita mayores explicaciones. Dado mi post anterior (link) he recibido en los últimos días varias consultas sobre realizar esta tarea utilizando a Microsoft Outlook como "intermediario". La tarea no es complicada y a la vez resulta sencilla de adaptar a cualquier proyecto, por cuanto estimo les será de ayuda en su trabajo diario. Gracias a los mensajes y códigos que me hicieron llegar, mismos que usaré en la presente entrada.
[+/-] Ver el resto / OcultarEl tema pasa por que Excel no tiene ni la mas mínima idea de quien es Outlook... así que menos idea tendrá de como utilizarlo. Necesitamos entonces crear el "objeto outlook" dentro de VBA con la ya conocida función CreateObject("tipo_de_objeto"); toda vez realizada esta acción estaremos en condiciones de acceder a las propiedades, métodos y eventos de Outlook.
El ejemplo que brindaré a continuación necesita que, obviamente, tengamos una cuenta debidamente configurada y la aplicación Outlook se encuentre abierta al momento de ejecutar la macro.
Ahora bien, para remitir correctamente un correo electrónico debemos tener en cuenta ciertos "campos" a completar, a saber:
To: a quien se lo enviamos (mails)
Cc: con copia a otro/s (mails)
Bcc: con copia oculta a otro/s (mails)
Subject: asunto del mensaje
Body: cuerpo del mensaje
Attachments: si anexamos algún archivo
Como podrán observar la gran mayoría de ellos son opcionales (Cc, Bcc, etc) y se "usan poco", aunque están los opcionales "que se usan mucho", como es: asunto, cuerpo y algo anexado.
El presente código envía anexado el propio archivo, aunque sería muy fácil reemplazarlo por otro que tengamos en el ordenador, siempre y cuando pasemos correctamente la ruta de acceso.
Con esa poca gracia e imaginación que siempre imprimo a mis interfaces gráficas, supongamos que tenemos el siguiente formulario de envío, magistralmente confeccionado en una planilla:
a los tres rangos de la columna B les dí un nombre adecuado: "para", "asunto" y "cuerpo", y así utilizarlos en el envío del mail haciendo referencia a ellos de una forma bien explícita.
Vamos a las líneas, mismas que se encuentran comentadas para una mejor interpretación de las acciones que se van llevando a cabo.
Sub Outlook_Con_Excel() 'variable para "manejar" el objeto Outlook Dim OutApp As Object 'variable para "manejar" el objeto mail Dim OutMail As Object 'creamos el objeto Outlook, para acceder a sus 'propiedades, métodos y eventos: Set OutApp = CreateObject("Outlook.Application") 'logeamos: ojo acá, debemos tener la cuenta bien configurada OutApp.Session.logon 'creo el mail Set OutMail = OutApp.CreateItem(0) 'guardamos el libro actual, antes de enviarlo: ActiveWorkbook.Save 'y acá comienza el "proceso de envío" On Error Resume Next With OutMail .To = Range("para").Value 'a quien se lo envío .CC = "" 'si queremos agregar alguna copia .BCC = "" 'si queremos agregar alguna copia oculta .Subject = Range("asunto").Value 'el asunto .Body = Range("cuerpo").Value 'cuerpo del mensaje .Attachments.Add ActiveWorkbook.FullName 'adjunto el archivo actual .Send 'y envío el correo End With 'destruyo los objetos para liberar recursos Set OutMail = Nothing Set OutApp = Nothing End Sub
Si quitamos todos los comentarios veremos que es realmente muy poco código, pero funciona y logra su cometido sin ningún tipo de problemas. En varias empresas el uso de Outlook está muy extendido y esta pequeña macro seguro les puede agilizar la tarea diaria.
Contamos con una ventaja: los correos por defecto pueden ser altamente configurables y que incluyan algún fondo, imagen, etc, etc, aspecto que dará mejor presencia a los mails que enviemos.
Pueden ingresar varias direcciones, separadas por coma o bien con un bucle ir recorriendo una tabla y desde allí ir tomando los mails y remitiéndolos... las opciones son infinitas y por suerte el código es fácil de adaptar.
Cualquier duda al respecto me avisan y lo vemos.
Un abrazo y feliz 2012.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Buenas noches.
ResponderEliminarEstupenda macro. Mi duda consiste en que no necesito enviar el libro completo sino una hoja del mismo. ¿Cuál sería la instrucción?
Muchas gracias.
Vicente: gracias por tus palabras. La cuestión es: ir hasta la hoja, copiarla y "guardarla como...", para luego anexar ese nuevo libro al mail: Suponiendo que hablamos de la hoja2:
ResponderEliminarSheets("hoja2").Select
ActiveSheet.Copy
ActiveWorkbook.SaveAs "C:\FileSent.xls"
y listo, luego al attachment le darías esa ruta:
C:\FileSent.xls, o la que hayas asignado en tu proyecto.
suerte y cualquier cosa me avisas.
saludos
Buenas tardes Damián.
ResponderEliminarMuchas gracias por tu ayuda.
Un saludo
De nada Vicente, cualquier cosa me avisas.
ResponderEliminarUn abrazo.
Lo primero muchas gracias por esta macro me sirvió de gran ayuda, pero me ha surgido una duda y no se si es posible porque soy principiante en esto de las macros. Me gustaría que la macro hiciera que el mail se configurara pero no se llegara a enviar, es decir, para enviarlo tendríamos que ir al outlook y en el mail que se ha creado dar al botón de enviar,¿me podéis ayudar? Se me ocurre cambiar la instrucción "send" por otra, pero he probado varias y no funciona. Ahh y otra cuestión ¿se puede insertar una imagen en el cuerpo del mensaje? No lo he conseguido. Muchas gracias.
ResponderEliminarestimo que lo del cuerpo del mensaje se puede hacer configurándolo desde el propio Outlook: proba colocando una imagen de fondo por defecto (para todos los correos, como plantilla) y luego usa Excel para enviarlos.
ResponderEliminarEn cuanto a "guardar" el correo antes de enviarlo... sería mas fácil usar directamente Outlook, aunque quizás pueda hacer algo al respecto. Dejame ver y te aviso, es probable que pueda crearlo, abrir outlook, mostrarte la pantalla y no enviarlo. No lo intenté nunca, voy a ver si funciona. Gracias x tu mensaje, en breve te estoy respondiendo.
Rebeca: reemplazando el método .Send (enviar) por .Save (guardar) te deja el correo en la "bandeja de borradores". Luego te vas a outlook (o bien ya lo tienes abierto) y puedes visualizarlo antes del envío.
ResponderEliminarProbá de esa forma y avisame, aquí funciona sin problemas.
Buenos días Damian, creo q soy muy principiante en esto de las macros para Excel, me gustaría q me ayudarás la forma en q puedo ejecutar tú código, copio y pego en una macro ejecuto? necesito crear un libro asi como tú lo hiciste? Q hago¿? Disculpame mis preguntas tan principiantes, pero me interesa mucho la macro xq quiero hacer eso con un archivo q tengo.
ResponderEliminarCon Alt+F11 ingresas al editor de Vba, y luego vas al menú insertar/modulo.
ResponderEliminarAhi dentro pegas el codigo del ejemplo. Ojo: fijate que cuando "armo" el Mail, tomo algunos valores de rangos presentes en las hojas, no olvides modificar esa parte, adaptandola a tu libro.
Hola!
ResponderEliminares posible crear una macro para que se envie un mail de aviso a una dirección concreta de Outlook cuando alguien modifique un libro en que tengo guardado en red???
Si es posible me podria ayudar con la macro?
Gracias!
Marisol: estimo que ese libro debería contener la macro que "dispara" el correo si alguien lo abre, en el evento Workbook_Open().
ResponderEliminar¿De que tipo de red estamos hablando? ¿Es una simple punto a punto o una con servidor y su respectivo administrador?
quedo al aguardo de tus noticias.
Damian te felcito por compartir tus conocimientos,Gracias de antemano Soy Antonio, y quiero hacerte la siguiente consulta, soy principiante y quiero hace una macro para enviar los correos sobre una lista de distribucion es decir tengo un archivo en donde enlisto el nombre del archivo y la direccion de correo a la que debe enviarse, que debo hacer?
ResponderEliminarGracias Antonio.
ResponderEliminarEnvíame el archivo a mi correo, asi veo la estructura de la tabla y puedo ayudarte sobre tu proyecto, no termino de comprender muy bien tu consulta.
Quedo al aguardo de tus noticias.
hola Damian muchas gracias por tu info me sirvio muchisimo, sobre lo que comentaba alguien por ahi para poder visualizar el correo antes de enviarlo, solo es de sustituir .Send por .Display , de esa manera le funcionara :D
ResponderEliminarGracias Daniel, mas que bueno el aporte. Le habia recomendado a Rebeca que utilice .Save, ya que con ese método lo dejaba en la bandeja de borradores. No conocía el .Display que propones en tu comentario. Excelente, un abrazo y gracias de nuevo.
ResponderEliminarMuy buena Macro.Pero no corre con Outlook Express
ResponderEliminarDamian necesitaba un poco de ayuda con lo siguiente:
Estoy intentando hacer una macro que corra con el Outlook Express y, después de investigar algo he conseguido enviar mails a las direcciones que pongo (hago que corra por las filas según el número de correos que haya en la página) y a cada uno le envía un mensaje automático. Sólo me faltan por solucionar 2 cosillas. Una (la más importante y donde ando perdido) cómo adjuntar un archivo (a cada persona el suyo según la ruta que incluyo en una celda)y la otra cuestión es cómo meter la firma que ya tengo el Outlook Express como predeterminada (me abre el mail pero no le pone la firma). Esto no sería demasiado importante (ya que si no la configuro en el vba).
El código que uso es:
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Sub CommandButton1_Click()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As String
Dim Adjunto As String, ruta As String
x = Cells(1, 5).Value
ruta = "C:\Documents and Settings\avarela\Mis documentos\Trabajadores\Nóminas\2012\"
For r = 2 To x
Adjunto = (ruta & Cells(r, 5))
Email = Cells(r, 3)
Subj = "Nómina del mes de " & Cells(r, 4)
Msg = ""
Msg = Msg & "Hola " & Cells(r, 2) & "," & vbCrLf & vbCrLf
Msg = Msg & "Adjunto te envío copia de la nómina del mes de "
Msg = Msg & Cells(r, 4).Text & "." & vbCrLf & vbCrLf
Msg = Msg & "Un Saludo" & vbCrLf
Msg = Msg & "Andrés"
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, "%0D%0A")
URL = "mailto:" & Email & "?subject=" & Subj & "&attach=" & Adjunto & "&body=" & Msg
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
Application.Wait (Now + TimeValue("0:00:01"))
Application.SendKeys "%s"
Next r
End Sub
Anyel: dejame practicar un poco, por que hasta donde tengo entendido es todo un problema enviar adjuntos con Outlook Express... siempre anda con errores de uno u otro tipo.
ResponderEliminarApenas tenga novedades te aviso. Gracias x tu mensaje y muy bueno el código que armaste.
Funciona perfecto, muchas gracias!
ResponderEliminarFunciona perfecto, muchas gracias!
ResponderEliminar