Sauve PJ d'outlook (boite de réception) sous c:\pj\ via Exce

Résolu
PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention   -  
PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Malgré les différents posts sur le sujet, je n'ai pas trouvé comment sauvegarder automatiquement les pièces jointes sous un répertoire (exemple : C:\pj\, à l'arrivée du mail sous OUTLOOK 2010, puis de classer le mail dans un dossier (Boite de réception\Traité).

Mon problème, c'est de créer une règle en lançant un script (vba). Je ne trouve pas exécuter un script, car une sécurité en entreprise interdit cela.....

Du coup, est-il possible à partir d'excel, de sauvegarder les pièces jointes de la boite de réception d'outlook, sous un répertoire c:\pj\ et ensuite sous outlook de déplacer ces mails avec pièce joint dans le dossier "Traité" ?

Option Explicit
'------------------------------------------------------------------------
'Nécessite d'activer la référence Microsoft Outlook xx.xx Object Library
'------------------------------------------------------------------------
 
Dim x As Integer
 
    'La boite de réception, la boite des éléments supprimés et tous leurs
    'sous dossiers sont pris en compte.
Sub ExportePiecesJointes()
    Dim Ol As New Outlook.Application
    Dim Ns As Outlook.Namespace
    Dim Dossier As Outlook.MAPIFolder
 
    Set Ns = Ol.GetNamespace("MAPI")
    Set Dossier = Ns.Folders(1)
 
    SearchFolders Dossier
    x = 0
End Sub
 
 
Private Sub SearchFolders(ByVal fld As Outlook.MAPIFolder)
Dim y As Integer
Dim olmail 'As Outlook.MailItem
Dim pceJointe As Outlook.Attachment
Dim SousDossier As Outlook.MAPIFolder
 
For Each SousDossier In fld.Folders
'.Item("Nom_Du_Dossier").Items
    If SousDossier.DefaultItemType = 0 Then
        For Each olmail In SousDossier.Items
            If Not olmail.Attachments.Count = 0 Then
                For y = 1 To olmail.Attachments.Count
                     Set pceJointe = olmail.Attachments(y)
                     x = x + 1
                     pceJointe.SaveAsFile "C:\PJ\" & x & "_" & pceJointe
                    Set pceJointe = Nothing
                Next y
            End If
        Next olmail
    End If
    SearchFolders SousDossier
Next SousDossier
End Sub

Ce code, balaie tous les dossiers de la boite de réception. Mon souhait serait de ne balayer que la boite de réception..

Comment remplacer :

For Each SousDossier In fld.Folders
....
Next SousDossier

pour lui indiquer, que seule la boite de réception et non les sous dossiers....

Merci d'avance !

Bien cordialement,

Merci pour votre aide !

Bien cordialement,


Windows / Edge 112.0.1722.68

2 réponses

  1. ozone_ Messages postés 1823 Statut Membre 511
     

    Hello,

    Voici une macro qui peut faire l'affaire :

    Note: il faut, dans l'interface VBA, aller dans Outils > Référence puis chercher et cocher "Microsoft Outlook 14.0 Object Library" avant de pouvoir utiliser cette macro.

    Sub EnregistrerLesPiecesJointesEtDeplacerLesEmails()
        
        Dim objOL As Outlook.Application
        Dim objNS As Outlook.Namespace
        Dim objFolder As Outlook.MAPIFolder
        Dim objItem As Object
        Dim objAttachment As Attachment
        Dim strFolderPath As String
        Dim strFolderName As String
        
        ' Spécifiez le chemin du dossier où les pièces jointes seront enregistrées
        strFolderPath = "C:\pj\"
        
        ' Spécifiez le nom du dossier où les emails traités seront déplacés
        strFolderName = "Traité"
        
        On Error Resume Next
        
        ' Instancie un objet application Outlook
        Set objOL = CreateObject("Outlook.Application")
        
        ' Obtient le namespace MAPI
        Set objNS = objOL.GetNamespace("MAPI")
        
        ' Obtient le dossier Boîte de réception
        Set objFolder = objNS.GetDefaultFolder(olFolderInbox)
        
        ' Parcourt chaque élément dans le dossier Boîte de réception
        For Each objItem In objFolder.Items
            
            ' Vérifie si l'élément est un MailItem
            If objItem.Class = olMail Then
                
                ' Parcourt chaque pièce jointe dans le MailItem
                For Each objAttachment In objItem.Attachments
                    
                    ' Enregistre la pièce jointe dans le chemin du dossier spécifié
                    objAttachment.SaveAsFile strFolderPath & objAttachment.FileName
                    
                Next objAttachment
                
                ' Déplace le MailItem dans le dossier spécifié
                objItem.Move objFolder.Folders(strFolderName)
                
            End If
            
        Next objItem
        
        Set objAttachment = Nothing
        Set objItem = Nothing
        Set objFolder = Nothing
        Set objNS = Nothing
        Set objOL = Nothing
        
        MsgBox "Les pièces jointes ont été enregistrées et les emails ont été déplacés.", vbInformation
        
    End Sub
    

    2
    1. PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention   21
       

      Bonjour et Merci ozone,

      Je testerais cela avant de revenir vers toi ! :)

      J'ai essayé chez moi de mettre en place la macro, chez moi, mais comme j'ai Excel 365, pas de référence "Microsoft Outlook 14.0 Object Library".

      Je tenterais Mardi sous EXCEL 2010 en entreprise.... A ce sujet si je veux indiquer que la bal est une bal générique avec une adresse et non une bal personnelle, comment dois-je faire ?

      Je travaille avec plusieurs bals.....

      Cdlt

      0
    2. brucine Messages postés 24945 Date d'inscription   Statut Membre Dernière intervention   4 178
       

      Bonjour,

      Noter au passage que si la sécurité interdit aussi de mettre en oeuvre des macros ou qu'elles sont difficiles à faire fonctionner, certains logiciels mail (par exemple The Bat!) font ça en 2 clics: le premier pour choisir de séparer les pièces jointes du corps du mail, le deuxième pour choisir le dossier de destination.

      Le souci est si le mail n'est pas propre à chaque PC mais centralisé en réseau dans l'entreprise, à titre d'exemple, la licence 50 utilisateurs coûte alors 60$.

      0
    3. PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention   21 > PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention  
       

      Bonjour,

      Tout fonctionne ! Merci !

      Bonne journée !

      1
    4. ozone_ Messages postés 1823 Statut Membre 511 > PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention  
       

      Hello,

      Peut être en essayant ainsi mais je peux pas tester chez moi :
       

      ' Adresse e-mail du compte partagé
      strSharedEmail = "adresse_email_partagee@domaine.com"
      ' Créer une nouvelle instance d'Outlook
      Set objOL = New Outlook.Application
      ' Obtenir une référence à l'espace de noms MAPI de Outlook
      Set objNamespace = objOL.GetNamespace("MAPI")
      ' Obtenir une référence à la boîte de réception partagée
      Set objFolder = objNamespace.GetSharedDefaultFolder(objNamespace.CreateRecipient(strSharedEmail), olFolderInbox)aultFolder(objNamespace.CreateRecipient(strSharedEmail), olFolderInbox)
      1
    5. ozone_ Messages postés 1823 Statut Membre 511 > PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention  
       

      Y'a du mieux alors !

      On peut tester un boucle comme celle ci à la place afin de voir si ça change la donne

      ' Boucle jusqu'à ce qu'il n'y ait plus de messages à traiter
      Do While objFolder.Items.Count > 0
          ' Parcourt chaque élément dans le dossier Boîte de réception
          For Each objItem In objFolder.Items
              ' Vérifie si l'élément est un MailItem
              If objItem.Class = olmail Then
                  ' Parcourt chaque pièce jointe dans le MailItem
                  For Each objAttachment In objItem.Attachments
                      ' Vérifie si l'objet est une pièce jointe
                      If objAttachment.Type = olByValue And objAttachment.IsEmbedded = False Then
                          ' Enregistre la pièce jointe dans le chemin du dossier spécifié
                          objAttachment.SaveAsFile strFolderPath & objAttachment.Filename
                      End If
                  Next objAttachment 'suivant
                  ' Déplace le MailItem dans le dossier spécifié
                  objItem.Move objDestFolder
              End If
          Next objItem
      Loop
      1
  2. PYGOS69 Messages postés 452 Date d'inscription   Statut Membre Dernière intervention   21
     
    Sub EnregistrerLesPiecesJointesEtDeplacerLesEmails()
        
        Dim objOL As Outlook.Application
        Dim objNS As Outlook.Namespace
        Dim objFolder As Outlook.MAPIFolder
        Dim objItem As Object
        Dim objAttachment As Attachment
        Dim strFolderPath As String
        Dim strFolderName As String
        Dim strSharedEmail As String
    
     ' Chemin du dossier spécifié en H1
     strFolderPath = Range("h1").Value
        
    ' Adresse e-mail du compte partagé (générique)
    strSharedEmail = Range("h8").Value
    
     ' Spécifiez le nom du dossier où les emails traités seront déplacés
     strFolderName = Range("h4").Value
    '  "Terminés-traités"
        
     On Error Resume Next ' gestion des erreurs
        
    ' Instancie un objet application Outlook
    Set objOL = New Outlook.Application
    ' Obtient le namespace MAPI
    Set objNamespace = objOL.GetNamespace("MAPI")
    
    ' Obtient le dossier Boîte de réception
    Set objFolder = objNamespace.GetSharedDefaultFolder(objNamespace.CreateRecipient(strSharedEmail), olFolderInbox)
    
    ' Obtenir une référence au dossier "Traité"
        Set objDestFolder = objNamespace.GetDefaultFolder(olFolderInbox).Folders(strFolderName)
        
    ' Parcourt chaque élément dans le dossier Boîte de réception
    For Each objItem In objFolder.Items
            
     ' Vérifie si l'élément est un MailItem
     If objItem.Class = olmail Then
                
     ' Parcourt chaque pièce jointe dans le MailItem
     For Each objAttachment In objItem.Attachments
                    
     ' Enregistre la pièce jointe dans le chemin du dossier spécifié
     objAttachment.SaveAsFile strFolderPath & objAttachment.Filename
                    
     Next objAttachment 'suivant
                
     ' Déplace le MailItem dans le dossier spécifié..........................NE FONCTIONNE PAS le déplacement se fait sur le dossier de ma bal et non sur le dossier de ma bal spécifiée....
     objItem.Move objDestFolder
                
     End If
            
     Next objItem ' suivant
        
        Set objAttachment = Nothing
        Set objItem = Nothing
        Set objFolder = Nothing
        Set objNS = Nothing
        Set objOL = Nothing
        
        MsgBox "Les pièces jointes ont été enregistrées et les emails ont été déplacés ! Merci d'avoir patienté ......"", vbInformation"
        
    End Sub
    0