none
Evénements qui ne fonctionnent pas en permanence RRS feed

  • Question

  • Bonjour à tous,

    J'ai un petit programme VBA dans Outlook Qui me permet de faire du tri de messages envoyés.

    Donc le programme fonctionne avec 2 événements:

    - mesdossiersdansinbox_BeforeItemMove

    - Monmailquivadansmaboiteenvoi_ItemAdd

    Sauf que par moment sans manifestation particulière, les événements ne réagissent quand ceci se produisent... il faut que je redémarre Outlook et ça remarche.

    D'où peut venir le problème?

    Pour info voici le dit code qui est dans ThisOutlookSession:

    'création d'une variable evenement "objMailFolder"
    Dim WithEvents objMailFolder As Outlook.Folder
    Dim WithEvents objMailSent As Outlook.Items
    
    Private Sub Application_Startup()
        'initialisation de "objMailFolder"
        Set objMailFolder = Application.Session.GetDefaultFolder(olFolderInbox)
        Set objMailSent = Application.Session.GetDefaultFolder(olFolderSentMail).Items
    End Sub
    
    
    'Dès q'un mail est déplacé il est enregistré sur le serveur
    Private Sub objMailFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean)
        
        If Item.Categories = "à archiver" And TypeName(Item) = "MailItem" Then
            Enregistrement_Sur_Serveur MoveTo, Item
            Fake_box 2
        End If
        
    End Sub
    
    Private Sub objMailSent_ItemAdd(ByVal Item As Object)
        
        Dim Affaire As String
        Dim Mail As Outlook.MailItem
        Dim objNSpace As NameSpace
        Dim FldDestination As Outlook.Folder
        
        
        If TypeName(Item) = "MailItem" Then
            UserForm1.Show
            
            Set Mail = Item
            Affaire = UserForm1.ComboBox1.Value
            Set objNSpace = Application.GetNamespace("MAPI")
            Set FldDestination = objNSpace.GetDefaultFolder(olFolderInbox)
            Set FldDestination = FldDestination.Folders(Affaire)
            
            If UserForm1.CheckBox1.Value = True Then
                Enregistrer_Dans_Outlook FldDestination, Mail
            End If
            
            If UserForm1.CheckBox2.Value = True Then
                Enregistrement_Sur_Serveur FldDestination, Mail
                Fake_box 2
            End If
            
            Set objNSpace = Nothing
            Set FldDestination = Nothing
            
        End If
        
    End Sub

    Merci pour vos réponses



    jeudi 15 octobre 2015 13:33

Toutes les réponses

  • Bonjour,

    Si tu travailles sur tes macros et que tu fais un stop, cela réinitialise tes variables.

    Est ce que ton problème se produit en dehors de ce cas de figure ?


    Have a nice day. Oliv-

    vendredi 16 octobre 2015 12:36
  • Bonjour Olivier,

    Merci de ta réponse.

    Oui car je ne travaille plus sur cette macro, c'est uniquement à l'utilisation, mon userform ne se lance pas quand un mail est envoyé (ou plutôt quand mon mail arrive dans le dossier message envoyé).

    Mon autre fonction qui me permet de détecter un mail qui est glissé dans un dossier MAPI, ne fonctionne plus également.

    Je précise que cela fonctionne en temps normal, mais parfois plus rien.


    vendredi 16 octobre 2015 12:52
  • Alors j'ai fais des tests.

    En effet si je créé une erreur volontairement, le programme ne fonctionne plus après.

    Est il possible qu'un stop s’exécute sans avoir un message d'erreur?

    Donc la piste de réinitialisation des variables est peut être la source de mon problème..

    En effet si objMailFolder et objMailSent se réinitialise, l’événement ne se déclenche plus.

    Comment je peux résoudre ce problème?


    vendredi 16 octobre 2015 16:59
  • Bonjour Sylvain,

    Avez vous essayez en ajoutant une gestion des erreurs ?

    Pourquoi pas on error resume ou on error resume next


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    dimanche 18 octobre 2015 16:05
  • Bonjour Medhi,

    Je viens de rajouter une gestion des erreurs dans tous mes sous programmes.

    Je vous tiens au courant.

    lundi 19 octobre 2015 09:21
  • J'ai donc peut être un élément de réponse, car j'ai deux erreurs identifiées qui surviennent tous le temps:

    Erreur 0 sans description d'erreur puis successivement Erreur 20 "reprise du programme sans erreur"

    Pour l'erreur 0, il peut s'agir d'une déclaration (Public Const ERROR_NONE = 0) pour l'utilisation d'une API windows.

    L'erreur 20 à l'air de découler de cette première erreur.

    Je dois enlever Public Const ERROR_NONE = 0 ?

    PS: pour mieux comprendre d'ou vient ce ERROR_NONE voici son origine https://support.microsoft.com/en-us/kb/145679


    lundi 19 octobre 2015 10:35
  • Avez vous utilisé dans votre code les fonctions décrites dans l'article ? Si non, alors pourquoi avoir mis la ligne de code qui pose problème.

    • Commencez par mettre la ligne en commentaire puis faire un test.

    Je vous invite à lire cet article sur la gestion des erreurs. https://support.microsoft.com/fr-fr/kb/141571

    ou encore celui-ci : http://gilmir.developpez.com/tutoriels-vb6/tutoriel16/


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    lundi 19 octobre 2015 11:28
  • En effet j'utilise les fonctions "SetValueEx" et "QueryValueEx" décrites dans l'article

    Dans mon programme principal, je fais appelle à une fonction qui fait elle même appel à la fonction "QueryValueEx". J'ai mis une gestion d'erreur dans ce programme principal et je viens de me rappeler que dans "QueryValueEx" j'ai ce ERROR_NONE.

    Donc je me demande si mon problème vient de ERROR_NONE puisque j'ai un code erreur 0 (Err.Number).

    Je ne sais pas si c'est clair, car je suis autodidacte et peut-être que je n'emploie pas la bonne terminologie...

    lundi 19 octobre 2015 12:03
  • Bonjour,

    Err = 0 cela veut dire qu'il n'y a pas d'erreur !

    L'essentiel dans ta gestion d'erreur, c'est de ne pas sortir brutalement de la macro, c'est à dire avec la boite de dialogue Microsoft Visual Basic où tu fais [fin].

    C'est dans ce cas où tes variables sont réinitialisées.

    Concernant ton code, tu peux peut être remplacer les événements que tu utilises par 

    Application.NewMailEx, événement à la place de objMailFolder...

    et 

    Application.ItemSend, événement à la place de objMailSent_ItemAdd

    Sinon si tu ne trouves pas d'où vient ta réinitialisation, essaye d'utiliser les événements de "application" pour recharger tes variables

    Private Sub Application_ItemLoad(ByVal item As Object)
    on error resume next
        If objMailFolder Is Nothing Then
            Set objMailFolder = Application.Session.GetDefaultFolder(olFolderInbox)
        End If
        If objMailSent Is Nothing Then
            Set objMailSent = Application.Session.GetDefaultFolder(olFolderSentMail).items
        End If
    End Sub


    Have a nice day. Oliv-

    lundi 19 octobre 2015 12:21
  • En fait je n'ai pas de boite de dialogue message d'erreur quand mes variables se réinitialisent.

    Par contre avec une gestion des erreurs du type:

    Debug.Print "Le " & Date & " à " & Time & " - Prog: objMailSent_ItemAdd - Erreur: " & Err.Number & " " & Err.Description & "."

    la console me renvois:

    Le 19/10/2015 à 19:21:16 - Prog: Enregistrement_Sur_Serveur - Erreur: 0 .
    Le 19/10/2015 à 19:21:16 - Prog: Enregistrement_Sur_Serveur - Erreur: 20 Reprise sans erreur.

    Je pense que cela viens du code cité plus haut "QueryValueEx"

    J'ai besoin de deux actions:

    - enregistrer un mail à plusieurs emplacements une fois qu'il est envoyé (pour avoir la date d'envoi)

    -  enregistrer un mail à plusieurs emplacements quant on le glisse dans un dossier (MAPIfolder)

    Le problème de Application_ItemSend, c'est qu'il se lance  avant l'envoi et c'est donc le brouillon de mon mail que je peux enregistrer et non le mail envoyé.

    Je vais essayer de regarder avec "Private Sub Application_ItemLoad(ByVal item As Object)" Mais quand je glisse un mail dans un dossier et que mes variables sont initialisées je ne suis pas sur que cet événement se déclenche.

    Encore Merci pour votre aide, j'arrive à mes limites de bidouilleur!



    lundi 19 octobre 2015 17:46
  • Bonsoir, l'idée avec itemload, et de recharger régulièrement tes Objets et leurs événements. à chaque fois que tu ouvres un Email par exemple, essaye cela...sinon sur l'erreur 20

    Resume sans erreur (Erreur 20) Une instruction Resume peut uniquement s’afficher
     dans un gestionnaire d’erreurs et peut uniquement être exécutée dans un gestionnaire d’erreurs actif. Voici les causes et les solutions à cette erreur : Vous avez placé une instruction Resume en dehors du code de gestion d’erreurs. Placez l’instruction dans
     le gestionnaire d’erreurs ou supprimez-la. Votre code a été envoyé dans un gestionnaire d’erreurs alors qu’il n’y avait aucune erreur. Une étiquette de ligne est peut-être mal écrite. Les déviations vers les étiquettes ne peuvent pas être effectuées entre
     procédures. Vous devez rechercher l’étiquette identifiant le gestionnaire d’erreurs dans la procédure. Si vous trouvez une étiquette en double spécifiée comme cible d’une instruction GoTo qui n’est pas une instruction On Error GoTo, modifiez l’étiquette de
     ligne pour qu’elle corresponde à sa cible.


    Have a nice day. Oliv-


    • Modifié Oliv- lundi 19 octobre 2015 20:19
    lundi 19 octobre 2015 20:18
  • Bon ok pour ce problème de erreur 0 et erreur 20, je n'avais pas mis le Exit Sub avant le ErrorHandler... la boulette.

    Sinon j'ai rajouté de partout dans mes Sub et function une gestion des erreurs pour voir une éventuelle erreur passer. Je vais essayer de voir sir mon code se met en stop.

    Par contre je confirme que jusqu'à présent dès que j'ai un stop, je m'en aperçois uniquement car mon programme ne fonctionne plus, je n'ai jamais de boite de dialogue qui s'affiche pour m'alerter sur une erreur.

    J'ai ajouté des debug.print partout pour essayer de comprendre mon problème je vous tiens au courant.

    mardi 20 octobre 2015 13:54
  • Bonjour Olivier

    Alors j'ai mis un peu d'ordre dans mon code, et voilà où j'en suis:

    J'ai créé un Application_ItemLoad, où j'ai un code du genre :

    Private Sub Application_ItemLoad(ByVal item As Object) On Error GoTo ErrorHandler

    If objMailSent Is Nothing Then Set objMailSent = Application.Session.GetDefaultFolder(olFolderSentMail).Items End If If objMailFolder Is Nothing Then Set objMailFolder = Application.Session.GetDefaultFolder(olFolderInbox) End If Load UserForm1

    Exit Sub ErrorHandler: MsgBox "Erreur" & Err.Number & " - " & Err.Description Resume next End Sub

    Ça marche plutôt bien, mais je n'ai toujours pas trouvé la cause de ce stop...
    mercredi 21 octobre 2015 17:31