News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

Beitrag aus SmartTools Access Weekly

Verbindung zu Outlook per VBA auf- und abbauen

Access 365 2021 2019 2016 2013 2010

FRAGE Ich möchte automatisch Nachrichteninhalte aus Outlook auslesen und in einer Tabelle speichern, scheitere jedoch schon daran, eine Verbindung zu Outlook aufzubauen. Mit "CreateObject()" funktioniert es zwar generell, aber es wird, wenn Outlook bereits läuft, immer eine zweite Outlook-Instanz gestartet. Ich möchte aber das bereits laufende Outlook und den darin ausgewählten Nachrichtenordner verwenden. Wie gehe ich dazu am besten vor?

Diverse Anfragen

ANTWORT Kopieren Sie zunächst die beiden folgenden Funktionen in ein vorhandenes oder neues Modul:

Public Function StartOutlook( _
       ByRef objOutlApp As Outlook.Application, _
       Optional blnNewInstance As Boolean = False) _
       As Boolean

  On Error Resume Next
  StartOutlook = False
  If blnNewInstance Then 'Neue Instanz
    Set objOutlApp = CreateObject("Outlook.Application")
    If Err <> 0 Or objOutlApp Is Nothing Then
      Beep
      MsgBox "StartOutlook: " & _
             "Outlook kann nicht gestartet werden: " & _
             Err.Description, _
             vbOKOnly + vbCritical, _
             "!!! Problem !!!"
      Exit Function
    End If 'Err<> 0...
  Else 'Vorhandene Instanz
    Set objOutlApp = GetObject(, "Outlook.Application")
    If Err <> 0 Or objOutlApp Is Nothing Then
      Err = 0
      Set objOutlApp = CreateObject("Outlook.Application")
      If Err <> 0 Or objOutlApp Is Nothing Then
        Beep
        MsgBox "StartOutlook: " & _
               "Verbindung zu Outlook kann " & _
               "nicht aufgebaut werden: " & _
               Err.Description, _
               vbOKOnly + vbCritical, _
               "!!! Problem !!!"
        Exit Function
      End If 'Err<> 0...
    End If 'Err<> 0...
  End If 'Vorhandene/Neue Instanz?
  StartOutlook = True

End Function

Public Sub CloseOutlook( _
       ByRef objOutlApp As Outlook.Application, _
       Optional blnQuit As Boolean = False)

  On Error Resume Next
  If Not objOutlApp Is Nothing Then
    If blnQuit Then objOutlApp.Quit
    Set objOutlApp = Nothing
  End If

End Sub

Als erster Parameter ist bei "StartOutlook()" eine Objektvariable vom Datentyp "Outlook.Application" anzugeben, die mit einer Referenz auf Outlook initialisiert und die später als Parameter an andere Funktionen und Prozeduren weitergegeben wird. Die Parameterübergabe erfolgt "ByRef", die Variable muss also zunächst am besten global in einem Modul wie folgt deklariert sein:

Public objOutl As Outlook.Application

Der zweite Parameter bei "StartOutlook" ist optional und steuert, ob eine vorhandene Instanz von Outlook genutzt oder eine neue Instanz von Outlook initialisiert werden soll. Standard ist "False", so dass die Funktion "StartOutlook()" zunächst versucht, zu einer laufenden Instanz von Outlook zu verbinden. Ist Outlook nicht gestartet, wird das automatisch nachgeholt. Ist der Parameter hingegen "True", sorgt die Prozedur in jedem Fall eine neue Instanz, so dass das aktuell laufende Outlook nicht beeinflusst wird. Auf den aktuellen Nachrichtenordner greifen Sie dann beispielsweise so zu:

Dim objFolder As MAPIFolder

Set objFolder = objOutl.ActiveExplorer.Folder

Als erster Parameter bei "CloseOutlook" ist die Objektvariable vom Datentyp "Outlook.Application" zu übergeben, die zuvor per "StartOutlook()" initialisiert wurde, der zweite, optionale Parameter steuert, ob Outlook beendet oder geöffnet bleiben soll. Normalerweise reicht es, die für die Verbindung zu Outlook genutzte Objektvariable auf "Nothing" zu setzen, um die darüber referenzierte Instanz zu beenden. Leider reagiert Outlook mitunter etwas eigenwillig und bleibt trotzdem geöffnet, so dass es explizit mit einem "Quit" zum Beenden bewegt werden muss. Geben Sie hier also "True" an, wenn Sie feststellen, dass Ihr Outlook sich nicht korrekt beendet, nachdem "CloseOutlook" aufgerufen wurde.