Der in Access eingebaute Importassistent ist hilfreich, wenn man nur hin und wieder eine Tabelle verknüpfen oder importieren möchte. Wenn Sie diesen jedoch regelmäßig nutzen, werden Sie sich früher oder später ärgern, dass Sie jedes Mal erneut den Pfad der Quelldatenbank auswählen müssen. Dummerweise merkt sich Access noch nicht einmal den zuletzt verwendeten Pfad. Zeit, einen Ersatz für diesen Assistenten zu stricken – und zwar in Form eines kleinen Access-Add-Ins. Gleichzeitig erhalten Sie direkt noch einiges Know-how rund um das Verknüpfen und Importieren von Tabellen per VBA.
Funktionen des Add-Ins
Am Ende des Beitrag soll ein direkt einsetzbares Add-In herauskommen. Dieses sieht wie in Bild 1 aus und bietet eine Reihe interessanter Funktionen, die ein schnellstmögliches Verknüpfen mit den Tabellen anderer Datenbanken erlauben.
Bild 1: Das fertige Add-In zum schnellen Verknüpfen von Tabellen aus anderen Datenbanken
Wie schon in der Einführung erwähnt, ist vor allem das ständige Auswählen des Verzeichnisses der Quelldatenbank eine nervige Angelegenheit. Hier sollte auf jeden Fall der Hebel angesetzt werden. Deshalb soll das Formular gleich nach dem Öffnen die zuletzt zum Verknüpfen oder Importieren verwendeten Datenbankdateien anzeigen. Diese Liste könnte mit der Zeit etwas lang werden, deshalb haben wir neben der Schaltfläche zum Auswählen und Hinzufügen einer neuen Datenbank auch noch eine zum Löschen vorhandener Einträge eingebaut. Außerdem finden Sie ganz oben ein Textfeld, mit dem Sie die Datenbank- beziehungsweise Pfadnamen nach gewünschten Begriffen durchsuchen können. Nach Eingabe eines jeden Buchstabens wird der Inhalt des Listenfeldes mit den zuletzt verwendeten Datenbanken aktualisiert.
Fehlt noch eine Option im oberen Bereich des Formulars: Mit Nicht gefundene ausblenden stellen Sie ein, ob das obere Listenfeld solche Datenbankdateien, die aktuell nicht vorliegen, ausblenden soll.
Eigentlich könnte man diese auch gleich entfernen, aber es kann ja auch vorkommen, dass Datenbanken auf einem Netzlaufwerk liegen, das aktuell nicht verfügbar ist.
Ein Doppelklick auf einen der Listeneinträge des oberen Listenfeldes liest alle Tabellen der betroffenen Datenbank ein und zeigt diese in dem darunter befindlichen Listenfeld an.
Mit einem Klick auf das Kontrollkästchen Systemtabellen können Sie festlegen, ob die Liste nur benutzerdefinierte Tabellen anzeigen soll oder auch Systemtabellen. Rechts davon legen Sie fest, ob Tabellen importiert oder verknüpft werden sollen (eigentlich sollte das Add-In nur das Verknüpfen erlauben, aber das Importieren unterscheidet sich in einem einzigen Parameter – daher haben wir es auch noch hinzugefügt).
Im unteren Listenfeld markieren Sie schließlich die zu verknüpfenden oder zu importierenden Tabellen und führen die Verknüpfung oder den Import mit einem Klick auf die entsprechende Schaltfläche durch.
Tabellen der Lösung
Das Add-In verwendet zwei Tabellen, um die bereits verwendeten Datenbanken und die Tabellen der aktuellen Quelldatenbank zu speichern.
Die erste Tabelle heißt tblDatenbanken und sieht im Entwurf wie in Bild 2 aus. Das Feld Datenbank speichert den Datenbanknamen inklusive Pfad, das Feld Vorhanden wird erst beim Öffnen des Formulars gefüllt. Dabei erhält es den Wert True, wenn eine Datenbank der Tabelle nicht am entsprechenden Ort gefunden werden konnte. Das Feld Datenbank ist mit einem eindeutigen Index versehen, damit jede Datenbank nur einfach aufgenommen werden kann.
Bild 2: Tabelle zum Speichern der bereits verwendeten Datenbanken
Die Tabelle tblTabellen speichert nach der Auswahl der Datenbank, deren Tabellen verknüpft oder importiert werden sollen, die darin enthaltenen Tabellen.
Sie sieht im Entwurf wie in Bild 3 aus und enthält neben dem Feld Tabelle zum Speichern des Tabellennamens noch das Feld Flags, um den Wert des gleichnamigen Feldes der Tabelle MSysObjects aufzunehmen.
Bild 3: Tabellen zum Speichern der Tabellen der aktuell als Quelle für die Verknüpfung oder den Import dienenden Datenbank
Hauptformular erstellen
Das Hauptformular der Anwendung heißt frmLinkAndImportAdmin und sieht im Entwurf wie in Bild 5 aus und speichert aktuell drei Optionen:
Bild 4: Hauptformular des Add-Ins in der Entwurfsansicht
Bild 5: Tabellen zum Speichern der Add-In-Optionen
- Systemtabellen: Gibt an, ob Systemtabellen angezeigt werden sollen oder nicht. Wird mit dem Kontrollkästchen chkSystemtabellen eingestellt, das auch an dieses Feld der Tabelle tblOptionen gebunden ist.
- NichtGefundeneAusblenden: Legt fest, ob aktuell nicht auffindbare Datenbanken ausgeblendet werden sollen. Wird mit dem Kontrollkästchen chkNichtGefundeneAusblenden eingestellt.
- VerknuepfenOderImportieren: Speichert die letzte Einstellung der Optionsgruppe ogrVerknuepfenOderImportieren.
Durch die Verwendung dieser Tabelle und der an die enthaltenen Felder gebundenen Steuerelemente werden die zuletzt verwendeten Einstellungen beim nächsten Start des Add-Ins wiederhergestellt.
Öffnen des Formulars
Das Öffnen des Formulars löst das Ereignis Beim Laden aus, was wiederum die Ereignisprozedur Form_Load aus Listing 1 auf den Plan ruft. Diese Prozedur ruft zunächst eine weitere Prozedur namens DatenbankenPruefen auf. Diese prüft, ob alle bisher verwendeten Datenbanken noch an Ort und Stelle sind. Ist dies nicht der Fall und ist die Option NichtGefundeneAusblenden aktiv, werden die entsprechenden Einträge des Listenfeldes lstDatenbanken ausgeblendet.
Listing 1: Laden des Formulars
Private Sub Form_Load() Dim db As DAO.Database Set db = CodeDb DatenbankenPruefen db.Execute "DELETE FROM tblTabellen", dbFailOnError Me!lstTabellen.Requery Me!lstDatenbanken.ColumnWidths = "0;" & Me!lstDatenbanken.Width & ";0" DatenbankenAktualisieren Set db = Nothing End Sub
Schauen wir uns zunächst dieses Listenfeld an: Es verwendet die Abfrage qryDatenbanken als Datenherkunft. Diese sieht wie in Bild 7 aus – bei zu langen Dateinamen werden Teile durch Platzhalter ersetzt (…).
Bild 6: Diese Abfrage fügt die gekürzte Fassung des Datenbanknamens zum Ergebnis hinzu.
Bild 7: Datenherkunft für das obere Listenfeld zur Anzeige der Datenbanken
Prüfen, ob alle Datenbanken an Ort und Stelle sind
Die Prozedur DatenbankenPruefen durchläuft alle Datensätze der Tabelle tblDatenbanken. Dabei versetzt sie den jeweils aktuellen Datensatz in den Bearbeitungsmodus und prüft dann mit der Dir-Funktion, ob die im Feld Datenbank angegebene Datei vorhanden ist.
Dies ist der Fall, wenn die Dir-Funktion eine Zeichenkette liefert, deren Länge größer als 0 ist. In diesem Fall stellt die Prozedur den Wert des Feldes Vorhanden auf den Wert True ein, sonst auf False. Schließlich speichert die Prozedur die änderung mit der Update-Methode und prüft dann den nächsten Datensatz:
Private Sub DatenbankenPruefen() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CodeDb Set rst = db.OpenRecordset("SELECT * FROM tblDatenbanken", dbOpenDynaset) Do While Not rst.EOF rst.Edit If Len(Dir(rst!Datenbank)) > 0 Then rst!Vorhanden = True Else rst!Vorhanden = False End If rst.Update rst.MoveNext Loop Set db = Nothing End Sub
Der Rest der Prozedur Form_Load ist schnell erklärt: Diese leert die Tabelle tblTabellen, da beim Öffnen des Formulars keiner der Listeneinträge markiert ist und somit auch keine Tabellen angezeigt werden sollen.
Das Listenfeld lstTabellen wird aktualisiert, danach stellt die Prozedur die Breite der angezeigten Spalte des Listenfeldes lstDatenbanken auf die Breite des gesamten Listenfeldes ein. Schließlich ruft die Prozedur eine weitere Routine namens DatenbankenAktualisieren auf (siehe Listing 2).
Listing 2: Aktualisieren der Datenbanken
Private Sub DatenbankenAktualisieren() If Me!chkNichtGefundeneAusblenden Then Me!lstDatenbanken.RowSource = "SELECT * FROM qryDatenbanken WHERE Vorhanden = True" Else Me!lstDatenbanken.RowSource = "SELECT * FROM qryDatenbanken" End If End Sub
Diese stellt einfach nur sicher, dass das Listenfeld lstDatenbanken nur diejenigen Datenbanken anzeigt, die der Benutzer sehen will. Dies hängt wieder von der Einstellung der Option NichtGefundeneAusblenden ab. Hat diese den Wert True, erhält das Listenfeld lstDatenbanken eine Abfrage basierend auf der Abfrage qryDatenbanken als Datensatzherkunft, die lediglich die vorhandenen Datenbanken anzeigt. Anderenfalls zeigt das Listenfeld alle Einträge an.
Die gleiche Routine wird noch zu einer anderen Gelegenheit aufgerufen – nämlich dann, wenn der Benutzer den Wert des Kontrollkästchens chkNichtGefundeneAusblenden ändert:
Private Sub chkNichtGefundeneAusblenden_AfterUpdate() DatenbankenAktualisieren End Sub
Dies aktualisiert schlicht die aktuell im Listenfeld lstDatenbanken angezeigten Einträge.
Datenbank hinzufügen
Schauen wir uns nun an, was bei einem Mausklick auf die Schaltfläche Datenbank hinzufügen geschieht. Dies löst die Prozedur aus Listing 3 aus.
Listing 3: Hinzufügen einer neuen Datenbank
Private Sub cmdDatenbankHinzufuegen_Click() Dim db As DAO.Database Dim strPfad As String Dim strDatenbank As String Dim lngNeueDatenbankID As Long Set db = CodeDb If Not Nz(Me!lstDatenbanken, 0) = 0 Then strPfad = db.OpenRecordset("SELECT Datenbank FROM tblDatenbanken WHERE DatenbankID = " _ & Me!lstDatenbanken, dbOpenSnapshot).Fields(0) strPfad = Mid(strPfad, 1, InStrRev(strPfad, "\")) Else strPfad = CurrentProject.Path End If strDatenbank = OpenFileName(strPfad, "Datenbank auswählen", _ "Access-Dateien (*.mdb,*.accdb)|Alle Dateien (*.*)") If Len(strDatenbank) > 0 Then On Error Resume Next db.Execute "INSERT INTO tblDatenbanken(Datenbank, Vorhanden) VALUES(''" & strDatenbank _ & "'', -1)", dbFailOnError If Err.Number = 3022 Then db.Execute "UPDATE tblDatenbanken SET Vorhanden = -1", dbFailOnError lngNeueDatenbankID = db.OpenRecordset("SELECT DatenbankID FROM tblDatenbanken " _ & "WHERE Datenbank = ''" & strDatenbank & "''", dbOpenSnapshot).Fields(0) Else lngNeueDatenbankID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0) End If Me!lstDatenbanken.Requery Me!lstDatenbanken = lngNeueDatenbankID TabellenEinlesen TabellenAktualisieren End If Set db = Nothing End Sub
Diese besitzt eine kleine Funktion, die dafür sorgt, dass im nun erscheinenden Datei öffnen-Dialog gleich das Verzeichnis der aktuell im Listenfeld lstDatenbanken markierten Datenbank erscheint. Dazu prüft die Prozedur zunächst, ob überhaupt ein Eintrag des Listenfeldes lstDatenbanken markiert ist. Falls nicht, verwendet sie einfach den Pfad der aktuellen Datenbank als Startverzeichnis. Anderenfalls liest sie den Pfad für den aktuellen Datensatz im Listenfeld aus der Tabelle tblDatenbanken ein und schneidet den Teil hinter dem letzten Backslash-Zeichen ab.
Damit ausgestattet, ruft die Prozedur die Funktion OpenFileName auf. Diese befindet sich im Modul mdlTools der Datenbank und zeigt, basierend auf der Wizhook-Klasse, den Datei öffnen-Dialog an. Das Ergebnis dieser Funktion landet in der Variablen strDatenbank.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo