IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Outlook Discussion :

Récupération chronologique des pièces jointes


Sujet :

VBA Outlook

  1. #1
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Récupération chronologique des pièces jointes
    Bonjour à tous,

    Je suis en train de travailler sur un projet qui permet de pouvoir récupérer des pièces jointes envoyé sur ma boite mail Outlook et qui vient se copier sur mon serveur.

    Ma macro fonctionne bien lorsque Outlook est ouvert.
    Les différentes étapes de ma macro:
    • Dès que je reçois un nouveau mail ma macro se lance
    • Tester l'objet du mail
    • Changer le status du mail en "lu"
    • Déplacer le mail dans un dossier Outlook particulier
    • Enregistrer la pièce jointe dans un dossier de mon serveur


    Mon problème est qu'il faudrait que ma macro fonctionne lorsque Outlook est fermé. Il me semble que ce n'est pas possible à faire.

    Du coup, je voulais créer une autre macro que je viendrais activer à chaque fois que je lance Outlook afin de pouvoir traiter les différentes pièces jointes des mails reçus.
    J'ai une contrainte qui est que cette macro s’exécute de façon chronologique afin que si j'ai deux fois le même nom de pièce jointe, la plus récente reste sur le serveur.

    Pour ce qui est de mon niveau VBA, je n'ai fait qu'apprendre via différent tutos/forum du coup mon niveau n'est pas top ...

    J'aimerai savoir si vous pensez qu'il est judicieux de résoudre mon problème comme ça? Sinon si vous avez une autre solution pour mon problème, je suis preneur.


    Merci d'avance,

    Yan

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    la macro qui se lance au demarrage d'Outlook est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Application_Startup()
     
    End Sub
    Attention toutefois, lors de l'ouverture, tes mails ne sont pas encore tous arrives
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    Si ton comptes OUTLOOK est bien paramétré avec l'option "Utiliser le mode Exchange mis en cache" (en bas à droite cela doit être noté "Connecté à Microsoft Exchange")
    Ta macro va être traité au fur et à mesure de la réception de Emails.

    Par contre rien ne garanti qu'ils arrivent par ordre Chronologique d'envoi.

    le mieux serait d'avoir un "variable public" où tu enregistres la date et tu la compare au suivant

  4. #4
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci de vos réponses

    Citation Envoyé par Jean-Philippe André Voir le message

    Attention toutefois, lors de l'ouverture, tes mails ne sont pas encore tous arrives
    D'accord, du coup il va falloir que j'utilise une variable comme me préconise Oliv-.
    Je suis bien connecté à Microsoft Exchange pour info.

    Du coup si vous êtes d'accord, il va falloir que je fasse deux boucles:
    • une qui me permet de tester les différentes dates de réception des mails afin de pouvoir faire un ordre de traitement;
    • une autre qui permet d'activer ma macro en fonction de l'ordre de traitement.


    Çà à l'air facile à faire écrit comme ça si seulement

    Une autre petite question, actuellement mon code se lance lors de la réception d'un nouveau Mail, pourquoi du coup lorsqu'on lance Outlook le code ne se lance pas alors que je reçois mes mails reçus pendant que Outlook était fermé. Ils ne sont pas considérés comme nouveaux mail reçus?

    Yan.

  5. #5
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par yanrcc Voir le message
    Une autre petite question, actuellement mon code se lance lors de la réception d'un nouveau Mail, pourquoi du coup lorsqu'on lance Outlook le code ne se lance pas alors que je reçois mes mails reçus pendant que Outlook était fermé. Ils ne sont pas considérés comme nouveaux mail reçus?

    Yan.
    oui ca devrait !

    tu devrais publier ton code qu'on y voit plus clair

  6. #6
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ci-joint mon code que j'ai mis dans ThisOutlookSession:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
     
        Dim MonApp As Outlook.Application
        Dim MonMail As Object
        Dim MonNameSpace As Outlook.NameSpace
        Dim MonDossier As Outlook.Folder
        Dim strAttachment As String
        Dim NbAttachments As Integer
        Dim body As String
        Dim chemin As String
        Dim i As Integer
     
     
        Set MonApp = Outlook.Application
        Set MonNameSpace = MonApp.GetNamespace("MAPI")
        Set MonDossier = MonNameSpace.GetDefaultFolder(olFolderInbox)
        Set MonMail = Application.Session.GetItemFromID(EntryIDCollection)
        Set XLapp = CreateObject("Excel.Application")
        numero = MonDossier.Items.Count
        Set MonMail = MonDossier.Items(numero)
        chemin = "C:\Users\yan\Desktop\DONNEES\"
     
     
        If MonMail.Subject = "donnees_test" Then
            MonMail.UnRead = False
            MonMail.Move MonDossier.Folders("Donnees")
            NbAttachments = MonMail.Attachments.Count
            i = 1
                    Do While i <= NbAttachments
                    strAttachment = MonMail.Attachments.Item(i).FileName
                    MonMail.Attachments.Item(i).SaveAsFile chemin & strAttachment
                    i = i + 1
                    Loop
     
        End If
     
     
    End Sub
    S'il te faut plus d'informations, n'hésites pas. Merci d'avance.

    Yan

  7. #7
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    Qu'est ce qui te fait penser que la macro ne se déclenche pas à l'ouverture ? rien n'est déplacé ?

  8. #8
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    Bonjour,
    Qu'est ce qui te fait penser que la macro ne se déclenche pas à l'ouverture ? rien n'est déplacé ?
    Oui c'est ça. La pièce jointe n'est pas déplacée dans mon dossier. Le mail n'est pas déplacé dans le dossier Outlook et il est toujours à l'état non lu.

    Le code fonctionne correctement lorsque Outlook est lancé et que je reçois un mail pendant que mon Outlook est ouvert.

  9. #9
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Je viens de tester avec une règle et un script. Il semblerait que cela fonctionne dès l'ouverture de Outlook.
    Cela semble-t-il plus judicieux de résoudre mon problème comme ça?

  10. #10
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    En relisant l'aide c'est effectivement la solution que tu dois utiliser

    Remarques


    Cet événement se déclenche une fois pour chaque élément reçu et traité par Microsoft Outlook. L’élément peut être de différents types, par exemple MailItem, MeetingItem ou SharingItem. La chaîne EntryIDsCollection contient l’ID d’entrée qui correspond à cet élément. Notez que ce comportement diffère des versions précédentes de l’événement lorsque la EntryIDCollection contenait une liste d’ID d’entrées séparés par des virgules de tous les éléments reçus dans la Boîte de réception depuis le dernier déclenchement de l’élément.

    Cet événement n’est pas disponible dans Microsoft Visual Basic Scripting Edition (VBScript).

    Cet événement se déclenche pour les compte de messagerie qui fournissent des notifications pour les messages reçus, tels que les comptes Microsoft Exchange Server et POP3.

    L’événement NewMailEx se déclenche lorsqu’un nouveau message arrive dans la Boîte de réception et avant que le traitement des règles client soit effectué. Vous pouvez utiliser l’ID d’entrée retourné dans le tableau EntryIDCollection pour appeler la méthode NameSpace.GetItemFromID et traiter l’élément. Utilisez cette méthode avec précaution afin de minimiser l’impact sur les performances d’Outlook. Toutefois, en fonction de la configuration de l’ordinateur client, après l’arrivée d’un nouveau message dans la Boîte de réception, les traitements tels que le filtrage de courrier indésirable et les règles client qui déplacent le nouveau message de la Boîte de réception vers un autre dossier peuvent se produire de manière asynchrone. Vous ne devez pas supposer qu’après le déclenchement de ces événements vous aurez toujours une augmentation d’un élément du nombre d’éléments dans la Boîte de réception.

    Pour les utilisateurs ayant un compte Exchange Server (mode Exchange non mis en cache et mode Exchange mis en cache), l’événement sera déclenché uniquement pour les messages qui arrivent au serveur après le démarrage d’Outlook. L’événement ne sera pas déclenché pour les messages qui sont synchronisés en mode Exchange mis en cache immédiatement après le démarrage d’Outlook, ni pour les messages qui sont déjà sur le serveur au démarrage d’Outlook en mode Exchange non mis en cache.

    Pour les utilisateurs utilisant le mode Exchange mis en cache, l’événement se déclenche dans tous les cas, à condition qu’Outlook soit en cours d’exécution lors de la réception du message : Télécharger les éléments complets, Télécharger les en-têtes et Télécharger les en-têtes puis les éléments complets.

  11. #11
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    En relisant l'aide c'est effectivement la solution que tu dois utiliser
    Effectivement tout s'explique. Je viens de tester avec un script et le code, cela fonctionne correctement même lors de l'ouverture de Outlook.

    Un petit bémol, j'ai essayé d'envoyer à la suite plusieurs mails avec pièces jointes nommées avec le même nom.
    La dernière des pièces jointes extraites dans mon dossier windows n'est pas la dernière qui a été envoyé.

    Merci pour tes réponses Oliv- .

  12. #12
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Quelle date testes tu ?

  13. #13
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    Quelle date testes tu ?
    Je réceptionne des fichiers Excel qui sont nommés "Nom_date".

    J'ai testé en envoyant lorsque mon Outlook est fermé deux fichiers ayant le même nom à 20s d’écart.
    Lors de l'ouverture de Outlook, ma macro se lance, mais je n'ai pas récupéré le dernier fichier envoyé.

  14. #14
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut,

    Si j'ai bien compris tu reçois plusieurs Emails ayant le même sujet et un PJ ayant le même nom genre :"toto_20170124.xls"

    et tu ne dois garder que le plus récent.

    Donc ce n'est pas le nom du fichier qui te donne cette info mais la date d'envoi du Mail, c'est cette date que tu dois sotcker dans une varaible publique et comparer pour savoir si tu gardes la pj

    es tu d'accord sur ce principe ?

  15. #15
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Oui c'est le principe.
    Mais après, j'ai fait des tests avec des mails envoyé à 10 secondes d'écart.
    Je pense que la date de réception des mails ne prends pas en compte les secondes.
    Du coup, lorsque je reçois deux mails du "25/01/2017 09:51" (l'un à 09h51m20s et l'autre à 09h51m30s).
    Je ne peux pas différencier lequel des deux mails est arrivés en premier.

    J'ai ce problème que lorsque Outlook est fermé. Ai-je raison que ça vient du format de la date ?

  16. #16
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    la propriete ReceivedTime ne correspond-elle pas a ton besoin ?

    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  17. #17
    Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Janvier 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : ingé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    la propriete ReceivedTime ne correspond-elle pas a ton besoin ?

    Nom : ex_mail.png
Affichages : 644
Taille : 34,2 Ko

    Cela m'a permis de voir que le premier mail qui est traité est bien le plus récent reçu. Du coup, j'ai pu voir qu'avec ReceivedTime il est possible de traité à la seconde le mail reçu.

    Par conséquent, si je veux faire en sorte que ma macro traite les mails de façon chronologique, il faut bien que j'utilise une variable afin de comparer les dates de réception.

    Le code risque d'être fastidieux sachant que je ne sais pas combien de mail je peux recevoir pendant que mon Outlook est fermé. Non?

    Encore Merci pour vos réponses.

  18. #18
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,
    je partirai plutôt sur objmail.senton

    qui doit donner la date d'envoi #25/01/2017 10:44:23#

    dans le mail que j'ai pris comme exemple , la propriété .receivedTime donne #25/01/2017 10:44:20# il doit y avoir un des serveurs de messagerie qui n'est pas à la bonne heure.

    Sur un Email "interne" la date .receivedTime >.senton


    tu dois avoir un code comme cela


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Public  MaDateEnMemoire as Date
     
     
     
    Sub monsrcipt (MonMail as outlook.mailitem)
     
     
    If MonMail.Senton > MaDateEnMemoire then 
     
    '  j'enregistre la pj
          NbAttachments = MonMail.Attachments.Count
            i = 1
                    Do While i <= NbAttachments
                    strAttachment = MonMail.Attachments.Item(i).FileName
                    MonMail.Attachments.Item(i).SaveAsFile chemin & strAttachment
                    i = i + 1
                    Loop
     
     
    MaDateEnMemoire=MonMail.Senton 
     
     
    Else
     
    ' je fais rien
     
    End if
     
    End sub

Discussions similaires

  1. [FAQ] [Access 2007] Gestion des pièces jointes en VBA
    Par Tofalu dans le forum Contribuez
    Réponses: 4
    Dernier message: 04/07/2006, 00h16
  2. gestion des Piéces Jointes
    Par dimkha dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 01/12/2005, 17h09
  3. Encodage des pièces jointes d'un mail : toujours base64 ?
    Par Michaël dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 15/10/2005, 12h34
  4. affichage des pièces jointe sous outllook 2000
    Par darkbm dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 29/10/2003, 11h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo