Extraire le corp du mail vers un fichier XSLM

Bonjour,

Je dispose d’une macro vba qui fonctionne très bien. Elle pour objectif d’extraire les pièces jointe des mails se trouvant dans le dossier « Retours » de ma boite mails Outlook et de les déposer dans un répertoire de type C:\Macro\Fichiers. (Pour que cela fonctionne j’ai récupéré différents composants sur le net et je les ai adaptés)

Dans mon VBA : j’ai la commande suivante :

Extraction "Retours", email@email.fr

Et le module « Extraction » est le suivant :

Sub Extraction(NomDossier As String, Expediteur As String)
    Dim OLapp As Outlook.Application
    Dim OLspace As Outlook.Namespace
    Dim olFolder As Outlook.MAPIFolder
    Dim OLinbox As Outlook.MAPIFolder
    Dim olmail As Outlook.MailItem
    Dim pceJointe As Outlook.Attachment

    Dim y As Integer, x As Integer

    Set OLapp = New Outlook.Application
    Set OLspace = OLapp.GetNamespace("MAPI")
    Set OLinbox = OLspace.GetDefaultFolder(olFolderInbox)
    Set olFolder = OLinbox.Folders(NomDossier)

    For Each olmail In olFolder.Items

            For y = 1 To olmail.Attachments.Count
                 Set pceJointe = olmail.Attachments(y)
                 x = x + 1
                 pceJointe.SaveAsFile "C:\Macro\Fichiers\" & pceJointe
                Set pceJointe = Nothing
            Next y
     '   End If
    Next olmail

End Sub

Aujourd’hui, je voudrai récupérer ce module ‘Extraction’ pour une autre procédure qui me permettrait d’extraire le corps d’autres mails un par un pour les déposer dans un fichier Excel contenant déjà une macro.

Car je récupère le contenu d’une dizaine de mails chaque jour que je copie colle un par un dans ce fichier et après chaque collage je lance ma macro permettant le remodelage de toutes les informations du mail pour les intégrer dans une base Excel exploitable.

Mais je n’arrive pas à adapter le module. J’ai testé différentes choses trouvées sur le net mais rien n’aboutit. Pourtant je suis convaincu qu’il n’y aurait pas grande chose à faire pour que cela fonctionne.

En résumé

  • Je dépose mes mails dans le répertoire ‘Retours’
  • Je lance la macro qui récupère le corps du premier mail (peu importe l’ordre) afin de la déposer sur la cellule A1 de mon intégration.xlsm
  • La macro lancerait ensuite le [CTRL]+[M] de la procédure déjà existante pour le remodelage
  • Enfin, elle irait chercher le contenu du second mail, ainsi de suite.

Pourriez-vous me guider ?

Merci

Bonjour Fabien,

Peux-tu fournir une copie anonymisée de "Integration.xlsm" ?

Bonjour Gérard,

J'essaie pense pouvoir intégrer mon fichier, mais je ne sais pas si j'aurai le temps d'en télécharger un. Merci d'avance pour ton aide.

Fabien

9integration.xlsm (289.79 Ko)

Fabien,

Peux-tu confirmer que tu veux copier le message en "A1" de la feuille "SPOOL" ?

Oui

Une petite erreur dans mon texte : "si j'aurai le temps d'en télécharger un". Je voulais dire qu'avec la sécurité je ne pense pas pouvoir télécharger un fichier.

Fabien,

C'est bon, j'avais traduit...

Je te propose d'utiliser le presse-papier pour copier le contenu du corps des mails et les copier en "A1" de la feuille SPOOL.

Pou que ça marche, tu dois référencer "MSForms" - le plus simple consiste à créer une userform dans ton projet VBA : le référencement de "MSForms" va se faire automatiquement puis tu supprimes la userform.

Le code proposé partant du module "Extraction":

Sub ScanMails(NomDossier As String)
    Const sCopieAddress = "A1"
    Dim oSheet As Worksheet
    Dim oRange As Range
    Dim sBody As String
    Dim oDO As MSForms.DataObject 'Pour utiliser le presse-papier

    Dim OLapp As Outlook.Application
    Dim OLspace As Outlook.Namespace
    Dim olFolder As Outlook.MAPIFolder
    Dim OLinbox As Outlook.MAPIFolder
    Dim olmail As Outlook.MailItem

    Dim y As Integer, x As Integer

    Set OLapp = New Outlook.Application
    Set OLspace = OLapp.GetNamespace("MAPI")
    Set OLinbox = OLspace.GetDefaultFolder(olFolderInbox)
    Set olFolder = OLinbox.Folders(NomDossier)

    Set oSheet = ThisWorkbook.Worksheets("SPOOL")
    Set oRange = oSheet.Range(sCopieAddress)

    For Each olmail In olFolder.Items   'On parcourt tous les mails contenus dans le dossier
        oSheet.UsedRange.Clear          'On efface le contenu de SPOOL
        sBody = olmail.Body             'On récupère le corps du mail
        Set oDO = New MSForms.DataObject 'On réfère le presse-papier
        oDO.SetText sBody               'On réfère le corps du mail
        oDO.PutInClipboard              'On copie le corps du mail dans le presse papier
        oRange.Select                   'On sélectionne la cellule "A1" de la feuille SPOOL
        oSheet.Paste                    'On recopie le contenu du presse-paier

        MAJ                             'On passe la main au module de traduction
    Next olmail
End Sub

Merci je teste cela dès que possible et te tiens au courant

J'essaie de ne pas appliquer bêtement cela n'a pas d'intérêt.

J'ai fini par comprendre que mon MAJ ne pouvait pas être dans mon fichier final mais dans le fichier qui lance la macro générale. Et l'onglet SPOOL également, quitte a recopier ensuite les éléments du fichier global vers la base de donnée en fin de procédure. Tu confirmes ?

J'ai été perturbé aussi par :

Dim y As Integer, X As Integer

J'ai d'abord pensé que je devais rajouter une boucle. Mais finalement c'est peut être juste un oublie. Il faut le retirer n'est-ce pas ?

Ce que je comprends c'est que l'on ne peut pas lancer directement les actions du press papier par un simple :

Selection.copy

ActiveSheet.paste

C'est la raison pour laquelle on passe par des variables.

Je pense avoir compris la démarche globale.

Cependant, la commande oRange.Select n'arrive pas à faire son travaille, elle n'active pas l'onglet SPOOL

J'ai l'erreur suivante : Erreur d'execution 1004 La méthode Select de la classe Range a échoué.

Me serais-je fourvoyé ?

Merci pour ton retour

Pourtant il repère bien SPOOL car je mets volontairement des caractères dans SPOOL et il les efface.

bon, en fait j'ai fini par remplacer par quelque chose de plus simple :

Sheets("SPOOL").Select

Range("A1").Select

' oRange.Select

Et ça fonctionne apparemment, je vais poursuivre.

En tout cas un grand merci.

Bonne journée

Fabien

Fabien,

J'ai fini par comprendre que mon MAJ ne pouvait pas être dans mon fichier final mais dans le fichier qui lance la macro générale. Et l'onglet SPOOL également, quitte a recopier ensuite les éléments du fichier global vers la base de donnée en fin de procédure. Tu confirmes ?

C'est bien ça.

J'ai été perturbé aussi par :

Dim y As Integer, X As Integer

J'ai d'abord pensé que je devais rajouter une boucle. Mais finalement c'est peut être juste un oublie. Il faut le retirer n'est-ce pas ?

Oui, on peut effacer. Partant de ton module 'Extraction', j'ai l'ai modifié un minimum pour que tu t'y repères.

Ce que je comprends c'est que l'on ne peut pas lancer directement les actions du press papier par un simple :

Selection.copy

ActiveSheet.paste

C'est la raison pour laquelle on passe par des variables.

Tu as bien compris. Un 'simple' Selection.copy de peut copier que ce qui figure déjà dans la feuille. Or tu cherches à copier le contenu d'un message...

Cependant, la commande oRange.Select n'arrive pas à faire son travaille, elle n'active pas l'onglet SPOOL

J'ai l'erreur suivante : Erreur d'execution 1004 La méthode Select de la classe Range a échoué.

Difficile de comprendre ton problème sans pouvoir juger sur pièce. Peux-tu joindre la nouvelle version de ton classeur qui renvoit l'erreur?

Bonjour Gérard,

désolé pour mon temps de réactivité. Priorité à la prod :)

Je pensais que cela avait fonctionné, mais je me suis trompé. La procédure AJ n'arrive pas à faire son travail correctement.

Voici la procédure comme tu me l'as demandé (En plusieurs étapes car elle est longue)

Sub ScanMails(NomDossier As String)

Const sCopieAddress = "A1"
Dim oSheet As Worksheet
Dim oRange As Range
Dim sBody As String
Dim oDO As MSForms.DataObject 'Pour utiliser le presse-papier

Dim OLapp As Outlook.Application
Dim OLspace As Outlook.Namespace
Dim olFolder As Outlook.MAPIFolder
Dim OLinbox As Outlook.MAPIFolder
Dim olmail As Outlook.MailItem

Dim y As Integer, X As Integer

Set OLapp = New Outlook.Application
Set OLspace = OLapp.GetNamespace("MAPI")
Set OLinbox = OLspace.GetDefaultFolder(olFolderInbox)
Set olFolder = OLinbox.Folders(NomDossier)

Set oSheet = ThisWorkbook.Worksheets("SPOOL")
Set oRange = oSheet.Range(sCopieAddress)

For Each olmail In olFolder.Items 'On parcourt tous les mails contenus dans le dossier
oSheet.UsedRange.Clear 'On efface le contenu de SPOOL
sBody = olmail.Body 'On récupère le corps du mail
Set oDO = New MSForms.DataObject 'On répère le presse-papier
oDO.SetText sBody 'On répère le corps du mail
oDO.PutInClipboard 'On copie le corps du mail dans le presse papier
Sheets("SPOOL").Select
Range("A1").Select
' oRange.Select 'On sélectionne la cellule "A1" de la feuille SPOOL
oSheet.paste 'On recopie le contenu du presse-paier

MAJ 'On passe la main au module de traduction

Next olmail

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' '''
''' Intégration des print manager '''
''' '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' vider le cache

Dim SourceFileBidon, DestinationFileBidon 'fichier bidon au cas où il n'y a rien à supprimer
SourceFileBidon = "C:\Macro\Retours\Masques\suivi-alertes.xlsx" ' Define source file name.
DestinationFileBidon = "C:\Macro\Retours\DATEJ\suivi-alertes.xlsx" ' Define target file name.
FileCopy SourceFileBidon, DestinationFileBidon ' Copy source to target.

Kill "C:\Macro\Retours\DATEJ\*.*"

ScanMails "Retours"
', "exemple@email.fr"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''                                                                                       '''
'''                           Création des variables                                       '''
'''                                                                                       '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Demander la date du jour

    Dim jour As Variant
    jour = InputBox("Quelle est la date du jour ?" & Chr(10) & _
    "Sous le format : 28022017 - en cas de prise en compte de fin de mois saisir le dernier jour du mois")
    Dim jour2 As Variant
    jour2 = jour

' Création variables mois et Année et jour pour publiacation dans le bon répertoire.
' Si plantage à ce niveau, recommencez tout après avoir créer le répertoire dans SharePoint

    Workbooks.Open FileName:="C:\Macro\titresdate.xlsx"
    Windows("titresdate.xlsx").Activate

    Range("J1").Select
    ActiveCell.FormulaR1C1 = "" & jour2 & ""
    ActiveWorkbook.Save

    Windows("titresdate.xlsx").Activate
    Range("K4").Select
    Dim DATEAN As Variant
    DATEAN = Range("K4").Value

    Windows("titresdate.xlsx").Activate
    Range("K3").Select
    Dim DATEMOIS As Variant
    DATEMOIS = Range("K3").Value

    Windows("titresdate.xlsx").Activate
    Range("K5").Select
    Dim DATEJJ As Variant
    DATEJJ = Range("K5").Value
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''                                                                                       '''
'''                       Mise à jour du fichier du mois                                  '''
'''                                                                                       '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Téléchargement

 Dim SourceEQXT, DestinationEQXT
 SourceEQXT = "P:\Equinoxe\" & DATEAN & "\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm" ' Define source file name.
 DestinationEQXT = "C:\Macro\fichiers\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm" ' Define target file name.
 FileCopy SourceEQXT, DestinationEQXT ' Copy source to target.

' Ouvrir le fichier du mois

    Workbooks.Open FileName:="C:\Macro\fichiers\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm"
    Windows("cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm").Activate
    Sheets("SPOOL").Select
    ActiveWindow.WindowState = xlMaximized

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''                                                                                       '''
'''                                  Phase finale                                         '''
'''                                                                                       '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Fermeture du fichier du mois

    Windows("cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm").Activate
    Sheets("BANQUE").Select
    ActiveWorkbook.Save
    ActiveWindow.Close

' Publication

 Dim SourceEQXM, DestinationEQXM
 SourceEQXM = "C:\Macro\fichiers\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm" ' Define source file name.
 DestinationEQXM = "P:\Equinoxe\" & DATEAN & "\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm" ' Define target file name.
 FileCopy SourceEQXM, DestinationEQXM ' Copy source to target.

' Suppression du fichier temp

    Kill "C:\Macro\fichiers\cumul IBP " & DATEAN & "" & DATEMOIS & ".xlsm"

' Fermeture des fichiers

    Workbooks("titresdate.xlsx").Close SaveChanges:=False
    
Public Sub MAJ()

' Récupérer l'heure de transmission

    Dim Heure As String
    Dim Time As String

    Heure = Range("A2").Value
    Time = Right(Heure, 12)

' Concatener les lignes

    Dim iDerLig As Integer
    Dim iLig As Integer
    Dim sMot As String
    Dim icpt As Integer

    sMot = "lot logique"

    Sheets("Spool").Select
    Range("A1").Select

    If sMot = "" Then
        Exit Sub
    End If

    sMot = UCase(sMot)

    iDerLig = Range("A" & Rows.Count).End(xlUp).Row

    icpt = 0
    For iLig = 4 To iDerLig
        If InStr(1, UCase(Range("A" & iLig)), sMot) > 0 Then
            'ajoute à la ligne précédente
            Range("A" & iLig - 1).Value = Range("A" & iLig - 1).Value & " " & Range("A" & iLig).Value
            'efface la ligne
            Range("A" & iLig).Value = ""
            icpt = icpt + 1
        End If
    Next iLig

' Supprimer les lignes inutiles

   Dim i As Integer
    Application.ScreenUpdating = False
    For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & i).Value Like "*LES LOTS *" Then Rows(i).Delete
    Next i
    Application.ScreenUpdating = True
Range("A1").Select
   Dim J As Integer
    Application.ScreenUpdating = False
    For J = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & J).Value Like "*DEBDISPO*" Then Rows(J).Delete
    Next J
    Application.ScreenUpdating = True
Range("A1").Select
   Dim K As Integer
    Application.ScreenUpdating = False
    For K = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & K).Value Like "*FINDISPO*" Then Rows(K).Delete
    Next K
    Application.ScreenUpdating = True
Range("A1").Select
   Dim L As Integer
    Application.ScreenUpdating = False
    For L = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & L).Value Like "*Ce message*" Then Rows(L).Delete
    Next L
    Application.ScreenUpdating = True
Range("A1").Select
   Dim M As Integer
    Application.ScreenUpdating = False
    For M = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & M).Value Like "*Merci*" Then Rows(M).Delete
    Next M
    Application.ScreenUpdating = True
Range("A1").Select
   Dim N As Integer
    Application.ScreenUpdating = False
    For N = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & N).Value Like "*    FIN DU TRAITEMENT*" Then Rows(N).Delete
    Next N
    Application.ScreenUpdating = True
Range("A1").Select
   Dim O As Integer
    Application.ScreenUpdating = False
    For O = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & O).Value Like "*--------------*" Then Rows(O).Delete
    Next O
    Application.ScreenUpdating = True
Range("A1").Select
   Dim P As Integer
    Application.ScreenUpdating = False
    For P = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & P).Value Like "* lots envoyés dans le spool*" Then Rows(P).Delete
    Next P
    Application.ScreenUpdating = True
Range("A1").Select
   Dim Q As Integer
    Application.ScreenUpdating = False
    For Q = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & Q).Value Like "*                                    *" Then Rows(Q).Delete
    Next Q
    Application.ScreenUpdating = True
Range("A1").Select
   Dim R As Integer
    Application.ScreenUpdating = False
    For R = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
    If Range("A" & R).Value Like "*ADHERENT*" Then Rows(R).Delete
    Next R
    Application.ScreenUpdating = True

' supprimer les lignes vides

    Range("a1:a65536").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

' convertir en colonnes

    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="-", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
        1), Array(6, 1), Array(7, 1), Array(8, 1)), TrailingMinusNumbers:=True

' largeur de colonnes

    Columns("A:I").Select
    Columns("A:I").EntireColumn.AutoFit

' retirer les colonnes et mots inutiles

   Columns("C:E").Select
    Selection.Delete Shift:=xlToLeft
    Columns("E:E").Select
    Selection.Replace What:=" EXTERIEUR", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="plis ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Columns("D:D").Select
    Selection.Replace What:="pages ", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Columns("D:E").Select
    Range("E1").Activate
    Selection.NumberFormat = "#,##0 _€"

' ajouter champs A

    Columns("A:A").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

' Extraire la lettre de la banque

    Dim Z As Integer
     Z = Application.WorksheetFunction.CountA(Range("B:B"))
     Dim X As Integer
     Application.ScreenUpdating = False
     For X = 1 To Z
       Range("A" & X).FormulaR1C1 = "=MID(RC[1],3,1)"
     Next X

' Ajouter l'heure de transmission sur chaque ligne

'    Range("G1").Value = Time
     Dim A As Integer
     A = Application.WorksheetFunction.CountA(Range("B:B"))
     Dim B As Integer
     Application.ScreenUpdating = False
     For B = 1 To A
       Range("G" & B).FormulaR1C1 = Time
     Next B

    Columns("G:G").Select
    Selection.Replace What:=" ***", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

' Couper les données et coller vers le cumul

    Range("A1:G" & Z).Select
    Application.CutCopyMode = False
    Selection.Cut

' Sélectionner le première cellule vide du cumul

    Sheets("Cumul BP").Select
    Range("A1").Select
    Range("A1").End(xlDown).Offset(1, 0).Select
    ActiveSheet.paste

' repositionnement et vidage spool

    Sheets("SPOOL").Select
    Range("A1").Select

End Sub
Rechercher des sujets similaires à "extraire corp mail fichier xslm"