Conversation

Moderator: ModerationP

Conversation

Beitragvon Fennek » 27. Jun 2022, 15:41

Hallo,

der Titel hat eine doppelte Bedeutung:

1. Keine Frage, aber Interesse, ob jemand "MailItem.GetConversation" nutzt und welche Erfahrungen damit gemacht wurden

2. MS zeigt einen C++ - Code für das Enumerieren einer Conversation. Dies konnte ich nicht in VBA umschreiben. Gibt es da eine Trick das ohne spezielle Assemplies zu nutzten?

Mein Versuch:

Code: Alles auswählen
Sub allConversation_Table()
'https://docs.microsoft.com/en-us/office/vba/outlook/Concepts/Categories-and-Conversations/obtain-and-enumerate-selected-conversations

Dim Sel As Selection, FLD As Folder, EML As MailItem, View As TableView, Tbl As Table, sItms As Items
Dim Conv As Conversation, CHds As Selection, CvHd As ConversationHeader

Set FLD = ActiveExplorer.CurrentFolder

Set View = FLD.CurrentView

If View.ViewType = OlViewType.olTableView Then
If View.ShowConversationByDate Then

    Set Sel = ActiveExplorer.Selection
    Set CHds = Sel.GetSelection(OlSelectionContents.olConversationHeaders)
    Debug.Print Sel.Count, CHds.Count

End If
End If
End Sub


CHds ist immer leer.

Danke

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 876
Registriert: 12. Feb 2016, 18:56

Re: Conversation

Beitragvon mmarkus » 28. Jun 2022, 07:58

Fennek hat geschrieben:Gibt es da eine Trick das ohne spezielle Assemblies zu nutzten?


Hä?
Da wird doch ausschließlich das Outlook Objektmodell genutzt - oder hast du irgend was anderes gesehen?
Beim kurzen überfliegen wäre mir nichts aufgefallen.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2345
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Conversation

Beitragvon Fennek » 28. Jun 2022, 09:30

M$ schreibt in dem genannten Link:

The following managed code is written in C#. To run a .NET Framework managed code sample that needs to call into a Component Object Model (COM), you must use an interop assembly that defines and maps managed interfaces to the COM objects in the object model type library. For Outlook, you can use Visual Studio and the Outlook Primary Interop Assembly (PIA). Before you run managed code samples for Outlook 2013, ensure that you have installed the Outlook 2013 PIA and have added a reference to the Microsoft Outlook 15.0 Object Library component in Visual Studio.


Trotz vieler Versuche ergab

Code: Alles auswählen
Sel.GetSelection(OlSelectionContents.olConversationHeaders)


nichts, also "0". Damit konnte ich mit diesem Ansatz nicht auf die Elemente der "Conversation" zugreifen.

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 876
Registriert: 12. Feb 2016, 18:56

Re: Conversation

Beitragvon mmarkus » 28. Jun 2022, 10:32

Fennek hat geschrieben:M$ schreibt in dem genannten Link:

you must use an interop assembly that defines and maps managed interfaces to the COM objects in the object model type library.


Na ja, ist wohl selbsterklärend. Für den Zugriff auf Outlook müssen die Daten entsprechend gemappt werden.

Fennek hat geschrieben:Trotz vieler Versuche ergab

Code: Alles auswählen
Sel.GetSelection(OlSelectionContents.olConversationHeaders)


nichts, also "0". Damit konnte ich mit diesem Ansatz nicht auf die Elemente der "Conversation" zugreifen.


Das wird doch einen Grund haben. Hab das persönlich auch noch nie verwendet. Die Hilfe zeigt aber, welche Voraussetzungen die Objekte erfüllen müssen,
damit sie durch GetSelection gefiltert werden.
Vermutlich werden diese Voraussetzungen nicht erfüllt.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2345
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Conversation

Beitragvon Fennek » 28. Jun 2022, 11:14

Der Code prüft diese Voraussetzungen:

Code: Alles auswählen
If View.ViewType = OlViewType.olTableView Then
If View.ShowConversationByDate Then


Beide waren erfüllt. Der Befehl "Set CHds = Sel.GetSelection(OlSelectionContents.olConversationHeaders)" wird ausgeführt, ergibt aber kein nutzbares Ergebnis.

Ziel des Ganzen ist es von Hand einer Mail einer Conversation eine Auftragsnummer zuzuweisen und diese dann automatisch auf alle anderen Mails der Conversation zu übertragen. Die Hoffnung war mit CHds eine Selection aller Mails einer Conversation zu erhalten, die dann enumeriert werden kann.

Mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 876
Registriert: 12. Feb 2016, 18:56

Re: Conversation

Beitragvon DerHoepp » 30. Jun 2022, 10:41

Moin,

ich hätte einfach mal die .GetConversation()-Methode für ein MailItem-Objekt ausprobiert, für das du dir sicher bist, dass es Teil einer Conversation ist.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10441
Registriert: 14. Mai 2013, 11:08

Re: Conversation

Beitragvon Fennek » 30. Jun 2022, 12:15

@derHoepp

Danke

Dieser Code funktioniert zwar:

Code: Alles auswählen
Sub ConversationColumns_Add()
Dim EML As MailItem, Conv As Conversation, Tbl As Table, Rw As Row
Dim Ar, a

Set EML = ActiveExplorer.Selection(1)
Set Conv = EML.GetConversation
    Set Tbl = Conv.GetTable
    Debug.Print EML.SentOn, EML.ConversationID, Tbl.GetRowCount
    Tbl.Columns.Add ("SenderEmailAddress")    ' muss jeweils ausprobiert werden, z.B. "Sender" geht nicht
   
    Ar = Tbl.GetArray(5)
        Debug.Print UBound(Ar, 2)
        For a = 0 To UBound(Ar)
            Debug.Print Ar(a, 0), Ar(a, 1), Ar(a, 2), Ar(a, 3), Ar(a, 4), Ar(a, 5)
        Next a
End Sub


Aber das eigentliche Ziel, jedes Element der Conversation als manipulierbares Object zu erhalten, wird verfehlt.

Ich möchte das Thema beenden, es gibt eine Lösung mit einem rekursiven Aufruf.

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 876
Registriert: 12. Feb 2016, 18:56

Re: Conversation

Beitragvon DerHoepp » 30. Jun 2022, 12:30

Moin,

ich möchte es noch nicht beenden :) GetChildren sollte eine Collection liefern, die die Folgeelemente beinhaltet.

Viele Grüße derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 10441
Registriert: 14. Mai 2013, 11:08

Re: Conversation

Beitragvon Fennek » 30. Jun 2022, 12:40

Hallo,

da ich nicht für jede Prüfung /Änderung aller Items einer Converstion einen eigenen Code schreiben möchte, kam ich auf die Idee mit einer Collection.

Der Code erstellt eine Collection mit allen Items einer Conversation. Dort können dann alle Manipulation an jedem MailItem vorgenommen werden, z.B. das Subject ändern oder "Mileage" ausfüllen.

Code: Alles auswählen
'jetzt: Eine Mail -> alle Mails der Conversation in Collection

Sub Find_Duplicates()   'in verschiedenen Foldern
Dim FLD As Folder, EML As MailItem, Conv As Conversation, It As MailItem, Itm As Object, SItms As Object
Dim Idx As String, i As Integer, ii As Integer
Dim Col As New Collection

Set FLD = ActiveExplorer.CurrentFolder
  Set EML = ActiveExplorer.Selection(1)
        Idx = EML.ConversationIndex
        Set Conv = EML.GetConversation
        Set Itm = Conv.GetRootItems
        For Each It In Itm
            If Idx = It.ConversationIndex And It.Parent <> FLD.Name Then
                Debug.Print It.Parent, It.SentOn, It.Subject
            End If
            Debug.Print It.ConversationID, It.Parent, It.SentOn, It.Subject
            Col.Add It
            ProcessChildren It, Conv, Col
        Next It

Debug.Print Col.Count

For i = 1 To Col.Count
    Debug.Print Col.Item(i).Subject, Col.Item(i).ConversationID
Next i
End Sub

Sub ProcessChildren(It As MailItem, Conv As Conversation, Col)
Dim SItms As SimpleItems, MItm As MailItem

Set SItms = Conv.GetChildren(It)

If SItms.Count > 0 Then
    For Each MItm In SItms
        Col.Add MItm
        Debug.Print MItm.ConversationID, MItm.Parent, MItm.SentOn, MItm.Subject
        ProcessChildren MItm, Conv, Col
    Next MItm
End If
End Sub


(kleine Änderungen, so nicht getestet)

mfg
Benutzeravatar
Fennek
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 876
Registriert: 12. Feb 2016, 18:56


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast