J'ai écrit une macro qui devrait déplacer ma conversation de courrier électronique à mon dossier "pour faire" chaque fois que je signale le courrier électronique aussi important. Je trouve que la fonction de déplacement se produit, mais je reçois une copie (c'est-à-dire que le thread affiche dans mon dossier "TODO" et reste toujours dans la "Boîte de réception".
Qu'est-ce qui est aussi intéressant est que dans cette ligne de code " Pour chaque mailitem de conversation.getrooTems ", j'aurais attendu car tous les messages sont déplacés que MailItem> 1, mais que le bit de code n'exécute que une fois, puis la boucle se termine. Toute réflexion sur la façon de faire un véritable mouvement par opposition à être ce qui semble être une copie? p>
'''' Public WithEvents GExplorer As Outlook.Explorer Public WithEvents GMailItem As Outlook.MailItem Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Set GExplorer = Outlook.Application.ActiveExplorer 'IGNORE THIS' Dim olNameSpace As Outlook.NameSpace Dim olFolder As Outlook.MAPIFolder Set olNameSpace = Application.GetNamespace("MAPI") Set olFolder = olNameSpace.GetDefaultFolder(olFolderInbox) Set Items = olFolder.Items End Sub Private Sub Items_ItemChange(ByVal Item As Object) 'this item/macro is used to move an email message once it has been flagged Dim olNameSpace As Outlook.NameSpace Dim olFolder As Outlook.MAPIFolder Dim olInbox As Outlook.MAPIFolder Set olNameSpace = Application.GetNamespace("MAPI") Set olFolder = olNameSpace.Folders("DEBUG").Folders("TODO") Stop 'THIS WAS FOR DEBUGGING If TypeOf Item Is Outlook.MailItem And Item.FlagStatus = olFlagMarked Then Set Conversation = Item.GetConversation If Not IsNull(Conversation) Then ' Set ItemsTable = conversation.GetTable 'MsgBox Conversation.GetRootItems.Count For Each MailItem In Conversation.GetRootItems ' Items in the conversation. ONLY RUNS ONCE' If TypeOf MailItem Is Outlook.MailItem Then Item.Move olFolder End If Next End If End If End Sub ''''
3 Réponses :
c'est-à-dire parce que la même action ( déplacer code>) est répétée pour l'élément modifié et transmis sous forme de paramètre sur le gestionnaire
itemChange code>. Au lieu de cela, vous devez exécuter la méthode
déplacer code> par rapport à l'objet d'élément dans la boucle:
For Each MailItem In Conversation.GetRootItems ' Items in the conversation. ONLY RUNS ONCE'
If TypeOf MailItem Is Outlook.MailItem Then
MailItem.Move olFolder
End If
Next
Cela a du sens et merci, cependant, je pense qu'un problème majeur est lorsque j'appelle la conversation.getrootitems le comte = 1 qui signifie pour une raison quelconque le code ne semble pas collecter tous les messages dans une conversation. Ainsi, la boucle "bouge" finit par s'exécuter uniquement une fois, peu importe.
Des pensées sur ce qui pourrait se passer?
En plus de la suggestion d'Eugene (utilisez MailItem code> au lieu de
élément code> lorsque vous appelez
Déplacer code>), vous ne devez jamais utiliser
"pour chaque CODE> "avec Outlook Objects dans des boucles qui modifient la collection que vous êtes itération sur - utilisez une boucle vers le bas
du nombre à 1 étape -1 code>. p>.
Peut-être avez-vous besoin de getchildren de la conversation. P>