0
votes

Outlook Macro pour déplacer des conversations complètes dans un fil

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
''''


0 commentaires

3 Réponses :


0
votes

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


2 commentaires

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?



0
votes

En plus de la suggestion d'Eugene (utilisez MailItem au lieu de élément lorsque vous appelez Déplacer ), vous ne devez jamais utiliser "pour chaque "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 . .


0 commentaires

0
votes

Peut-être avez-vous besoin de getchildren de la conversation.


0 commentaires