Kunde zu einer E-Mail öffnen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

Auf geöffnete Datenbank prüfen mit IsDatabaseOpen

Die Funktion IsDatabaseOpen erwartet mit dem Parameter strPath die Angabe der zu untersuchenden Datenbankdatei (siehe Listing 3). Der Ansatz ist, die beim Öffnen einer Datenbankdatei von Access erstellte Datei mit der Endung .laccdb zu untersuchen. Diese wird immer im gleichen Verzeichnis wie die .accdb-Datei erstellt. Außerdem ist diese Datei, wenn die Datenbank noch geöffnet ist, schreibgeschützt und kann nicht gelöscht werden. Manchmal kommt es vor, dass die Access-Datenbank geschlossen wird und die .laccdb-Datei noch vorhanden ist. Dann kann diese aber problemlos gelöscht werden, was wir in der Funktion ausnutzen.

Public Function IsDatabaseOpen(strPath As String) As Boolean
     Dim strLACCDB As String
     Dim bolIsDatabaseOpen As Boolean
     strLACCDB = Replace(strPath, ".accdb", ".laccdb")
     If Not Len(Dir(strLACCDB)) = 0 Then
         On Error Resume Next
         Kill strLACCDB
         If Not Err.Number = 0 Then
             bolIsDatabaseOpen = True
         End If
         On Error GoTo 0
     End If
     IsDatabaseOpen = bolIsDatabaseOpen
End Function

Listing 3: Funktion zum Prüfen, ob eine Datenbank geöffnet ist

Die Prozedur ermittelt zunächst den Pfad zu der gegebenenfalls vorhandenen .laccdb-Datei, indem es für den mit strPath angegebenen Pfad die Zeichenkette .accdb durch .laccdb ersetzt.

Dann prüft die Prozedur, ob die Dir-Funktion für den Pfad zur .laccdb-Datei eine Zeichenkette mit einer Länge von mehr als 0 Zeichen zurückliefert. Dir liefert, soweit vorhanden, den Dateinamen. Wenn die .laccdb-Datei vorhanden ist, liefert Dir für den Pfad zu dieser Datei eine Zeichenkette mit mehr als 0 Zeichen.

Ist die .laccdb-Datei vorhanden, müssen wir nun noch prüfen, ob es sich dabei um ein Überbleibsel einer zuvor geöffneten Datenbank handelt oder um eine aktive .laccdb-Datei. Eine aktive .laccdb-Datei kann nicht gelöscht werden, also versuchen wir, diese zu löschen. Da das Löschen mit der Kill-Anweisung einen Fehler auslöst, wenn die Datei nicht gelöscht werden kann, deaktivieren wir die eingebaute Fehlerbehandlung zuvor mit der Anweisung On Error Resume Next. Nach dem Aufruf der Kill-Anweisung prüfen wir, ob dadurch ein Fehler ausgelöst wurde. In diesem Fall liefert Err.Number einen Wert ungleich 0. Das bedeutet: Wenn die Datenbank geöffnet ist, kann die .laccdb-Datei nicht gelöscht werden und Err.Number ist ungleich 0. In diesem Fall stellt die Funktion den Wert der Variablen bolIsDatabaseOpen auf True ein.

Nach dieser Prüfung gibt die Funktion den Wert aus bolIsDatabaseOpen als Funktionswert zurück.

Prüfen der E-Mail-Adresse mit CustomerExists

Die Funktion CustomerExists erwartet einen Verweis auf das Database-Objekt der Kundendatenbank sowie die Angabe der zu untersuchenden E-Mail-Adresse als Parameter. Sie liefert einen Boolean-Wert zurück, der angibt, ob ein Kunde mit der angegebenen E-Mail-Adresse gefunden werden konnte (siehe Listing 4).

Public Function CustomerExists(db As DAO.Database, strEMail As String) As Boolean
     Dim rst As DAO.Recordset
     Set rst = db.OpenRecordset("SELECT * FROM tblKunden WHERE EMail = ''" & strEMail & "''", dbOpenDynaset)
     If Not rst.EOF Then
         CustomerExists = True
     End If
End Function

Listing 4: Funktion zum Prüfen, ob ein Kunde mit der angegebenen E-Mail-Adresse existiert

Die Funktion erstellt ein Recordset-Objekt auf Basis einer SELECT-Abfrage, die alle Kunden abfragt, deren Feld EMail mit dem Wert des Parameters strEMail übereinstimmt. Danach prüft sie, ob das Recordset nicht leer ist. In diesem Fall gibt die Funktion den Wert True zurück.

Öffnen der Kundendatenbank mit OpenDatabaseInAccess

Wenn der Kunde mit der angegebenen E-Mail-Adresse gefunden werden konnte und die Datenbank-Anwendung noch nicht geöffnet ist, wollen wir die Datenbank öffnen und den gewünschten Kundendatensatz in einem Formular namens frmKunden anzeigen.

Die dazu aufgerufene Prozedur heißt OpenDatabaseInAccess. Sie erwartet den Pfad zu der zu öffnenden Datenbank sowie die E-Mail-Adresse des anzuzeigenden Kunden als Parameter (siehe Listing 5).

Public Sub OpenDatabaseInAccess(strDatabase As String, strCommand As String)
     Shell "MSAccess.exe " & strDatabase & " /cmd " & strCommand, vbNormalFocus
End Sub

Listing 5: Prozedur zum Öffnen einer Access-Instanz mit der Kundendatenbank

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar