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

Résolu
PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023 - Modifié le 5 mai 2023 à 17:37
PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023 - 10 mai 2023 à 09:05

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

A voir également:

2 réponses

ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 478
5 mai 2023 à 17:38

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
PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023 21
Modifié le 5 mai 2023 à 17:55

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
brucine Messages postés 14238 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 19 avril 2024 1 798
5 mai 2023 à 17:48

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
PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023 21 > PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023
9 mai 2023 à 10:16

Bonjour,

Tout fonctionne ! Merci !

Bonne journée !

1
ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 478 > PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023
9 mai 2023 à 12:44

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
ozone_ Messages postés 1518 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 2 juin 2023 478 > PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023
9 mai 2023 à 18:38

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
PYGOS69 Messages postés 452 Date d'inscription jeudi 23 août 2012 Statut Membre Dernière intervention 10 octobre 2023 21
Modifié le 9 mai 2023 à 15:40
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