Outlook es un programa muy extendido, sobre todo en el ámbito profesional, para gestionar y procesar correos electrónicos y por supuesto mucho más, si sólo pensamos en el calendario y la gestión de tareas.
Una gran ventaja de Outlook sobre otros clientes de correo electrónico es que viene con VBA (Visual Basic for Applications), lo que permite automatizar muchas tareas adicionales si las funciones apropiadas no se pueden realizar ya a través de las reglas y funciones integradas de Outlook.
Guardar automáticamente un archivo adjunto de correo electrónico con VBA
Una tarea que puede ahorrarle muchos clics es guardar archivos adjuntos de correo electrónico. Si tiene los típicos correos electrónicos recurrentes cuyos archivos adjuntos deben guardarse siempre en la misma ruta, tendrá que hacer clic en esta ruta cada vez con el cuadro de diálogo “Guardar como.
Utilizando VBA, puede escribir una macro para guardar el archivo adjunto del correo electrónico. También puede asignar un acceso directo a la macro o insertar un botón en la barra para un acceso rápido. De este modo, sólo necesitará hacer clic o pulsar una tecla para guardar el archivo adjunto del correo electrónico. Una macro de este tipo también puede combinarse con otras macros para que, por ejemplo, el adjunto de correo electrónico se imprima mediante VBA al mismo tiempo.
Código VBA para guardar el archivo adjunto del correo electrónico de Outlook
El siguiente código VBA se puede utilizar para guardar los archivos adjuntos de correo electrónico bajo una ruta de carpeta fija. Sólo se guardan los archivos adjuntos del correo seleccionado.
En Outlook, se puede acceder al Editor básico visual pulsando Ctrl+F11. También es posible a través del menú Herramientas de desarrollo. Visual Basic.
Public Sub GuardarAnexos()
Dim objOL As Outlook.Application
Dim objMsg As Outlook.MailItem
Dim objAttachments As Outlook.Attachments
Dim objSelection As Outlook.Selection
Dim i As Long
Dim lngCount As Long
Dim strFile As String
Dim strFolderpath As String
Instanciar el objeto Outlook Application
Set objOL = CreateObject("Outlook.Application")
Obtener la colección de objetos seleccionados (e-mails)
Set objSelection = objOL.ActiveExplorer.Selection
' Establece la ruta de la carpeta donde se guardará el archivo adjunto del correo electrónico
strFolderpath = "c:\Users\AnyUser\Documents\subfolder\bills\year_2020\"
' Comprueba cada objeto seleccionado (correo electrónico) para ver si tiene un archivo adjunto. Si el archivo adjunto existe,
' entonces guárdelo en la ruta de la carpeta.
Para cada objMsg en objSelection
' Determina los adjuntos del objeto seleccionado (e-mail).
Set objAttachments = objMsg.Attachments
lngCount = objAttachments.Count
If lngCount > 0 Then
' Aquí usamos un contador hacia atrás, pero también debería funcionar al revés.
For i = lngCount To 1 Paso -1
Guarde el archivo adjunto antes de borrarlo del elemento.
Determine el nombre del archivo
strFile = objAttachments.Item(i).FileName
Combina la ruta de la carpeta con el nombre del archivo
strFile = strRutaCarpeta & strFile
' Guardar el adjunto como un archivo
objAttachments.Item(i).SaveAsFile strFile
Siguiente i
Fin If
Siguiente
ExitSub:
Set objAttachments = Nada
Set objMsg = Nada
Set objSelection = Nada
Set objOL = Nada
End Sub
Llamar macro de Outlook mediante acceso rápido
Ahora puedes llamar o ejecutar la macro, siempre que sea Pública, a través del Herramientas de desarrollo => Macro => Diálogo de macros. O puede colocar un botón en el acceso rápido. Con la pequeña flecha que apunta hacia abajo en el acceso rápido, seleccione “Más comandos…” o vaya a Archivo => Opciones => Barra de herramientas de acceso rápido.
.
En la ventana de diálogo que se abre a continuación, limite los comandos a macros y añada la macro en cuestión.
A continuación, mediante el botón “Cambiar“, puede asignar un icono o ajustar el texto.
Hola! Muchas gracias por compartir tu información, es un post muy interesante y que facilita mucho el trabajo!
Tengo una pregunta al respecto, si en la carpeta destino ya hay otro archivo con el mismo nombre, ¿será capaz de sobrescribirlo?. Utilizo la macro para descargarme informes actualizados de datos automáticamente, así que veo que puede ser un problema.
Otro problema que me surge es que el archivo adjunto que me llega por correo no tiene exactamente el mismo nombre que el que quiero reemplazar, y su nombre cambia cada día porque incluye la fecha, ¿hay alguna manera de que antes de que la macro descargue el archivo, cambie su nombre al que ya existe en la carpeta? Así después podría sobrescribirlo y tener mis datos actualizados.
Muchas gracias por tu ayuda y, una vez más, gracias por tus aportaciones.
Un saludo,
Ana
Hola Ana, perdona por el retraso en la respuesta.
Si el archivo que quieres guardar del adjunto del correo electrónico tiene el mismo nombre de archivo, entonces habrá problemas y la macro probablemente abortará. Por lo tanto, en este caso deberías comprobar si el archivo ya existe. Aquí tienes un fragmento de código:
If Len(Dir(strFile)) = 0 Then
'El archivo no existe, puede guardar el archivo
objAttachments.Item(i).SaveAsFile strFile
Else
'cree otro nombre de archivo o elimine primero el archivo existente y luego guarde el archivo adjunto
End If
En cuanto a la segunda parte de la pregunta: No es necesario utilizar el mismo nombre de archivo para guardar que el archivo adjunto. También puede utilizar siempre un nombre de archivo diferente o utilizar siempre el mismo nombre de archivo. Para ello, simplemente introduzca lo siguiente en la línea de código
strFile = objAttachments.Item(i).FileName
sustituya la asignación por un nombre de archivo individual, por ejemplo
strFile = "MiArchivo.pdf"