VBOffice

Ereignisse von mehreren Emails empfangen

Mit dieser Vorlage können Sie auf die Ereignisse von Emails auch dann reagieren, wenn der Anwender mehrere Emails gleichzeitig öffnet.

Zuletzt geändert: 04.04.2007 | Aufrufe: 65.662  | #50
◀ Vorheriges Beispiel Nächstes Beispiel ▶

Inhalt

ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.

Code in DieseOutlookSitzung

Um Ereignisse eines Objektes empfangen zu können, müssen Sie eine Variable des entsprechenden Objekttyps in einem Klassenmodul mit dem Schlüsselwort 'WithEvents' deklarieren. Solange ein Anwender nur eine E-Mail zur Zeit öffnet, wäre das noch relativ leicht: Sie brauchen dann auch nur eine Variable. Sie warten einfach auf das NewInspector-Ereignis; wenn das feuert, wissen Sie, dass ein Element geöffnet wird; handelt es sich dabei um ein MailItem, dann speichern Sie einen Verweis darauf in der genannten Variable und können von da an die Ereignisse des MailItems empfangen. In der Realität wird es aber umfangreicher, weil der Anwender mehr als nur eine E-Mail gleichzeitig öffnen kann. Da die tatsächliche Anzahl unbekannt ist, nützt es auch nichts, nach obigem Muster z.B. drei Variablen zu deklarieren.

Das Problem wird mit einem Klassenmodul gelöst. Der Code wird nur einmal geschrieben, aber Sie können von der Klasse beliebig viele Objekte erzeugen. Da so ein Objekt automatisch zerstört wird, wenn keine Verweise darauf mehr gehalten werden, werden alle benötigten Verweise in einer Collection gespeichert.

Der folgende, sogenannte Inspector-Wrapper zeigt, wie das funktioniert und berücksichtigt auch diverse Situationen, in denen der Inspector geschlossen wird. Inspector ist das Objekt, das die geöffneten Elemente anzeigt. Analog könnten Sie das gleiche für Explorer (Anzeige der Ordner) aufbauen.

Kopieren Sie den folgenden Code ins Modul 'DieseOutlookSitzung':


tip  So fügen Sie Makros in Outlook ein
Private WithEvents m_Inspectors As Outlook.Inspectors
Private m_MyInspectors As VBA.Collection
Private m_lNextKey As Long

Private Sub Application_Startup()
  Set m_Inspectors = Application.Inspectors
  Set m_MyInspectors = New VBA.Collection
End Sub

Private Sub m_Inspectors_NewInspector(ByVal Inspector As Outlook.Inspector)
  On Error Resume Next
  Dim oInspector As cInspector

  Set oInspector = New cInspector
  If oInspector.Init(Inspector, CStr(m_lNextKey)) Then
    m_MyInspectors.Add oInspector, CStr(m_lNextKey)
    m_lNextKey = m_lNextKey + 1
  End If
End Sub

Friend Property Get MyInspectors() As VBA.Collection
  Set MyInspectors = m_MyInspectors
End Property
Reporter Reporter
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert.

Klassenmodul cInspector

Erstellen Sie jetzt ein neues Klassenmodul über Einfügen/Klassenmodul. Drücken Sie dann f4 und tragen Sie als Klassenname 'cInspector' ein. Alle folgenden Funktionen gehören in dieses neue Klassenmodul.

Private WithEvents m_Inspector As Outlook.Inspector
Private WithEvents m_Mail As Outlook.MailItem
Private m_IsClosed As Boolean
Private m_sKey As String

Friend Function Init(oInspector As Outlook.Inspector, _
  sKey As String _
) As Boolean
  Dim obj As Object

  If Not oInspector Is Nothing Then
    Set obj = oInspector.CurrentItem
    If TypeOf obj Is Outlook.MailItem Then
      Set m_Mail = obj
      Set m_Inspector = oInspector
      m_sKey = sKey
      Init = True
    End If
  End If
End Function

Private Sub m_Inspector_Close()
  CloseInspector
End Sub

Private Sub Class_Terminate()
  CloseInspector
End Sub

Friend Sub CloseInspector()
  On Error Resume Next
  If m_IsClosed = False Then
    m_IsClosed = True
    DieseOutlookSitzung.MyInspectors.Remove m_sKey
    Set m_Mail = Nothing
    Set m_Inspector = Nothing
  End If
End Sub
ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.

Das Send-Ereignis

Es gibt drei Möglchkeiten, eine Email zu schließen:

  1. Senden
  2. Schließen
  3. Löschen

Als Entwickler müssen Sie wissen, welche Ereignisse ausgelöst werden und in welcher Reihenfolge. Die letzten beiden sind problemlos, wenn das Element unverändert ist. Aus Word heraus wird zuerst Inspector_Close ausgelöst; dort wird das Aufräumen initialisiert. Aus Outlook heraus wird dagegen erst Item_Close ausgelöst; auch dort kann gleich aufgeräumt werden.

Wenn das Element verändert wurde, dann wird dem Anwender der Speichern-Dialog angezeigt, worüber das Schließen noch abgebrochen werden kann. In dem Fall soll das cInspector-Objekt auch nicht zerstört werden.

  • Beim Schließen wird zuerst Item_Close ausgelöst und dann wird der Speichern-Dialog angezeigt. Da abgebrochen werden kann, soll in Item_Close noch nicht aufgeräumt werden. Das wird über Item.Saved geprüft.
  • Beim Löschen wird zuerst der Dialog angezeigt. Löschen JA löst zuerst BeforeDelete aus und dann Item_Close, während Löschen NEIN kein Ereignis auslöst.

Das Problem ist nun Outlook 2000: Hier gibt es das BeforeDelete-Ereignis noch nicht. In Outlook 2000 kann deswegen nicht erkannt werden, wenn ein geändertes Element direkt gelöscht wird. Das feuert zwar Item_Close, aber dann ist Saved=False, was wiederum dazu benutzt werden muss, eben nicht aufzuräumen.

Private Sub m_Mail_Send(Cancel As Boolean)
  On Error Resume Next
  CloseInspector
End Sub

Das Close-Ereignis

Für die folgende Funktion müssen Sie sich auch die Funktion GetOutlookVersion kopieren.

Private Sub m_Mail_Close(Cancel As Boolean)
  On Error Resume Next
  If GetOutlookVersion < 10 Then
    CloseInspector
  ElseIf m_Mail.Saved Then
    CloseInspector
  End If
End Sub

Das BeforeDelete-Ereignis

Das BeforeDelete-Ereignis gab es vor Outlook XP nicht. Das Ereignis wird erst ausgelöst, nachdem evt. ein Speichern-Dialog angezeigt wurde.

Private Sub m_Mail_BeforeDelete(ByVal Item As Object, Cancel As Boolean)
  CloseInspector
End Sub
OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.
email  Senden Sie eine Nachricht