Extraire les pièces jointes d’Outlook en VBA

Dans Outlook (pas Express), j’ai des e-mails avec pièces jointes. Comment extraire toutes ces pièces jointes automatiquement, en VBA, dans un dossier du disque dur ?

Mise en place

Le code qui va suivre utilise lui-même d’autres portions de VBA publiées sur ce blog, portions que vous devez aussi intégrer à votre base de données. Reportez-vous à ces articles :

D’autre part, votre projet VBA doit référencer la bibliothèque « Microsoft Outlook x.y Object Library » (x.y étant votre version d’Outlook, par exemple 12.0). Pour plus de détails sur les références, consultez cet article du blog.

Le code

Voici 2 procédures VBA à recopier intégralement dans un module standard de votre base de données.

Tester le code

En principe, vous appelez la 1ère des deux procédures de cette manière :

  1. Ouvrez la fenêtre Exécution (CTRL + G).
  2. Tapez :
    SaveAttachments "C:undossierexistantquelconque"
    puis [Entrée].

Toutes les pièces jointes de messages situés dans la boîte de réception seront alors extraites dans le dossier souhaité (s’il existe, bien sûr).

Notes
  • Si deux messages (ou plus) contiennent une pièce jointe de même nom, ces pièces jointes seront toutes sauvées et numérotées différemment. Par exemple : photo.jpg, photo-00001.jpg, photo-00002.jpg, etc. C’est la fonction FilenameInc() traitée dans cet article qui prend en charge la numérotation.
  • La fenêtre Exécution affiche quelques informations utiles (sujet du message, chemin de la pièce jointe sauvegardée).

Variante

Si votre boîte de réception contient des sous-dossiers, ceux-ci ne sont pas traités par défaut. Si vous souhaitez que tous les sous-dossiers de votre boîte de réception soient parcourus, écrivez plutôt :
SaveAttachments "C:undossierexistantquelconque", True
Le second paramètre indique qu’il faut parcourir les sous-dossiers de façon récursive.

Vous aimerez aussi...

23 réponses

  1. Athénaïs dit :

    Bonjour,
    pourriez-vous m’indiquer la modification de script à effectuer pour ajouter la date du jour au nom des fichiers copiés ? Par exemple : France_ventes_20160210.txt, Allemagne_ventes_20160210.txt, etc.
    Ainsi les fichiers du jour ne viennent pas effacer ceux de la veille.
    Merci d’avance !

    • Hervé Inisan dit :

      A vue de nez, il faudrait remplacer la ligne :
      strFile = FilenameInc(strTargetFolder & att.Filename)
      par quelque chose comme :
      strFile = Format(Now(), "yyyymmdd") & "_" & att.Filename
      J’ai placé la date plutôt devant, pour simplifier la gestion de l’extension. En adaptant un peu, on peut placer la date avant l’extension.

  2. Max60 dit :

    Bonjour ,
    Bien intéressé aussi par ce prog , je cherche (en vain ..) à faire fonctionner…
    Problème :
    Le prog se fige sur la fonction « Function FilenameInc(ByVal strFile As String) As String » avec FilePath de « FilePath(strFile) » selectionné !
    Le message d’erreur est ‘Erreur de compilation , Sub ou Function non définie »

    Qu’en pensez-vous ?
    Merci. par avance.

    FilePath(strFile)

  3. ILIASSE dit :

    Bonjour,

    Je voudrais savoir si il y a une possibilité d’insérer une règle d’exception dans l’extraction. je souhaite extraire les pièces jointe de tous les mails sauf ceux qui finissent par « group.com »

    Merci d’avance pour votre aide

    • Hervé Inisan dit :

      A priori, ça devrait être possible : dans la procédure SaveFolderAttachments, mi est un objet de type MailItem. Il y a donc moyen d’obtenir l’émetteur ou le(s) destinaire(s), et de rajouter un If pour tester si la règle est respectée ou non. A affiner, je n’ai pas eu le temps de tester. 😉

  4. SC dit :

    Bonjour,

    Simplement pour vous informer que les liens proposés vers les autres portions de VBA nécessaires au bon fonctionnement du code proposé sont obsolètes ce qui est bien dommage. Cela est égalemeent le cas pour d’autre pages de ce site.

    Bien cordialemeent

    • Hervé Inisan dit :

      Merci pour le retour. Effectivement, suite à la migration récente du site, certains liens ont été avalés. 🙁 J’en ai traité un très grand nombre en automatique, mais certains sont passés à la trappe. Je rectifie dès que j’ai plus de temps. 😉

  5. Hervé Inisan dit :

    anthooooony > En fait, ce n’est ni un problème Access, ni un problème Excel : c’est un truc à faire dans Outlook uniquement. Il faudrait sans doute que tu appelles la macro dans l’événement NewMail de Outlook (cet événement se déclenche à chaque réception de message).

  6. anthooooony dit :

    Bonjour,

    Je cherche depuis pret de deux semaines un moyen de lancer une macro en l’occurence celle présente ci dessous à la reception d’un nouvel email d’un expéditeur précis.

    J’ai crée une regle pour que lorsque je recois un email(destinataire précis) avec une piece jointe elle aille dans un dossier bien précis
    ensuite j’ai une macro que lorsque je la lance mets toutes les pieces jointes du dossier dans un endroit du disque dur

    mais je cherche un moyen de mettre en relation la regle à la macro.

    En faite, de qu’imaginons l’utilisateur anthooooony@hotmail.com envoie un email avec une piece jointe que la macro se lance et enregistrer les pieces jointes dans mon dd.
    C’est dommage que nous puissions pas le faire nativement à partir d’excel au lieu de faire des regles puis des macros grr

    merci en de votre aide

    anthooooony

  7. Hervé Inisan dit :

    ewen > Comme il est indiqué en début d’article, il faut recopier dans un module d’autres fonctions publiées sur le blog, notamment la fonction AddBackSlash(). Le lien figure en début d’article.

  8. ewen dit :

    Bonjour

    Ce code me pose quelque problème. Bien entendus mon projet VBA référence la bibliothèque « Microsoft Outlook 11.0 Object Library ».

    Mais apres quand j’execute le code cette fonction n’est pas définie :AddBackslash???

    Merci

  9. Hervé Inisan dit :

    pauline > Ça marche effectivement comme ça. On pourrait utiliser une variante à la place de Parent, mais le principe est là.

    Content que tu aies pu trouver de ton côté. Bon dev’ !

  10. pauline dit :

    En fait c’est bon j’ai réussi, il faut rajouter après:
    > Set ns = olApp.GetNamespace(« MAPI »)
    Set fld = ns.GetDefaultFolder(olFolderInbox)

    > Set myFolder = fld.Parent.Folders(nomdossier)

    et remplacer SaveFolderAttachments fld, strTargetFolder, blnIncludeSubFolders
    par : SaveFolderAttachments myFolder, strTargetFolder, blnIncludeSubFolders

    et dans la déclaration de variable ne pas oublier > Dim myFolder As Outlook.MAPIFolder
    et on vide la variable à la fin : Set myFolder = Nothing

    J’utilise une variable nomdossier pour pouvoir réutiliser ma fonction, mais en mettant le nom de dossier entre «  » ça marche aussi.

    Je ne sais pas si cette façon de faire est la plus pratique mais ça marche.

    Merci encore pour tout.

  11. pauline dit :

    Bonjour,

    Non se serait pour un dossier au même niveau que la boîte de réception dans la boîte aux lettres, il s’appelle ARCHIVES_LDD, j’ai essayé la méthode avec le sous-dossier, le problème c’est qu’il pointe directement vers la boîte de réception alors que moi je voudrais me mettre sur un autre dossier.

    J’espère que j’ai été claire.

    Merci beaucoup.

  12. Hervé Inisan dit :

    pauline > Quel dossier par exemple ?

    Pour un sous-dossier de la boîte de réception, ma réponse donnée à matt peut convenir.

  13. pauline dit :

    Bonjour,

    Merci beaucoup pour ce code, je voudrais savoir quels modifications apporter si je veux pointer non pas sur la boîte de réception mais sur un autre dossier de la boite aux lettres.

    Merci beaucoup

  14. Hervé Inisan dit :

    matt > Pour cibler un sous-dossier de la boîte de réception, il faut remplacer la ligne :

    Par :

    xyz est le nom d’un sous-dossier.

    L’idéal serait d’aménager la procédure SaveAttachments pour qu’elle gère ça systématiquement.

  15. matt dit :

    Bonjour,
    quel modification à apporter si on cible directement un sous dossier de la boite de réception et non l’intégralité des mails ?

    Merci

  16. Hervé Inisan dit :

    Patrick_Oise > Le principe consiste à copier la pièce jointe vers le disque, puis à la supprimer. La méthode Delete de la classe Attachment devrait faire l’affaire. Il faudrait rajouter :

    après la ligne :

  17. patrice_oise dit :

    Bonjour,

    Cà marche à la perfection bravo mais j’ai une question :
    Quelles modifications à apporter au code si je veux « extraire » et non seulement « copier » les fichiers ??

    Merci pour votre réponse

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *