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 Access Discussion :

Lecture de mail dans un folder OutLook un sur deux


Sujet :

VBA Access

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Lecture de mail dans un folder OutLook un sur deux
    Bonjour à tous.

    Il y a un phénomène que j'ai du mal à m'expliquer dans mon code. Mais posons les bases de suite :
    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
     
    Private Sub Lancer_Click() 
    'lancement de l'objet Outlook pour trouver les mails à gérer
      Dim outlookApp As New Outlook.Application
      Dim olNs As Outlook.NameSpace
      Dim Fldr, FldrError, FldrTraite As Outlook.MAPIFolder
      Dim olMail As MailItem
    'Préparation des répertoires dans OutLook
      Set olNs = outlookApp.GetNamespace("MAPI")
      Set Fldr = olNs.Folders.GetFirst
      Set FldrError = Fldr.Folders("EVENTError")
      Set FldrTraite = Fldr.Folders("EVENTTraite")
      Set Fldr = Fldr.Folders("EVENT")
      Set myitems = Fldr.Items
     
     Dim SaisieTag As Integer
     MsgBox myitems.Count
     For Each olMail In myitems
     
    'ICI je fais des traitments pour trouver des données dans le corps des mails.
    'ma variable SaisieTag me permet de gérer des "erreurs" selon mes traitements avec parfois un "GoTo suivant"
     
    suivant:
        If SaisieTag = 1 Then
            olMail.Move FldrError
        Else
            olMail.Move FldrTraite
        End If
     
    Next
     
     MsgBox "Fin de traitement"
     
    End Sub
    Ce que je ne comprends pas c'est pourquoi il ne me lit pas tous les mails dans le folder de base ?
    Il ne m'en lit que la moitié. Sur ma base de test j'ai 147 mails et il ne m'en traite que 73, il m'en reste donc 74 dans le folder. Mais si je relance, il ne m'en traite que 37 et ainsi de suite sur des lancements successifs, toujours la moité

    Est ce que par hazard j'oublierais un truc, du genre le recaler sur le bon folder après le move ?

    MErci pour votre aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Points : 148
    Points
    148
    Par défaut
    Bonjour,

    Est-ce que par hasard, en plus de faire la moitié, il en saute un sur deux?
    Si c'est le cas il y a peut être quelque chose avec le For Each qui te permet de parcourir tes mails, et un autre morceau de code à l'intérieur de cette boucle qui va aussi itérer sur ces mails (genre ton olMail.Move)?

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.
    J'ai pris le parti de suivre ton idée et supprimer tous les traitements que je fais, histoire de confirmer ou infirmer la chose.
    Voici mon code complet qui, comme tu le verras, est simplifié à fond :
    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
     
    Sub testpourmoi()
    'lancement de l'objet Outlook pour trouver les mails à gérer
      Dim outlookApp As New Outlook.Application
      Dim olNs As Outlook.NameSpace
      Dim Fldr, FldrError, FldrTraite As Outlook.MAPIFolder
      Dim olMail As MailItem
    'Préparation des répertoires dans OutLook
      Set olNs = outlookApp.GetNamespace("MAPI")
      Set Fldr = olNs.Folders.GetFirst
      Set FldrError = Fldr.Folders("EVENTError")
      Set FldrTraite = Fldr.Folders("EVENTTraite")
      Set Fldr = Fldr.Folders("EVENT")
      Set myitems = Fldr.Items
     
     Dim SaisieTag As Integer
     SaisieTag = 0
     MsgBox myitems.Count
     For Each olMail In myitems
        If InStr(olMail.Subject, "TRF") = 0 Then
            SaisieTag = 1
        Else
            SaisieTag = 0
        End If
     
     
        If SaisieTag = 1 Then
            olMail.Move FldrError
        Else
            olMail.Move FldrTraite
        End If
        SaisieTag = 0
     Next
     MsgBox "Fin de traitement"
    End Sub
    En gros soit y a TRF dans le sujet et ça va dans le folder EVENTTraite, soit y a pas et ça va dans le folder EVENTError.
    Je viens de lancer le traitement qui m'affiche 147 au début et dans les folder j'ai le résultat suivant :
    EVENT : 73
    EVENTError : 47
    EVENTTraite : 27 (avec tous les TRF que j'atendais)

    Par contre ce que je n'arrive pas à suivre c'est le un sur deux. Je ne comprends pas son ordre de lecture du folder.
    A noter aussi que tant que je ne fais pas de Move il traite bien TOUS les mails dans le folder (parce que j'ai essayé ça avant...)
    Et si je relance de suite, il me reste encore 36 mails dans le folder EVENT.

    Une autre idée ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Points : 148
    Points
    148
    Par défaut
    Je pense du coup que quand tu fais un move, olMail prends la valeur du mail suivant
    En gros, si tu as 100 mails, tu déplaces le premier, du coup tu en as plus que 99 et ensuite tu itère à celui d'après. Du coup tu es sur le troisème mail et le deuxième n'a pas été traité

    Essaye de remplacer ta boucle for each par un While myitems.Count <> 0 et dedans tu travailles toujours avec le premier mail.

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, je commence à comprendre, mais cela reste un peu obscure.

    J'ai modifié la boucle de la manière suivante :

    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
     
    While myItems.Count <> 0
     
        olMail = myItems.GetFirst
     
     
        If InStr(olMail.Subject, "TRF") = 0 Then
            SaisieTag = 1
        Else
            SaisieTag = 0
        End If
     
        If SaisieTag = 1 Then
            olMail.Move FldrError
        Else
            olMail.Move FldrTraite
        End If
        SaisieTag = 0
        Set myItem = myItems.FindNext
     
     Wend
    Sauf que sur le GetFirst il me donne l'erreur suivant et là comprends pas du tout
    Object variable or With block variable not set
    Je vois pas du tout de quoi il parle.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Bon, c'est vicieux en fait, je trouve

    D'abords j'ia oublié le Set sur el olmail.
    Mais ce n'est qu'un detail
    Voici le code final de la boucle
    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
     
    While myItems.Count <> 0
     
        Set olMail = myItems.GetFirst
     
        If InStr(olMail.Subject, "TRF") = 0 Then
            SaisieTag = 1
        Else
            SaisieTag = 0
        End If
     
        If SaisieTag = 1 Then
            olMail.Move FldrError
        Else
            olMail.Move FldrTraite
        End If
        SaisieTag = 0
        Set myItems = Fldr.Items
     
     Wend
    Donc en début de boucle on fait un GetFirst pour qu'il se positionne sur le premier mail.
    Mais en fin de boucle on oublie pas de rafraichir la chose de manière assez violente avec une recherche litérale du contenu du folder.

    Bon, sur mes tests basiques ça fonctionne. Je vais implémenter cela dans mon vrai code maintenant, espérons que je n'ai pas de surprise.

    MErci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Points : 148
    Points
    148
    Par défaut
    Tu es sûr d'avoir besoin de Set myItems = Fldr.Items ?
    Parce que si tu as besoin de mettre à jour myItems, dans ce cas là la boucle For Each de tout à l'heure n'est pas censé sauter un mail sur deux...

    Il y a aussi moyen que tu fasse une boucle For i = 0 To myItems.Count pour itérer sur chaque mail, et en travaillant sur le premier sans utiliser le i (ou alors une boucle while avec un i qui s'incrémente dedans, comme tu veux)

  8. #8
    Membre régulier
    Homme Profil pro
    AutoEntrepreneur Photo
    Inscrit en
    Avril 2015
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : AutoEntrepreneur Photo
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 141
    Points : 86
    Points
    86
    Par défaut
    Hello,
    Je suis un novice Access / VBA, donc dsl si ma réponse est un peu à côté de la plaque...
    Cependant, j'ai eu une problématique assez similaire récemment.

    Je voulais lister les mails d'une mailbox, et du dossier boite de réception, et... ma boucle ne parvenait pas au bout des mails.
    De mon côté, ceux sont les mails en provenance de l'administrateur qui faisaient sauter ma boucle


    Après avoir essayé des "For i" puis "For each", c'est finalement en vérifiant la class (merci Oliv. et galoir) que j'ai enfin trouvé la boucle qui fonctionne bien:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''Lister les mails d'une Mailbox
    '''''''''''''''''' ctrListeMail = le nom de la zone de liste à compléter
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function Mailbox2(strMailbox As String, ctrListeMail As Control)
    'Dim myOlApp As Outlook.Application
    Dim myNamespace As Outlook.NameSpace
    Dim myFolder As Outlook.MAPIFolder
    Dim i As Long
    Dim rst As DAO.Recordset
     
    'On vide la table
     Set rst = CurrentDb.OpenRecordset("T_TMail", dbOpenDynaset)
    While Not rst.EOF
      rst.Delete
      rst.MoveNext
    Wend
     
    'on selectionne la mailbox
    Set myNamespace = GetNamespace("MAPI")
    Set myFolder = myNamespace.Folders(strMailbox)
    'on selectionne le dossier outlook
    Set myFolder = myFolder.Folders("Boîte de réception")
     
    Dim oMail As MailItem
    Dim oItem As Object
     
     
    For Each oItem In myFolder.Items
        If oItem.Class = olMail Then
           Set oMail = oItem
    'Pour ma part, il s'agissait d'alimenter une table, mais tu peux remplacer par ton traitement.
         rst.AddNew
         rst("DateReception") = oMail.ReceivedTime
         rst("TitreMail") = oMail
         rst("Expediteur") = oMail.SenderEmailAddress
         rst("Destinataire") = strMailbox
         rst("EntryID") = oMail.EntryID
         rst.Update
        End If
     
     
    Set oMail = Nothing
    Set myNamespace = Nothing
    Set myFolder = Nothing
     
     Next oItem
    Me.Refresh
    End Function
    A+

    zkunk

  9. #9
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Hello tout el monde.

    @zkunk : ta réponse est très intéressante mais tu as zoppé le detail : c'est le .Move qui fait sauter la lecture de la liste. Avec un For Each je lis tous les mails sans aucun souci mais dés que je fais un .Move, ça bug.

    @syrald : si je fais pas le Set myItems, le get first ne comprends pas et de ce que j'ai analysé il reprend le premier de la liste globale et donc ne le trouve vu qu'il a été .Move. Je vais tester le For avec le Count

    Merci à tous pour votre aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

Discussions similaires

  1. [OL-2016] Macro Sauvegarde du mail dans une règle Outlook
    Par MonSavon dans le forum VBA Outlook
    Réponses: 3
    Dernier message: 14/04/2017, 12h22
  2. Test sur l'exitence d'un mail dans un dossier outlook 2003
    Par samson_02 dans le forum VBA Outlook
    Réponses: 10
    Dernier message: 13/02/2009, 14h49
  3. Réponses: 1
    Dernier message: 07/11/2008, 21h03
  4. [WLM] Lecture des mails dans Windows Live Mail
    Par martialuk dans le forum Messagerie instantanée
    Réponses: 0
    Dernier message: 09/09/2007, 14h42
  5. [Mail] Ajout auto dans le calendrier "Outlook"
    Par EFCAugure dans le forum Langage
    Réponses: 7
    Dernier message: 04/12/2006, 17h42

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