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