Saltar al contenido

BAJAR ADJUNTOS EMAIL


Recommended Posts

publicado

Buenos días chicos ,

He revisado que mi consulta no estuviera resuelta y no la he encontrado.He visto algunas parecidas pero lo que necesito concretamente.

1-OBJETIVO

Tengo un archivo excel donde llevo el control economico de proyectos de inevrsión y quiero que desde el excel me baje los archivos adjuntos de los emails seleccionados en el outlook y me los guarde en la carpeta OFERTAS.Estos archivos son ofertas relacionadas con el proyecto de inversión y quiero ahorrar tiempo en la acción de bajar estos archivos adjuntos.

Lo que me interesa es que me baje los archivos del email seleccionado  o emails que yo seleccione , y no de los emails marcados como no leidos.

Quiero esto en concreto porque la macro original me baja los emails marcados como no leidos y esto es muy engorroso porque hay usuarios en mi empresa que tienen muchos emails marcados como no leidos hace que se bajen demasiados archivos adjuntos que no tienen nada que ver con el adjunto que me interesa.

2-PROBLEMA

La macro me baja los adjuntos de los emails marcados como no leidos y yo quiero solo los emails que yo seleccione manualmente.

3-PROGRAMACION DE LA MACRO

Os dejo el modulo con la programación de la macro en cuestión.Creo que me la baje de este foro.

Const olFolderInbox As Integer = 6

Sub DownloadAttachmentFirstUnreadEmail()
Dim oOlAp As Object, oOlns As Object, oOlInb As Object
Dim oOlItm As Object, oOlAtch As Object

Application.DisplayAlerts = False

'~~> New File Name for the attachment
Dim NewFileName As String
NewFileName = ThisWorkbook.path & "\OFERTAS\"

'~~> Get Outlook instance
Set oOlAp = GetObject(, "Outlook.application")
Set oOlns = oOlAp.GetNamespace("MAPI")
Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox)

 '~~> Check if there are any actual emails
If oOlInb.items.Restrict("[UnRead] = false").Count = 0 Then Exit Sub

'~~> Extract the attachment files
For Each oOlItm In oOlInb.items.Restrict("[UnRead] = true")


    '~~> Check if the email actually has an attachment
    If oOlItm.Attachments.Count <> 0 Then
        For Each oOlAtch In oOlItm.Attachments
            '~~> Download the attachment
            oOlAtch.SaveAsFile NewFileName & oOlAtch.Filename
            '[ActiveCell]= oOlAtch.DisplayName
            
           
        Next
    End If
    
    
Next

End Sub

 

Saludos y muchas gracias de antemano,

publicado
Hace 3 horas, mbriculle dijo:

'~~> Check if there are any actual emails
If oOlInb.items.Restrict("[UnRead] = false").Count = 0 Then Exit Sub

'~~> Extract the attachment files
For Each oOlItm In oOlInb.items.Restrict("[UnRead] = true")

Hola @mbriculle

Estas son las líneas que realizan el filtro en el correo "de todos los no leídos", modifica estas líneas.

No uso Outlook, por restricciones de la empresa, no logre hacer pruebas, pero te dejo este link:

https://stackoverflow.com/questions/33261598/display-email-body-of-selected-email-in-outlook-as-a-message-box-in-excel

En lo que alguien más atiende la consulta. Espero pueda ser de utilidad.

publicado

Muchas gracias mauricio

he intentado cambiarlo pero me falta poner los codigos para que sólo me baje los adjuntos de los emails que yo seleccione.

Te copio el desarrollo .Con estas lineas lo que me hace es bajarme todos los adjuntos de los emails que tengo en la bandeja de entrada .

 

Const olFolderInbox As Integer = 6

Sub DownloadAttachmentFirstUnreadEmail()
Dim oOlAp As Object, oOlns As Object, oOlInb As Object
Dim oOlItm As Object, oOlAtch As Object

Dim objItem As Object


Application.DisplayAlerts = False

'~~> New File Name for the attachment
Dim NewFileName As String
NewFileName = ThisWorkbook.path & "\OFERTAS\"

'~~> Get Outlook instance
Set oOlAp = GetObject(, "Outlook.application")
Set oOlns = oOlAp.GetNamespace("MAPI")
Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox)
Set objItem = oOlAp.ActiveExplorer.Selection.Item(1)


i = 0

If oOlInb.items.Count = 0 Then
MsgBox "There are no messages in folder.", vbInformation, _
"Nothing Found"

Exit Sub
End If

If oOlInb.items.Count > 0 Then
For Each oOlItm In oOlInb.items
For Each oOlAtch In oOlItm.Attachments
oOlAtch.SaveAsFile NewFileName & oOlAtch.FileName

i = i + 1
Next oOlAtch
Next oOlItm
End If


End Sub

 

A ver si me podeis ayudar. :)

publicado

Hola.

Prueba con el siguiente código:

Sub DescargarAdjuntos()
Dim olApp As Outlook.Application
Dim olExpl As Outlook.Explorer
Dim olSel As Outlook.Selection
Dim olMail As Outlook.MailItem
Dim olAdj As Outlook.Attachment
Dim iÍnd As Integer
Dim sUbic As String
Dim lArc As Long

    sUbic = ThisWorkbook.Path & "\OFERTAS\"
    Set olApp = GetObject(, "Outlook.application")
    Set olExpl = olApp.ActiveExplorer
    Set olSel = olExpl.Selection
    
    On Error Resume Next
    For Each olMail In olSel
        If olMail.Class = 43 Then
            For Each olAdj In olMail.Attachments
                olAdj.SaveAsFile sUbic & olAdj.Filename
                lArc = lArc + 1
            Next
        End If
    Next
    On Error GoTo 0

    MsgBox "Se han guardado " & Format(lArc, "#,##0") & " ficheros.", vbInformation, "TERMINADO"
    
End Sub

Hay que tener en cuenta que Outlook entiende por adjunto todo lo que no es texto. Por ejemplo, si el correo tiene una o varias imágenes, como puede ser el logotipo de la empresa, éstas se consideran también adjuntos y por lo tanto también las descargará. Por esta razón, quizá deberías considerar filtrar el tipo de archivo (excel, pdf, etc).

 

Un saludo.

PS.  En el código anterior no está contemplado que correos distintos tengan adjuntos con el mismo nombre.  Si se diera el caso, habría que modificarlo para que no se sobreescriban.

publicado

Hola @mbriculle

Prueba así

->> 

Const olFolderInbox As Integer = 6

Sub DownloadAttachmentSelectedEmail()
Dim oOlAp As Object, oOlns As Object, oOlInb As Object
Dim oOlItm As Object, oOlAtch As Object

Dim objItem As Object

Application.DisplayAlerts = False

'~~> New File Name for the attachment
Dim NewFileName As String
NewFileName = ThisWorkbook.Path & "\OFERTAS\"

'~~> Get Outlook instance
Set oOlAp = GetObject(, "Outlook.application")
Set oOlns = oOlAp.GetNamespace("MAPI")
Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox)
Set objItem = oOlAp.ActiveExplorer.Selection

''MsgBox oOlAp.ActiveExplorer.Selection.Count

i = 0
a = 0

If objItem.Count = 0 Then
MsgBox "There are no messages in folder.", vbInformation, _
"Nothing Found"
Exit Sub

ElseIf objItem.Count > 0 Then
    For Each oOlItm In objItem
        For Each oOlAtch In oOlItm.Attachments
            oOlAtch.SaveAsFile NewFileName & oOlAtch.Filename
            
            i = i + 1
        Next oOlAtch
        ''MsgBox oOlItm
    Next oOlItm
End If


End Sub
 

<<-

Nos comentas.

publicado

Hola Mauricio,

 

Me ha funcionado a la perfección.He seleccionado 3 emails de la bandeka de entrada y me ha bajado solo los adjuntos de esos 3 emails,

Sois unos cracks.

 

Muchisimas gracias ,

Un abrazo,

publicado

Hola qwerty123

Gracias por el código , pero entiendo que funciona desde eVBA de Outlook no ?

Lo voy a probar también , porque la opción en Outlook también me interesa.

 

Muchas gracias ,

 

publicado

Hola qwerty123

Me ha funcionado a la perfección también.

Solo he tenido que cambiar 

Dim olApp As Outlook.Application
Dim olExpl As Outlook.Explorer
Dim olSel As Outlook.Selection
Dim olMail As Outlook.MailItem
Dim olAdj As Outlook.Attachment

 

Y poner al final Object.

Dim olApp As Object

Dim olExpl As Object
Dim olSel As Object
Dim olMail As Object
Dim olAdj As Object

 

Con este cambio ha funcionado muy bien

Estoy encantada con vosotros .Sois unos cracks

 

Muchas gracias ,

publicado
Hace 41 minutos , mbriculle dijo:

Como podría excluir los archivos que sean imagenes  como JPG, PNG ??

Una sugerencia para esta última pregunta:

If objItem.Count = 0 Then
MsgBox "There are no messages in folder.", vbInformation, _
"Nothing Found"
Exit Sub
    ElseIf objItem.Count > 0 Then
        For Each oOlItm In objItem
            For Each oOlAtch In oOlItm.Attachments
                ''MsgBox InStr(1, oOlAtch.Filename, ".", vbTextCompare)
                ''MsgBox Mid(oOlAtch.Filename, InStr(1, oOlAtch.Filename, ".", vbTextCompare) + 1, 1)

''->> Aqui se busca la primera letra de la extensión dle archivo
                If Mid(oOlAtch.Filename, InStr(1, oOlAtch.Filename, ".", vbTextCompare) + 1, 1) = "x" Then
                    oOlAtch.SaveAsFile NewFileName & oOlAtch.Filename
                End If
                
                i = i + 1
            Next oOlAtch
            ''MsgBox oOlItm
        Next oOlItm
End If

 

Espero sea de utilidad

publicado

Mauricio

 

Muy amable ,lo he probado y me exluye las extensiones que empiecen por una letra determinada.

Funciona muy bien

Excelente

 

De nuevo graciasssssssssssssssssssssssssssss

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.