VBA-Textexport unter Access 2007 und jünger

Normalerweise ist das Exportieren von Tabellen oder Abfragen als Text- oder CSV-Datei kein Problem – Sie nutzen entweder den Assistenten dazu oder verwenden die Methode TransferText des DoCmd-Objekts. Dummerweise führt dies, auch wenn es in Anwendungen bis Access 2003 funktionierte, unter neueren Versionen von Access zu einem Fehler. Warum dies geschieht und wie Sie TransferText weiter nutzen können, erläutert dieser Beitrag.

Wenn Sie einen Export der Daten einer Tabelle oder Abfrage in eine Textdatei per VBA automatisieren möchten, verwenden Sie normalerweise die TransferText-Methode des DoCmd-Objekts wie in folgendem Beispiel:

DoCmd.TransferText acExportDelim, , "tblArtikel", CurrentProject.Path & "\tblArtikel.txt"

Dies löst unter Access 2007 und jünger den Fehler aus Bild 1 aus. Anscheinend verwendet Access, wenn nichts anderes angegeben wird, entweder das Dezimaltrennzeichen oder das Texttrennzeichen als Feldtrennzeichen. Früher verwendete Access standardmäßig das Semikolon, aber Microsoft scheint hier etwas geändert zu haben. Welches Trennzeichen wird aber nun tatsächlich verwendet

pic001.png

Bild 1: Fehlermeldung beim Versuch, eine Tabelle mit DoCmd.TransferText ohne Angabe einer Export-Spezifikation zu exportieren

Um dies herauszufinden, habe ich probehalber das Trennzeichen in der Systemsteuerung von Windows verändert – am Fehler ändert sich dadurch jedoch nichts.

Fehlerfrei mit Export-Spezifikation

Es gibt nur eine Lösung für das Problem: Sie müssen eine Export-Spezifikation angeben. Diese ist natürlich zuvor noch zu erstellen, was sich aber durch einmaliges Durchlaufen des Export-Assistenten erledigen lässt. Dazu rufen Sie den entsprechenden Assistenten auf (unter Access 2010 etwa mit dem Ribbon-Eintrag Externe Daten|Exportieren|Textdatei) und klicken dort auf OK (nicht die Option Exportieren von Daten mit Formatierung und Layout aktivieren!). Nun klicken Sie auf die Schaltfläche Erweitert und dann auf Speichern unter. Geben Sie den gewünschten Namen für die Spezifikation an und speichern Sie die Spezifikation (s. Bild 2).

pic002.png

Bild 2: Speichern einer Export-Spezifikation

Den Assistenten können Sie nun abbrechen, ohne den Export durchzuführen – wir wollten nur eine beliebige Spezifikation anlegen, um diese für den Export per VBA nutzen zu können. Natürlich können Sie hier noch weitere Eigenschaften festlegen, wenn Sie diese benötigen – dies ist aber nicht Thema dieses Beitrags.

Nach dem Anlegen der Spezifikation und dem erneuten Aufruf der TransferText-Methode – diesmal unter Berücksichtigung der gespeicherten Spezifikation – gelingt auch der Export ohne Fehler:

DoCmd.TransferText acExportDelim, Spec_tblArtikel", "tblArtikel", CurrentProject.Path & "\tblArtikel.txt"

Problem: Viele Exporte

Was aber, wenn eine Anwendung sehr viele Aufrufe der TransferText-Methode enthält Sollten Sie diese in einer älteren Access-Version verwendet haben, klappte dies reibungslos. Unter Access 2007 und neuer löst jedoch jeder Text-Export ohne Spezifikation einen Fehler aus.

Wenn Sie keine Lust haben, für jede zu exportierende Tabelle oder Abfrage von Hand eine Export-Spezifikation zu erstellen, gibt es gute Nachrichten: Diese Aufgabe lässt sich auch per Code erledigen. Die Spezifikationen werden nämlich in Systemtabellen gespeichert: Die Basisinformationen landen in der Tabelle MSysIMEXSpecs und die Informationen zu den einzelnen Feldern in mehreren Datensätzen der Tabelle MSysIMEXColumns.

Im Gegensatz zu den übrigen Systemtabellen sind diese nicht geschützt und Sie können die Daten leicht per VBA hinzufügen. Es geht sogar noch weiter: Die Tabellen sind standardmäßig nicht angelegt und werden erst von Access erzeugt, wenn der Benutzer die erste Spezifikation speichert.

Sie können also den kompletten Prozess der Spezifikationserstellung per VBA abwickeln. Dabei hilft die Prozedur SpezifikationAnlegen aus Listing 1. Die Prozedur erwartet den Namen der Tabelle oder Abfrage, für welche die Export-Spezifikation erzeugt werden soll. Sie erstellt die beiden benötigten Tabellen mit entsprechenden CREATE TABLE-Abfragen und fügt auch die Primärschüssel und Indizes hinzu. Mit dem Wert 2 für die Attributes-Eigenschaft werden die hinzugefügten Tabellen auch noch als Systemtabellen gekennzeichnet.

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

Schreibe einen Kommentar