Viele Access-Benutzer dürften, wenn Sie schon das Office-Paket auf dem Rechner haben, auch Outlook nutzen – zumindest, um E-Mails zum empfangen, zu senden und zu bearbeiten. Vielen fehlt dabei die Möglichkeit einer stärkeren Interaktion zwischen Access und Outlook, beispielsweise bei Verwendung einer Kundenverwaltung. Eine pfiffige Möglichkeit wäre es, beim Anzeigen einer E-Mail von einem bestimmten Kunden direkt den Kundendatensatz in der Kundenverwaltung zu öffnen. Dies sollte dann auch noch auf möglichst einfache Art und Weise geschehen, beispielsweise per Tastenkombination. Wie das gelingt, zeigt der vorliegende Beitrag.
In einem anderen Beitrag mit dem Titel Outlook-Mails per Tastenkombination verschieben (www.access-im-unternehmen.de/1290) haben wir bereits gezeigt, wie Sie Aktionen für die aktuell markierte E-Mail per Tastenkombination ausführen können.
Im vorliegenden Beitrag wollen wir die Verbindung zwischen der dort beschriebenen reinen Outlook-Technik und Access herstellen. Dazu wollen wir, wenn der Benutzer eine bestimmte Tastenkombination für die aktuell angezeigte E-Mail betätigt, die folgenden Schritte ausführen:
- Die E-Mail-Adresse des Absenders dieser E-Mail ermitteln,
- prüfen, ob die Kundendatenbank bereits geöffnet ist und diese gegebenenfalls öffnen, wobei dann die E-Mail-Adresse übergeben werden soll und
- den Kunden mit der betreffenden E-Mail-Adresse im Kunden-Formular anzeigen.
Ob die Kunden-Datenbank bereits geöffnet ist oder nicht bringt noch eine wichtige Unterscheidung mit sich: Wenn sie noch nicht geöffnet ist, haben wir es etwas einfacher. Wir brauchen die Datenbank dann nämlich einfach nur zu öffnen, was relativ einfach ist, und dabei die entsprechende E-Mail-Adresse zu übergeben. Wenn die Access-Anwendung bereits geöffnet ist, wird es etwas komplizierter, denn dann müssen wir per VBA zunächst die Access-Anwendung referenzieren und diese dann so fernsteuern, dass sie den gewünschten Kunden anzeigt.
Wir wollen jedoch mit dem Aufruf beginnen.
E-Mail auswählen und den Prozess starten
Die Grundlagen zu diesem Schritt haben wir ausführlich in dem eingangs erwähnten Beitrag beschrieben. Dabei haben wir eine VBA-Prozedur erstellt, welche die aktuelle E-Mail ermittelt und dann etwas damit erledigt.
Einige der dort verwendeten Techniken übernehmen wir für die nachfolgend vorgestellte Prozedur namens ShowCustomerInAccess, die Sie in Listing 1 finden (die nachfolgend beschriebenen Routinen geben Sie in einem neuen Standardmodul des VBA-Projekts von Outlook ein, das Sie von Outlook aus mit der Tastenkombination Alt + F11 öffnen). Diese Prozedur schreibt den Pfad zur Kundenverwaltungs-Datenbank in die Variable strDatabase und referenziert den aktuell im Outlook-Explorer-Bereich angezeigten Ordner mit der Variablen objCurrentFolder.
Public Sub ShowCustomerInAccess() Dim objMailItem As MailItem Dim objExplorer As Explorer Dim objSelection As Selection Dim objCurrentFolder As Folder Dim objNamespace As NameSpace Dim objAccess As Access.Application Dim strMail As String Dim strDatabase As String Dim db As DAO.Database strDatabase = "C:\...\Kundenverwaltung.accdb" Set objExplorer = Application.ActiveExplorer Set objCurrentFolder = objExplorer.CurrentFolder If objCurrentFolder.Name = "Posteingang" Then Set objSelection = objExplorer.Selection Set objNamespace = Application.GetNamespace("MAPI") If Not objSelection.count = 1 Then MsgBox ("Bitte selektieren Sie genau eine E-Mail.") Exit Sub End If Select Case TypeName(objSelection.Item(1)) Case "MailItem" Set objMailItem = objSelection.Item(1) strMail = objMailItem.SenderEmailAddress Set objAccess = GetDatabase(strDatabase) If objAccess Is Nothing Then Set db = OpenDatabase(strDatabase) If CustomerExists(db, strMail) Then OpenDatabaseInAccess strDatabase, strMail Else MsgBox "Es existiert kein Kunde mit der E-Mail-Adresse ''" _ & strMail & "''" End If Set db = Nothing Else ShowCustomer objAccess, strMail End If End Select End If End Sub
Listing 1: Prozedur zum Anzeigen eines Kunden in Access
Heißt dieser Ordner Posteingang, wird der Rest der Prozedur ausgeführt. Wenn Sie nicht die deutschsprachige Outlook-Version verwenden, heißt der Ordner möglicherweise anders, in diesem Fall müssen Sie den Code entsprechend anpassen. Die Prozedur erfasst mit der Variablen objSelection die aktuelle Auswahl in diesem Ordner. Wenn die mit Count ermittelte Anzahl der markierten Elemente nicht 1 lautet, erscheint eine entsprechende Meldung und die Prozedur wird beendet.
Anderenfalls prüft die Prozedur, ob es sich um ein Element des Typs MailItem handelt. Ist das der Fall, weist die Prozedur das markierte Objekt der Variablen objMailItem zu. Danach liest es die E-Mail-Adresse des Absenders aus der Eigenschaft SenderEmailAddress aus und schreibt sie in die Variable strMail.
Anschließend versucht die Prozedur, mit der Funktion GetDatabase auf eine laufende Instanz der Datenbank aus strDatabase zugreifen. Liefert diese kein Objekt zurück, bleibt objAccess leer. Die Prozedur durchläuft dann den If-Teil der Bedingung.
Hier erstellt sie mit OpenDatabase einen Verweis auf das Database-Objekt der Datenbank und referenziert dieses mit der Variablen db. Damit ruft sie die Funktion CustomerExists auf, die prüft, ob die Datenbank einen Kunden mit der angegebenen E-Mail-Adresse enthält. Falls ja, ruft die Prozedur eine weitere Routine namens OpenDatabaseInAccess auf, welche die Kundenverwaltung öffnen und die E-Mail-Adresse des gesuchten Kunden als Parameter übergeben soll.
Liefert CustomerExists den Wert False zurück, zeigt die Prozedur eine Meldung an, dass kein Kunde mit der angegebenen E-Mail-Adresse gefunden werden konnte.
Es gibt noch den Fall, dass die Funktion GetDatabase einen Verweis auf eine Access-Anwendung zurückgeliefert hat. Diese wird im Else-Zweig der entsprechenden Bedingung behandelt. Dieser Teil ruft die Prozedur ShowCustomer auf und übergibt dieser einen Verweis auf die gefundene Access-Instanz und die E-Mail-Adresse des gesuchten Kunden.
Die hier aufgerufenen Funktionen und Prozeduren beschreiben wir in den folgenden Abschnitten.
Datenbank holen mit GetDatabase
Die erste Funktion, die wir benötigen, heißt GetDatabase. Sie erwartet den Pfad der zu holenden Datenbank als Parameter und liefert eine Objektvariable des Typs Access.Application zurück (siehe Listing 2).
Public Function GetDatabase(strDatabase As String) As Access.Application Dim objAccess As Access.Application If IsDatabaseOpen(strDatabase) Then Set objAccess = GetObject(strDatabase) End If Set GetDatabase = objAccess End Function
Listing 2: Funktion zum Holen eines Access.Application-Objekts
Die Funktion ruft eine weitere Funktion namens IsDatabaseOpen auf, der ebenfalls der Pfad zu der betroffenen Datenbank übergeben wird. Diese Funktion, die wir im Anschluss beschreiben, prüft, ob die mit strDatabase angegebene Datenbank geöffnet ist. Ist das der Fall, verwendet die Funktoin GetDatabase die VBA-Funktion GetObject mit Angabe des Datenbankpfades, um einen Verweis auf das entsprechende Access.Application-Objekt zu holen. Der Inhalt der Variablen objAccess wird dann als Funktionswert der Funktion GetDatabase an die aufrufende Funktion zurückgegeben. Dabei kann objAccess an dieser Stelle auch leer sein, also den Wert Nothing enthalten.