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.