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 :

Boucle MailItem // Erreur Incompatibilité 13 // si Mails non remis


Sujet :

VBA Outlook

  1. #1
    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 Boucle MailItem // Erreur Incompatibilité 13 // si Mails non remis
    Bonjour,

    Je cherche à lire l'ensemble des mails d'une Mailbox sur Outlook, afin de les afficher (date de réception ; titre mail) sur un contrôle Access (zone de liste):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To myFolder.Items.Count Step -1
        If Not myFolder.Items(i) Is Nothing And myFolder.Items(i).SenderEmailAddress <> "=?Windows-1252?Q?Administrateur_syst=E8me?=" Then
                Me.zl_mailoutlook.AddItem myFolder.Items(i).ReceivedTime & ";" & myFolder.Items(i).Subject
        End If
     Next i
    Mon code plante dès que je tombe sur un mail en provenance De : Administrateur système [mailto:=?Windows-1252?Q?Administrateur_syst=E8me?=]
    Erreur d'incompatibilité 13.


    Comment puis-je éviter cette erreur? J'ai essayé d'exclure les mails en provenance de l'administrateur via SenderEmailAddress, mais je n'y arrive pas

    Si vous avez idées je suis preneur

    zkunk

  2. #2
    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,

    C'est parce que tous les élément de ton dossier ne sont pas des mailitem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If  myFolder.Items(i).class = olMail Then
    D'autre part ta boucle est fausse elle devrait être ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i =myFolder.Items.Count  To 1 Step -1
        If  myFolder.Items(i).class = olMail Then
                Me.zl_mailoutlook.AddItem myFolder.Items(i).ReceivedTime & ";" & myFolder.Items(i).Subject
        End If
     Next i

  3. #3
    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
    Bonjour Oliv, et merci pour ton aide.

    J'ai essayé en vérifiant la classe et ça annule le message d’erreur, cependant, il manque beaucoup de mail... j'ai l'impression que la boucle s'arrête quand même au même endroit... sans message d'erreur cette fois humm...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i =myFolder.Items.Count  To 1 Step -1
        If  myFolder.Items(i).class = olMail Then
                Me.zl_mailoutlook.AddItem myFolder.Items(i).ReceivedTime & ";" & myFolder.Items(i).Subject
        End If
     Next i
    Je me suis dis que c'est peut être un problème de boucle? donc j'ai donc essayé une autre boucle (qui commence par en bas) en gardant l'idée de vérifier la classe.. mais je n'y arrive pas..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each oMail In myFolder.Items
        If Not oMail Is Nothing And oMail.Class = olMail Then
                Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
        End If
     Next oMail
    voilà le reste de la function:
    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
    Function Mailbox(strMailbox As String, ctrListeMail As Control)
    Dim oMail As MailItem
    Dim myOlApp As Outlook.Application
    Dim myNamespace As Outlook.NameSpace
    Dim myFolder As Outlook.MAPIFolder
     
    '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")
     
    For Each oMail In myFolder.Items
        If Not oMail Is Nothing And oMail.Class = olMail Then
                Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
        End If
     Next oMail
    je tourne en rond, je sais plus trop comment faire =/

    zkunk

  4. #4
    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
    Si tu dois supprimer des éléments ou déplacer des éléments il faut utiliser la syntaxe
    For i =myFolder.Items.Count To 1 Step -1


    Sinon For each

    Qu'est ce qui te fais dire qu'il te manque des Emails ?

    Essaye avec 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
    Function Mailbox(strMailbox As String, ctrListeMail As Control)
    Dim oMail As MailItem
    Dim myOlApp As Outlook.Application
    Dim myNamespace As Outlook.NameSpace
    Dim myFolder As Outlook.MAPIFolder
    Dim n
     
    '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")
     Msgbox myFolder.Items.count,,"Nombre d'items"
    n=0
    For Each oMail In myFolder.Items
        If Not oMail Is Nothing And oMail.Class = olMail Then
                Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
    n=n+1
        End If
     Next oMail
    Msgbox n,,"Nombre de mail ajoutés"

  5. #5
    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
    Mon but est de lister l'ensemble des mail de la Mailbox (strMailbox) de Outlook.
    Chaque mail est donc ajouter à une zone de liste (Access)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.zl_mailoutlook.AddItem myFolder.Items(i).ReceivedTime & ";" & myFolder.Items(i).Subject
    J'en suis à là. Dans la suite de mon projet, j'envisage de stocker ligne sélectionnée de la zone de liste dans une table (afin de stocker des mails), mais aussi de les déplacer dans des dossier Outlook, et aussi les sauvergarder en .msg sur windows.

    J'obtiens la liste des mails de aujourd'hui à 2016 (soit 407 mails) en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i =myFolder.Items.Count  To 1 Step -1
        If  myFolder.Items(i).class = olMail Then
                Me.zl_mailoutlook.AddItem myFolder.Items(i).ReceivedTime & ";" & myFolder.Items(i).Subject
        End If
     Next i

    Alors que les mails listés vont de 2012 à 16/09/2014 (soit 156mails) en utilisant:
    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
    Function Mailbox(strMailbox As String, ctrListeMail As Control)
    Dim oMail As MailItem
    Dim myOlApp As Outlook.Application
    Dim myNamespace As Outlook.NameSpace
    Dim myFolder As Outlook.MAPIFolder
    Dim n
     
    '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")
     Msgbox myFolder.Items.count,,"Nombre d'items"
    n=0
    For Each oMail In myFolder.Items
        If Not oMail Is Nothing And oMail.Class = olMail Then
                Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
    n=n+1
        End If
     Next oMail
    Msgbox n,,"Nombre de mail ajoutés"
    1) J'obtiens un total de 1080 mails (via la msgbox de ton code; soit le même nombre que myFolder.Items.Count .. j'ai testé)
    2) Le deuxième code (Each oMail) répond une erreur d'incompatibilité après la ligne 156 alors que le premier code n'affiche pas d'erreur d'incompatibilité: donc la vérification de la classe ne fonctionne pas

    J'en perd mon latin !

    zkunk

  6. #6
    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 fait c'est une erreur classique !

    dans ta déclaration de variable tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim oMail As MailItem
    Du coup au premier élément qui n'est pas un Email et que tu veux mettre dans oMail cela plante.

    Tu as 2 façons de faire.

    soit tu mets
    Soit tu veux conserver le type pour avoir l'autocompletion et il faut le faire en 2 fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim oMail As MailItem
    Dim oItem As Object
     
    For Each oItem In myFolder.Items
        If oItem.Class = olMail Then
    set Omail=Oitem
     
                Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
    n=n+1
        End If
    set Omail=nothing
     Next oMail

  7. #7
    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
    Merci Oliv, pour tes réponses !!
    J'ai du mal à comprendre la différente entre les deux méthodes proposées à la fin... notamment la notion d'autocomplétion ...

    Dans tous les cas merci pour ta solution oufffff

    zkunk

  8. #8
    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
    l'autocompletion, c'est quand tu tapes omail. (point) et que tu as une liste déroulante te proposant les propriétés et méthodes.

    Quand tu définis tes variables :
    si tu mets Dim oPomme as Pomme (équivalent de Mailitem) c'est que tu attend des POMMES (taille, variété, couleur en sont les propriétés)

    Et en fait tu veux ranger dans cette variable une Banane et bien cela ne marche pas.

    Par contre si tu dis

    Dim OItem as Object : je déclare un Fruit

    Ensuite tu peux préciser

    If OItem.class = "Pomme" then set oPomme = oitem

  9. #9
    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
    Merci pour ces explications.

    J'ai donc adapté le code:
    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
    Function Mailbox(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
    'on vide la zone de liste
    ctrListeMail.RowSource = ""
    ctrListeMail.RowSourceType = "Value List"
     
     
    '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")
     
    'MsgBox (myFolder.Items(157).Subject & " " & myFolder.Items(157).ReceivedTime)
    Dim oMail As MailItem
    Dim oItem As Object
     
    For Each oItem In myFolder.Items
        If oItem.Class = olMail Then
    Set oMail = oItem
        Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail.Subject
        End If
    Set oMail = Nothing
     Next oItem
     
    End Function
    J'ai juste corrigé le Next à la fin : Next oMail au lieu de Next Item (enfin je crois).

    Donc cette méthode n'apportait que 156mails tout à l'heure, et en apporte 587.
    Ce qui est bcp mieux, mais toujours pas ce que nous attendions...à savoir 1080 mails..
    J'ai testé les valeurs du iTem qui devrait s'afficher (le 588) et il s'agit d'un mail d’apparence normal... avec un expéditeur classic..


    PS: il doit encore y avoir une pomme dans le sac de banane ?! ou vis versa

    Edit: j'ai solutionné le problème en ne lisant pas oMail.subject mais uniquement oMail (pour lire le titre des mails). Grace à cela, j'ai les 500 autres mails qu'il manquait
    Un autre point (cette fois qui concerne Access): il vaut mieux remplir une table temporaire qui sera la source d'une zone de liste, plutot que d'alimenter directement une zone de liste..., et c'est plus rapide !!!
    Encore Merci Oliv !!! =)

    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
    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_Mail", 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
                      'Me.zl_mailoutlook.AddItem oMail.ReceivedTime & ";" & oMail
     
       rst.AddNew
       rst("DateReception") = oMail.ReceivedTime
       rst("TitreMail") = oMail
          rst.Update
        End If
    Set oMail = Nothing
     Next oItem
     
    End Function
    zkunk

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] boucle foreach - mise en erreur du lot si fichier non existant
    Par diidouu dans le forum SSIS
    Réponses: 3
    Dernier message: 23/10/2013, 17h19
  2. Erreur "Incompatibilité de type" non liée au code
    Par Kevin B dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/05/2013, 11h53
  3. Réponses: 2
    Dernier message: 22/04/2011, 15h26
  4. mail non envoyé mais pas d'erreur
    Par leam69 dans le forum Linux
    Réponses: 2
    Dernier message: 25/10/2007, 12h12
  5. Erreur "indice hors limite(0)" non comprise
    Par Bruno1905 dans le forum Bases de données
    Réponses: 9
    Dernier message: 10/06/2005, 12h02

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