Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA Traiter un message qui arrive dans un certain dossier

11 réponses
Avatar
L'AMI Yves
Bonjour à tous;

Je n'arrive pas à déclancher un certain programme VBA quand un message
arrive dans un certain dossier : j'explique ce que j'ai fait :

J'ai fait une règle de messages pour envoyer dans ce dossier les messages
qui ont un certain objet : ça marche.

J'ai fait un programme VBA "application_startup" qui recherche ce dossier
et exécute mon traitement sur tous les messages qui s'y trouvent : ça
marche, mais l'inconvénient est que les messages ne sont traités qu'à
l'ouverture d'Outlook (j'utilise une version "XP" - 2002 sous XP SP3).

J'ai donc adapté mon "application_startup" pour initialiser une variable
"myOlItems" (déclarée en Public WithEvents) sur mondossier.items, et j'ai
mis dans un module de classe une fonction "MyOlItems_ItemAdd" (les
spécialistes reconnaîtront l'aide VBA de Outlook).

Mon problème est que MyOiItems_ItemAdd ne reçoit pas la main.

Merci de m'aider

AMIcalement

10 réponses

1 2
Avatar
Geo
Bonsoir

J'ai donc adapté mon "application_startup" pour initialiser une variable "myOlItems"
(déclarée en Public WithEvents) sur mondossier.items, et j'ai mis dans un module de
classe une fonction "MyOlItems_ItemAdd" (les spécialistes reconnaîtront l'aide VBA de
Outlook).

Mon problème est que MyOiItems_ItemAdd ne reçoit pas la main.



Ca me parait bon, il faudrait s'assurer du contenu de la variable
"myOlItems"

--
A+
Avatar
L'AMI Yves
"Geo" a écrit dans le message de news:

Bonsoir

J'ai donc adapté mon "application_startup" pour initialiser une variable
"myOlItems" (déclarée en Public WithEvents) sur mondossier.items, et
j'ai mis dans un module de classe une fonction "MyOlItems_ItemAdd" (les
spécialistes reconnaîtront l'aide VBA de Outlook).

Mon problème est que MyOiItems_ItemAdd ne reçoit pas la main.



Ca me parait bon, il faudrait s'assurer du contenu de la variable
"myOlItems"


Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation
à myOlItems, puis je relance l'exécution de "application_startup" : alors,
je vois bien que
l'objet que j'affecte à myOlItems est le bon (la collection des messages de
"mondossier".
Le bug doit être ailleurs. Je n'ai pas l'habitude d'utiliser les modules de
classe : y a-t-il des
trucs à déclarer (autres que le "withevents" de la déclaration de
myOlItems) ? Y a-t-il une
façon particulière d'incorporer ce module de classe dans le projet (autre
que de faire
"ajouter un module de classe) ? Pour quelle raison le fait que la règle de
messages transferre
un message de la boîte de réception dans "mondossier" ne déclanche pas
l'événement
"itemadd" ?

En tout cas, merci de m'aider.


--
A+




Avatar
L'AMI Yves
"Geo" a écrit dans le message de news:

Bonsoir

J'ai donc adapté mon "application_startup" pour initialiser une variable
"myOlItems" (déclarée en Public WithEvents) sur mondossier.items, et
j'ai mis dans un module de classe une fonction "MyOlItems_ItemAdd" (les
spécialistes reconnaîtront l'aide VBA de Outlook).

Mon problème est que MyOiItems_ItemAdd ne reçoit pas la main.



Ca me parait bon, il faudrait s'assurer du contenu de la variable
"myOlItems"



Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation à myOlItems, puis je relance l'exécution de
"application_startup" : alors, je vois bien que l'objet que j'affecte à
myOlItems est le bon (la collection des messages de "mondossier".
Le bug doit être ailleurs. Je n'ai pas l'habitude d'utiliser les modules de
classe : y a-t-il des trucs à déclarer (autres que le "withevents" de la
déclaration de myOlItems) ? Y a-t-il une façon particulière d'incorporer
ce module de classe dans le projet (autre que de faire "ajouter un
module de classe") ? Pour quelle raison le fait que la règle de messages
transferre un message de la boîte de réception dans "mondossier" ne
déclanche pas l'événement "itemadd" ?

En tout cas, merci de m'aider.



--
A+




Avatar
Geo
Bonjour

Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation à myOlItems, puis je relance l'exécution de
"application_startup" : alors, je vois bien que l'objet que j'affecte à
myOlItems est le bon (la collection des messages de "mondossier".



D'accord
Une méthode moins perturbante est d'utiliser les debug.print.
elle affiche du texte dans la fenêtre d'exécution et vous voyez donc où
vous êtes passé et les valeurs qui vous intéresse.
Par exemple
Debug.print "Valeur de ma variable au point 1 : " & MaVariable
ou debug.Print "Dossier ", MonDossier.Name


Y a-t-il une façon particulière d'incorporer
ce module de classe dans le projet (autre que de faire "ajouter un
module de classe") ?



Non

Pour quelle raison le fait que la règle de messages
transferre un message de la boîte de réception dans "mondossier" ne
déclanche pas l'événement "itemadd" ?




Je ne sais pas, il y a un moment que je n'ai pas tripoté les
événements, si j'ai le temps je regarde dans la journée.

Hier j'ai regardé pour mettre dans ThisOutlookSession
Private Sub Application_NewMail()
MsgBox "Message arrivé"
End Sub

Cela fonctionne correctement, mais a priori que sur la boite de
réception.

--
A+
Avatar
L'AMI Yves
"Geo" a écrit dans le message de news:

Bonjour

Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation à myOlItems, puis je relance l'exécution de
"application_startup" : alors, je vois bien que l'objet que j'affecte à
myOlItems est le bon (la collection des messages de "mondossier".



D'accord
Une méthode moins perturbante est d'utiliser les debug.print.
elle affiche du texte dans la fenêtre d'exécution et vous voyez donc où
vous êtes passé et les valeurs qui vous intéresse.
Par exemple
Debug.print "Valeur de ma variable au point 1 : " & MaVariable
ou debug.Print "Dossier ", MonDossier.Name


Y a-t-il une façon particulière d'incorporer
ce module de classe dans le projet (autre que de faire "ajouter un
module de classe") ?



Non

Pour quelle raison le fait que la règle de messages
transferre un message de la boîte de réception dans "mondossier" ne
déclanche pas l'événement "itemadd" ?




Je ne sais pas, il y a un moment que je n'ai pas tripoté les événements,
si j'ai le temps je regarde dans la journée.

Hier j'ai regardé pour mettre dans ThisOutlookSession
Private Sub Application_NewMail()
MsgBox "Message arrivé"
End Sub

Cela fonctionne correctement, mais a priori que sur la boite de
réception.



C'est déjà une super bonne piste : je pourrais traiter un nouveau message
sur les
mêmes bases que la règle de message : je vais m'intéresser à ce "NeMail()"

Merci encore.


--
A+




Avatar
L'AMI Yves
"Geo" a écrit dans le message de news:

Bonjour

Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation à myOlItems, puis je relance l'exécution de
"application_startup" : alors, je vois bien que l'objet que j'affecte à
myOlItems est le bon (la collection des messages de "mondossier".



D'accord
Une méthode moins perturbante est d'utiliser les debug.print.
elle affiche du texte dans la fenêtre d'exécution et vous voyez donc où
vous êtes passé et les valeurs qui vous intéresse.
Par exemple
Debug.print "Valeur de ma variable au point 1 : " & MaVariable
ou debug.Print "Dossier ", MonDossier.Name


Y a-t-il une façon particulière d'incorporer
ce module de classe dans le projet (autre que de faire "ajouter un
module de classe") ?



Non

Pour quelle raison le fait que la règle de messages
transferre un message de la boîte de réception dans "mondossier" ne
déclanche pas l'événement "itemadd" ?




[Deuxième réponse...]
En y regardant de plus près, je vois que j'avais la déclaration
Public WithEvents myOiItems...
dans le module This Outlook Session. Or la doc dit que "WithEvents"
doit être déclaré dans un module de classe. Mais si je mets la
déclaration (pourtant "Public" !) dans le module de classe, l'affectation
d'objet à myOlItems dans Application_Startup provoque l'erreur
"Objet non défini". Dead lock ! Où est l'erreur ?

AMIcalement




Je ne sais pas, il y a un moment que je n'ai pas tripoté les événements,
si j'ai le temps je regarde dans la journée.

Hier j'ai regardé pour mettre dans ThisOutlookSession
Private Sub Application_NewMail()
MsgBox "Message arrivé"
End Sub

Cela fonctionne correctement, mais a priori que sur la boite de
réception.

--
A+




Avatar
L'AMI Yves
En fait, il n'y avait pas besoin d'ajouter un module de classe : la
déclaration
"WithEvent" se fait dans le module par défaut, et la procédure de
traitement
aussi : ça marche. C'est la doc qui complique les choses...!

Encore merci.

AMIcalement

"Geo" a écrit dans le message de news:

Bonjour

Je ne sais pas si ma méthode de test est bonne : je mets un arrêt sur
l'instruction d'affectation à myOlItems, puis je relance l'exécution de
"application_startup" : alors, je vois bien que l'objet que j'affecte à
myOlItems est le bon (la collection des messages de "mondossier".



D'accord
Une méthode moins perturbante est d'utiliser les debug.print.
elle affiche du texte dans la fenêtre d'exécution et vous voyez donc où
vous êtes passé et les valeurs qui vous intéresse.
Par exemple
Debug.print "Valeur de ma variable au point 1 : " & MaVariable
ou debug.Print "Dossier ", MonDossier.Name


Y a-t-il une façon particulière d'incorporer
ce module de classe dans le projet (autre que de faire "ajouter un
module de classe") ?



Non

Pour quelle raison le fait que la règle de messages
transferre un message de la boîte de réception dans "mondossier" ne
déclanche pas l'événement "itemadd" ?




Je ne sais pas, il y a un moment que je n'ai pas tripoté les événements,
si j'ai le temps je regarde dans la journée.

Hier j'ai regardé pour mettre dans ThisOutlookSession
Private Sub Application_NewMail()
MsgBox "Message arrivé"
End Sub

Cela fonctionne correctement, mais a priori que sur la boite de
réception.

--
A+




Avatar
Geo
Bonjour

En fait, il n'y avait pas besoin d'ajouter un module de classe : la déclaration
"WithEvent" se fait dans le module par défaut, et la procédure de traitement
aussi : ça marche. C'est la doc qui complique les choses...!



Super.
Tant qu'à faire, vous pouvez faire une petite synthèse de la solution ?
Ça évitera de rechercher quand le cas va se présenter une autre fois.

--
A+
Avatar
L'AMI Yves
"Geo" a écrit dans le message de news:

Bonjour

En fait, il n'y avait pas besoin d'ajouter un module de classe : la
déclaration
"WithEvent" se fait dans le module par défaut, et la procédure de
traitement
aussi : ça marche. C'est la doc qui complique les choses...!



Super.
Tant qu'à faire, vous pouvez faire une petite synthèse de la solution ?
Ça évitera de rechercher quand le cas va se présenter une autre fois.

--
A+


Pour répondre, je vais joindre quelques bouts de code. Pas tout, pour des
questions de
confidentialité qui n'appartiennent pas qu'à moi.
Le but du programme est de synthétiser dans un classeur Excel les logs de
quelques
routeurs ZyXel que je surveille, et qui sont paramétrés pour me les envoyer
par mail
de temps à autres. Le programme "traitebody" décortique le corps du
message, et
répartit les informations dans des cellules de feuille Excel. Maintenant,
ce traitement
est déclanché chaque fois qu'un mail est ajouté au dossier "Zy" : tout ceci
se trouve dans
"Microsoft Outlook Objects/This Outlook Session"

Option Explicit
Public WithEvents myOlItems As Outlook.Items
Dim Log As Excel.Workbook, Tableur As Excel.Application, Feuille As
Excel.Worksheet
Dim Zy As MAPIFolder, myNameSpace As NameSpace, m As Items

Private Sub Application_Startup()
Dim gf As MAPIFolder
Set myNameSpace = GetNamespace("MAPI")
Set gf = myNameSpace.GetDefaultFolder(olFolderInbox)
descend gf ' Ce programme parcourt les sous-dossiers de la boîte de
réception à la recherche de "Zy"
If Zy Is Nothing Then
MsgBox "Pas de dossier 'Log Zywall' trouvé"
Exit Sub
End If
Set myOlItems = Zy.Items
End Sub

Private Sub myOlItems_ItemAdd(ByVal m As Object)
Dim sh As String
If Left(m.Subject, 7) = "Logs Zy" Or Left(m.Subject, 7) = "Logs ZY" Then
Set Tableur = CreateObject("Excel.Application")
Tableur.Visible = False
'Tableur.Visible = True
Set Log = Tableur.Workbooks.Open("e:YvesLogZy.xls")
Log.Activate
Select Case Mid(m.Subject, 9) ' sélection de la feuille en fonction de
l'objet du message
Case "a"
sh = "a"
Case "b", "B"
sh = "b"
etc..."
Case Else
MsgBox "Impossible de traiter le message " & m.Subject
Exit Sub
End Select
Set Feuille = Log.Worksheets(sh)
Feuille.Activate
If traitebody(m) = 0 Then m.Delete ' le programme "traitebody" serait
hors sujet ici.
'Le corps du message y est traité comme une simple chaîne de caractères
Log.Close True
Tableur.Quit
End If
End Sub




Est-ce que c'est comprhensible, M. Géo (Trouvetout ?)

AMIcalement



Avatar
Geo
Bonjour Yves

C'est très bien, le gros intérêt de votre exemple, c'est qu'il donne
l'ossature du traitement.
Merci beaucoup.

Là où je suis épaté, c'est que vous vous soyez évité le module de
classe.
Va falloir que je révise. :-)


Bonne journée.

--
A+
1 2