Macro Extract PJ Outlook en VBA

Bonjour à tous,

j'ai commencé la programmation il y a peu, j'ai un niveau maintenant convenable de VBA où depuis un mois, dans le cadre de mon nouveau travail, il m'a été donné de manipuler plusieurs données

A présent cependant on me demande d'utiliser VBA dans Outlook et j'avoue que je n'ai jamais vu ce genre d'application, et je n'ai pas reussi à trouver exactement ce qu'il me fallait sur le net

comme c'est une demande urgente de mon employeur, je vous demande de l'aide pour le point suivant :

tous les jours:

- je recois un mail du destinataire "client_clearing_mo@us.bnpparibas.com"

- le sujet du mail est "BNP Paribas Revaluation Report for AXA_Cleared_Trade Position_Report as of " suivi chaque jour de la date du jour ouvré de la semaine

- dans ces mails, j'ai tous les jours en pièce-jointe un fichier csv dont le nom varie aussi : "AXA_Cleared_TradePosition_Report_0_" suivi chaque jour de la date du jour ouvré de la semaine

- ces mails sont envoyés, par une règle auto que j'ai crée dès qu'ils arrivent dans ma boite de reception, dans un sous repertoire "Reporting CTPY" puis dans un autre sous dossier "BNP"

Exemple aujourd'hui nous sommes le 05/11/19

j'ai donc recu le mail qui a été dans mon dossier boitedereception/Reporting CTPY/BNP

le sujet du mail est "BNP Paribas Revaluation Report for AXA_Cleared_Trade Position_Report as of Monday, 04 November 2019"

la pièce jointe s appelle AXA_Cleared_TradePosition_Report_0_04Nov2019_0515.csv

But de la macro :

j'aimerai que dès que je clique sur mon bouton principal (qui analyse les données), en creant un nouveau sub ExtractPJ:

  • la macro parcourt le chemin boitedereception/Reporting CTPY/BNP
  • qu'elle cherche le mail envoyé en date du jour, dont le destinataire est "client_clearing_mo@us.bnpparibas.com" et où le sujet du mail contient la chaine de caractere " AXA_Cleared_Trade Position_Report "
  • une fois le mail trouvé, qu'elle extrait le CSV en pièce jointe et le sauvegarde dans le repertoire sur mon reseau G:\OSSM\PC_AXA_Derivatives\Bruno\Macro\ExtractBNP et le nomme "ExtractBNP"

Merci infiniment pour votre aide

Bonjour BrunoC,

Je n'ai pas bien saisi si ton code VBA était dans EXCEL ou OUTLOOK. Peux-tu préciser?

Bonsoir

je programme dans VBA/Excel pour le moment

et avec ce langage je dois aller parcourir une boite mail outlook

Bonsoir,

personne ne peut m'aider ?

Bonjour Bruno,

Je te réponds dès que possible.

ah super, merci bcp pour ton aide Gerard !

Bruno,

Chose promise...

Dans une premier temps, dans VBA EXCEL, tu références "Microsoft outlook" : Outils\Références :

referencementoutlook

Ensuite, je te propose de coller la procédure suivante dans un module :

Option Explicit
Sub ScanFolder()
    Const cMailBox = "myName@localSite.fr"  'Indiquer le nom correct de la boîte de réception
    Const cPathDest = "G:\OSSM\PC_AXA_Derivatives\Bruno\Macro\ExtractBNP"
    Const cFolderLevel1 = "Reporting CTPY"
    Const cFolderLevel2 = "BNP"

    Const cSubjectBNP = "BNP Paribas Revaluation Report for AXA_Cleared_Trade Position_Report as of"
    Const cFilenameOK = "AXA_Cleared_TradePosition_Report_0_"

    Dim oOL As Outlook.Application
    Dim olNS As Outlook.Namespace
    Dim oFolders As Outlook.Folders
    Dim oMailbox As Outlook.Folder
    Dim oFromFolder1 As Outlook.Folder
    Dim oFromFolder2 As Outlook.Folder
    Dim oMail As Outlook.MailItem
    Dim oAttach As Outlook.Attachment
    Dim lNb As Long

    'Parcourir la boite mail BNP
    Set olNS = Outlook.GetNamespace("MAPI")

    Set oFolders = olNS.Folders
    'On affecte l'objet représentant la boîte à lettres
    Set oMailbox = oFolders.Item(cMailBox)
    'On affecte l'objet représentant le sous-répertoire de niveau 1
    Set oFromFolder1 = oMailbox.Folders.Item(cFolderLevel1)
    'On affecte l'objet représentant le sous-répertoire de niveau 1
    Set oFromFolder2 = oFromFolder1.Folders.Item(cFolderLevel2)

    'On parcourt tous les mails du sous répertoire
    For Each oMail In oFromFolder2.Items
        'Si le mail contient une pièce jointe
        If oMail.Attachments.Count > 0 Then
            'Si le mail est non lu
            If oMail.UnRead = True Then
                'On affecte l'objet pièce-jointe
                Set oAttach = oMail.Attachments(1)
                'Si le nom de la pièce jointe correspond au nom attendu, on traite
                If Left(oAttach.Filename, Len(cFilenameOK)) = cFilenameOK Then
                    'On recopie la pièce jointe dans le dossier de destination
                    oAttach.SaveAsFile cPathDest & "\" & oAttach.Filename
                    'On indique que le mail est lu (pour ne pas le reprendre lors de la prochaine exécution de la proc
                    oMail.UnRead = False
                    'On compte le nombre de P.J. copiées
                    lNb = lNb + 1
                End If
            End If
        End If
    Next

    'On fait le ménage
    Set oMailbox = Nothing
    Set oFromFolder1 = Nothing
    Set oFromFolder2 = Nothing
    Set oAttach = Nothing

    MsgBox "Recopie des P.J. BNP terminée!" & vbCrLf & "Nombre de fichiers copiés = " & lNb, vbExclamation
End Sub

Bonjour Gerard !

merci bcp pour ton aide, je teste çà sans faute dans la journée !

Bonjour Bruno,

Ceci dit, si tu n'as rien à faire de spécial en EXCEL, le plus simple consisterait à inclure ce code VBA directement dans OUTLOOK...

Bonsoir Gerard

si si j ai quelques bases mais je n ai jamais utilisé les objets Outlook

d'ailleurs pour l arborescence je m'etais trompé : il fallait que je parte de "Boîte de réception", puis Reporting CTPY puis BNP

du coup j'ai rajouté une variable

Const cFolderLevel1 = "Boîte de réception"

Const cFolderLevel2 = "Reporting CTPY"

Const cFolderLevel3 = "BNP"

Set oFromFolder1 = oMailbox.Folders.Item(cFolderLevel1)

Set oFromFolder2 = oFromFolder1.Folders.Item(cFolderLevel2)

Set oFromFolder3 = oFromFolder2.Folders.Item(cFolderLevel3)

de plus quand la sauvegarde de la piece jointe se fait je la renomme en "ExtractBNP.csv"

oAttach.SaveAsFile cPathDest & "\" & oAttach.Filename

'On renomme le fichier en Extract_BNP

ChDir (cPathDest)

Name oAttach.Filename As "ExtractBNP.csv"

et ca marche !!!!!

Merci bcp !!!

mais j'en profite pour demander une dernière chose

j'ai la même chose a faire avec un extract qui tombe dans le 3eme sous-dossier "GS"

j ai donc changé

Const cFolderLevel3 = "GS"

le probleme c est que je ne comprends pas trop ce que je dois mettre dans les 2 variables constantes

Const cSubjectBNP = ""

Const cFilenameOK = ""

ce qui reviendrait à m'expliquer je pense ce que fait le test suivant

If Left(oAttach.Filename, Len(cFilenameOK)) = cFilenameOK Then

ici les extracts arrivent avec les noms suivant :

GS-OTCSDIReporting-Clearing_Trade_Report-05_46_GMT-20191107-34433-0

GS-OTCSDIReporting-Clearing_Trade_Report-05_31_GMT-20191105-34433-0

plus globalement il y a toujours dans le sujet "GS-OTCSDIReporting-Clearing_Trade_Report-" puis ce qui suit est aléatoire/variable

Encore merci pour tout et l'aide sur cette dernière question

Bonjour Bruno,

Le test :

If Left(oAttach.Filename, Len(cFilenameOK)) = cFilenameOK Then

est là juste pour s'assurer que la P.J. est bien de la nature de celle attendue.

Si est est parfaitement sûr qu'il ne peut y avoir dans les mails d'autres P.J. que celles que tu attends, tu peux supprimer ce test.

Rechercher des sujets similaires à "macro extract outlook vba"