2013-03-18 3 views
8

Ich möchte das aktive geöffnete MailItem erhalten (ob es eine neue Mail oder eine empfangene Mail ist). Ich muss etwas Inhalt zu dieser Mail hinzufügen, wenn der Benutzer mein Makro ausführt. Ich verwende Outlook 2003 und VBA.Arbeiten mit der aktuellen offenen E-Mail

Ich fand dies: How do you get a reference to the mail item in the current open window in Outlook using VBA? Es funktioniert jedoch nicht, weil TypeName(Application.ActiveWindow) auf nichts eingestellt ist. Ich habe auch versucht Set Mail = Application.ActiveInspector.currentItem, aber es funktioniert auch nicht.

Es muss etwas, was ich über die ActiveInspector Sache nicht verstehe.

Wie gewünscht, dann ist dies das Verfahren/Makro in einem eigenen Modul befindet, aufgerufen, wenn der Anwender auf einer Menü-Taste in der Application_Startup() Methode hinzugefügt:

Sub myMacro() 
    Dim NewMail As Outlook.MailItem 
    Set NewMail = Application.ActiveInspector.currentItem 
End Sub 
+0

Wenn nichts ausgewählt ist, wird "ActiveInspector" tatsächlich "Nichts" sein. Ich weiß nicht, wie "ActiveWindow" "Nichts" sein könnte. Wo setzt du diesen Code ein und wie rufst du ihn an? –

+0

Der Code befindet sich in einem Modul. Die Prozedur wird aufgerufen, wenn der Benutzer das Makro manuell ausführt oder auf eine Menüschaltfläche klickt, durch die das Makro ausgeführt wird. – dnLL

+0

Können Sie den Code für die gesamte Methode veröffentlichen? –

Antwort

13

weiß ich nicht genau, Was stimmt nicht mit deinem Code? Zum einen bestätigen Sie jedoch nicht, dass eine neue, bearbeitbare E-Mail geöffnet ist. Der folgende Proof-of-Concept macht genau das, was Sie meiner Meinung nach tun wollen: Fügen Sie einen Text in die aktive E-Mail ein, die gerade erstellt wird. Wenn dies nicht möglich ist, wird ein Meldungsfenster angezeigt, in dem erläutert wird, warum.

Der Teil, der Text einfügt, funktioniert nur, wenn Word als E-Mail-Editor verwendet wird (das wird ALWAYS be the case in Outlook 2010+). Wenn dies nicht der Fall ist, müssen Sie den Body- oder HTMLBody-Text direkt analysieren und aktualisieren.

Sub InsertText() 
    Dim myText As String 
    myText = "Hello world" 

    Dim NewMail As MailItem, oInspector As Inspector 
    Set oInspector = Application.ActiveInspector 
    If oInspector Is Nothing Then 
     MsgBox "No active inspector" 
    Else 
     Set NewMail = oInspector.CurrentItem 
     If NewMail.Sent Then 
      MsgBox "This is not an editable email" 
     Else 
      If oInspector.IsWordMail Then 
       ' Hurray. We can use the rich Word object model, with access 
       ' the caret and everything. 
       Dim oDoc As Object, oWrdApp As Object, oSelection As Object 
       Set oDoc = oInspector.WordEditor 
       Set oWrdApp = oDoc.Application 
       Set oSelection = oWrdApp.Selection 
       oSelection.InsertAfter myText 
       oSelection.Collapse 0 
       Set oSelection = Nothing 
       Set oWrdApp = Nothing 
       Set oDoc = Nothing 
      Else 
       ' No object model to work with. Must manipulate raw text. 
       Select Case NewMail.BodyFormat 
        Case olFormatPlain, olFormatRichText, olFormatUnspecified 
         NewMail.Body = NewMail.Body & myText 
        Case olFormatHTML 
         NewMail.HTMLBody = NewMail.HTMLBody & "<p>" & myText & "</p>" 
       End Select 
      End If 
     End If 
    End If 
End Sub 
+0

Es funktioniert. Wäre es eine gute Übung, den oInspector auch am Ende der Prozedur zurückzusetzen (so etwas wie 'Set oInspector = Nothing')? – dnLL

3

Meinst du die derzeit ausgewählte Nachricht? In diesem Fall müssen Sie die Application.ActiveExplorer.Selection-Auflistung und nicht Application.ActiveInspector.CurrentItem verwenden.

0
  ' 
      Dim myOlExp As Outlook.Explorer 
      Dim myOlSel As Outlook.Selection 

      Set myOlExp = Application.ActiveExplorer 
      Set myOlSel = myOlExp.Selection 
      'MsgBox myOlSel.item(1) 


      Dim selectedFolder As Outlook.MAPIFolder 
       Set selectedFolder = myOlExp.CurrentFolder 
      Dim itemMessage As String 
       itemMessage = "Item is unknown." 


      Dim expMessage As String 
      expMessage = "Your current folder is " & selectedFolder.Name & "." & vbCrLf 

      If myOlSel.Count > 0 Then 

          Dim selObject As Object 
          Set selObject = myOlSel.item(1) 

          If (TypeOf selObject Is Outlook.mailItem) Then 
           Dim mailItem As Outlook.mailItem 
           Set mailItem = selObject 
           itemMessage = "The item is an e-mail message." & " The subject is " & mailItem.Subject & "." 
           mailItem.Display (False) 

          ElseIf (TypeOf selObject Is Outlook.contactItem) Then 
           Dim contactItem As Outlook.contactItem 
           Set contactItem = selObject 
           itemMessage = "The item is a contact." & " The full name is " & contactItem.Subject & "." 
           contactItem.Display (False) 

          ElseIf (TypeOf selObject Is Outlook.AppointmentItem) Then 
           Dim apptItem As Outlook.AppointmentItem 
           Set apptItem = selObject 
           itemMessage = "The item is an appointment." & apptItem.Subject & "." 

          ElseIf (TypeOf selObject Is Outlook.taskItem) Then 
           Dim taskItem As Outlook.taskItem 
           Set taskItem = selObject 
           itemMessage = "The item is a task." & " The body is " & taskItem.Body & "." 
          ElseIf (TypeOf selObject Is Outlook.meetingItem) Then 
           Dim meetingItem As Outlook.meetingItem 
           Set meetingItem = selObject 
           itemMessage = "The item is a meeting item. " & "The subject is " & meetingItem.Subject & "." 
          End If 
         End If 
         expMessage = expMessage & itemMessage 
        MsgBox (expMessage) 
      End Sub 
+3

Sie sollten etwas Text hinzufügen, um Ihre Antwort zu erklären, anstatt nur ein Block Code zu sein. – Minzkraut

+0

@Minzkraut vor allem für eine 4 Jahre alte Frage – dnLL

+0

@ dnLL Ich war mir der tatsächlichen Frage nicht bewusst, weil ich aus dem Review-Bildschirm kommentiert. – Minzkraut