Wenn Sie Dateien im .csv-Format in Ihre Datenbank eingebunden haben, kommt es gelegentlich vor, dass diese verschoben, umbenannt oder gelöscht werden. Dieser Beitrag zeigt nicht nur, wie Sie .csv-Dateien per VBA einbinden können, sondern auch, wie Sie erkennen, ob die Dateien noch an Ort und Stelle sind und diese gegebenenfalls mithilfe des Benutzers wieder einbinden.
Als Beispiel-Datei zum Verknüpfen verwenden wir einfach eine im .csv-Format exportierte Tabelle der Südsturm-Datenbank, in diesem Fall tblArtikel. Dazu nutzen wir den Export-Assistenten, den Sie über den Ribbon-Eintrag Externe Daten|Exportieren|Textdatei aufrufen. Hier stellen Sie beispielsweise ein, dass die Datei mit Spaltenüberschriften gespeichert werden soll. Außerdem öffnen Sie mit einem Klick auf die Schaltfläche Erweitert… den Dialog mit den Exportspezifikationen.
Speichern Sie diese per Mausklick auf die Schaltfläche Speichern unter… und geben Sie im Dialog Import/Export-Spezifikation speichern den Namen tblArtikel_CSV ein (s. Bild 1).
Bild 1: Export der Beispieltabelle, die später verknüpft werden soll
Nun wollen wir eine Verknüpfung zu der soeben in eine CSV-Datei exportierten Tabelle mit dem dafür vorgesehenen Assistenten erstellen (Ribbon-Eintrag Externe Daten|Importieren und Verknüpfen|Textdatei). Egal, ob wir dies mit Access 2013 oder 2016 erledigen wollten: Es gab immer eine Fehlermeldung wie die aus Bild 2.
Bild 2: Fehlermeldung beim Versuch, eine Verknüpfung zu erstellen
Diese erscheint auch unabhängig davon, ob wir beim Verknüpfen die Textdateispezifikation auswählen oder nicht. In beiden Fällen legte Access jedoch die Verknüpfung in der Liste der Tabellen an (s. Bild 3).
Bild 3: Access erstellt die Verknüpfungen trotz Fehlermeldung.
Wenn Sie keine Textdateispezifikation auswählen, liefert Access jedoch noch zusätzlich die Fehlermeldung aus Bild 4. Anscheinend sucht Access hier nach der Textdateispezifikation, deren Name standardmäßig beim Anlegen einer solchen vorgeschlagen wird – diese ist aber nicht in der Datenbank gespeichert (die Textdateispezfikationen finden Sie übrigens in den Systemtabellen MSysIMEXSpecs und MSysIMEXColumns).
Bild 4: Fehlermeldung wegen einer fehlenden Textdateispezifikation
In einer weiteren Systemtabelle namens MSysObjects entdecken wir, dass auch beim Verknüpfen ohne Textdateispezifikation eine solche angegeben wird – in diesem Fall als Wert der Eigenschaft DSN mit dem Wert TblArtikel Verknüpfungsspezifikation (s. Bild 5).
Bild 5: Die Importspezifikation wird in der Systemtabelle MSysObjects als Teil der Connect-Zeichenfolge angegeben.
Es scheint sich hier also um einen Fehler des Import-Assistenten zu handeln. Das ist aber kein Problem, denn wir streben ja in diesem Beitrag ohnehin eine VBA-gesteuerte Methode zum Verknüpfen der CSV-Dateien an.
Verschieben der CSV-Datei
Wenn Sie nun einmal die CSV-Datei verschieben und die darauf basierende Verknüpfung öffnen möchten, findet Access die angegebene Datei natürlich nicht mehr und gibt eine entsprechende Fehlermeldung aus. Es gibt auch keine einfache Möglichkeit, den Speicherort der verknüpften Datei an die veränderten Gegebenheiten anzupassen – Sie müssen die Verknüpfung erneuern.
Dazu können Sie diese entweder löschen und komplett neu erstellen oder Sie nutzen den Tabellenverknüpfungs-Manager. Diesen öffnen Sie über den Ribbon-Eintrag Externe Daten|Importieren und Verknüpfen|Verknüpfungs-Manager. Hier wählen Sie die zu aktualisierende Verknüpfung aus (s. Bild 6).
Bild 6: Der Tabellenverknüpfungs-Manager
Nach einem Klick auf die Schaltfläche OK bietet Access mit einem Datei auswählen-Dialog die Möglichkeit, die Quelldatei der Verknüpfung erneut auszuwählen (s. Bild 7). Nach einer Erfolgsmeldung können Sie nun wieder auf die aktualisierte Verknüpfung zugreifen.
Bild 7: Auswahl des neuen Speicherorts der Quelldatei einer Verknüpfung
Dies funktioniert übrigens nur, wenn sich der Speicherort der Datei geändert hat. Sollten Sie den Dateinamen oder die Dateiendung angepasst haben, können Sie mit der bereits angelegten Verknüpfung nicht mehr auf diese Datei zugreifen – der Dateiname ist fest verankert, lediglich der Pfad ist änderbar.
übrigens: Die Option Immer zur Eingabe eines neuen Speicherort auffordern im Tabellenverknüpfungs-Manager ist etwas ungeschickt benannt: Man könnte meinen, dass bei folgenden Problemen, die durch das Fehlen der Datei am angegebenen Ort auftreten, direkt ein Datei auswählen-Dialog erscheint.
Das ist aber nicht so: Die Option ist vielmehr so gemeint, dass Sie, wenn Sie mehr als eine Verknüpfung aktualisieren wollen, für jede einzelne den Speicherort angeben müssen.
Wie auch immer: Sie möchten die Verknüpfung, wenn Sie beispielsweise abwechselnd an Ihrem Arbeitsplatz oder am heimischen Rechner eine Anwendung entwickeln, nicht immer manuell aktualisieren. Das Gleiche gilt natürlich für den Kunden, der meist originelle Ideen hat, um den Speicherort der verknüpften Dateien zu variieren.
Außerdem wollen wir so flexibel sein, auch einmal eine Datei mit einer anderen Bezeichnung als beim erstmaligen Erstellen der Verknüpfung angegeben zu verwenden. Also prüfen wir nun die Möglichkeiten, die Verknüpfung möglichst automatisch zu aktualisieren.
Verknüpfung per VBA herstellen
Nun schauen wir uns an, wie wir die Verknüpfung per VBA herstellen und ob auch hier die Probleme mit der Textdateispezifikation auftreten. Dazu nutzen wir den VBA-Befehl DoCmd.TransferText.
Der erste Aufruf sieht wie folgt aus:
DoCmd.TransferText acLinkDelim, , "tblArtikel_CSV_VBA", CurrentProject.Path & "\tblArtikel.csv", True
Die Parameter haben dabei die folgenden Bedeutung:
- TransferType: Der Wert acLinkDelim legt fest, dass eine Verknüpfung einer Textdatei mit einem festgelegten Delimiter zum Einsatz kommt.
- SpecificationName: Bleibt im ersten Anlauf leer, da wir zunächst keine Textdateispezifikation verwenden möchten.
- TableName: Legt den Namen der Tabelle fest, hier „tblArtikel_CSV_VBA“
- FileName: Gibt den Dateinamen der zu verknüpfenden Datei an, in diesem Fall mit CurrentProject.Path & „\tblArtikel.csv“ die Datei tblArtikel.csv im Verzeichnis der Datenbankdatei.
- HasFieldNames: Legt mit dem Wert True fest, dass die erste Zeile beim Verknüpfen als Spaltenüberschriften interpretiert wird und nicht als Werte.
Das Ergebnis in der Tabelle MSysObjects sieht zunächst gut aus: Hier finden wir nun keine Angabe einer Textdateispezifikation mehr unter dem Wert DSN des Feldes Connect vor:
Text;DSN=;FMT=Delimited;HDR=YES;IMEX=2;ACCDB=YES;
Dummerweise wirkt sich dies negativ auf die Erstellung der Verknüpfung aus. Wenn Sie den neuen Eintrag tblArtikel_CSV_VBA per Doppelklick öffnen, erscheint zwar keine Fehlermeldung, aber die angezeigte Tabelle liefert nur die erste Spalte mit den Werten des Feldes ArtikelID (s. Bild 8) – und diese auch noch jeweils mit abschließendem Semikolon.
Bild 8: Das Ergebnis eines Imports ohne Textdateispezifikation
Es sieht also so aus, als ob wir doch eine Textdateispezifikation angeben müssen. Da die Methode TransferText aber einen Parameter zur übergabe des Namens einer solchen anbietet, probieren wir dies gleich einmal aus:
DoCmd.TransferText acLinkDelim, "tblArtikel_CSV", "tblArtikel_CSV_VBA_MitSpezifikation", CurrentProject.Path & "\tblArtikel.txt", True
Diese Variante gelingt auf Anhieb – die Verknüpfung landet unter dem Namen tblArtikel_CSV_VBA_MitSpezifikation im Navigationsbereich der Datenbank. Wir können die Arbeit, die wir vorher manuell durch Durchlaufen des Assistenten erledigt haben, auch per VBA ausführen. Mit einem Unterschied: Die Textdateispezifikation müssen wir zunächst einmal mit dem Assistenten erstellen.
Verknüpfung per VBA aktualisieren
Was geschieht nun mit der Verknüpfung, wenn wir diese erneut mit dem gleichen VBA-Befehl anlegen In diesem Fall erstellt die Methode die gleiche Verknüpfung nochmals, aber behält die bereits vorhandene Verknüpfung bei. Dazu ändert sie die Bezeichnung des neuen Exemplars, indem sie hinten eine laufende Nummer anhängt (also etwa tblArtikel_CSV_VBA_MitSpezifikation1).
Wenn wir die Verknüpfung aktualisieren wollen, weil diese nicht mehr aktuell ist, sollten wir also die bestehende Verknüpfung zuvor löschen, damit die neue wieder mit dem gewünschten Namen angelegt wird.
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