Bild 1: Starten von Import-, Verknüpfungs- und Exportvorgängen über das Ribbon
Microsoft Access bietet die Möglichkeit, nach Abschluss eines Imports oder Exports die Importschritte oder Exportschritte zu speichern. Dazu erscheint ein Dialog, in dem man wenige Parameter eingestellt werden können. Diese gespeicherten Importe und Exporte kann man anschließend wiederholen, indem man diese über einen entsprechenden Dialog auswählt. Wir wollen uns in diesem Beitrag einmal ansehen, was hier überhaupt geschieht, wo die Daten gespeichert werden und wie wir diese gegebenenfalls anpassen können, ohne dass wir den Import oder Export erneut durchführen müssen, um die geänderte Konfiguration zu erhalten. Und wie sich zeigen wird, gibt es sogar eine Erweiterung des Objektmodells von VBA zu diesem Zweck, das wir uns genau ansehen werden.
Importe und Exporte können wir in Access auf verschiedene Arten starten. Der offensichtlichste Web ist der über die Befehle im Ribbon, die wir unter Externe Daten finden (siehe Bild 1).
Bild 1: Starten von Import-, Verknüpfungs- und Exportvorgängen über das Ribbon
Am Ende eines jeden dieser Vorgänge erscheint die Meldung aus Bild 2.
Bild 2: Dialog zum Speichern der Exportschritte
Hier klicken wir zunächst auf Exportschritte speichern, um die übrigen Optionen einzublenden. Diese sind recht begrenzt: Wir geben einfach den Namen ein, unter dem wir den Import oder Export später wieder aufrufen können. Außerdem können wir noch eine Beschreibung hinzufügen.
Weiter unten können wir noch die Option Outlook-Aufgabe erstellen aktivieren. Diese sorgt dafür, dass eine neue Outlook-Aufgabe erstellt wird, die jedoch lediglich einen Text mit einer Anleitung enthält, wie der Import oder Export in Access gestartet werden kann (siehe Bild 3).
Bild 3: Outlook-Aufgabe mit einer Anleitung für den Import oder Export
Import oder Export erneut starten
Wenn wir diesen gespeicherten Import oder Export nun erneut ausführen wollen, betätigen wir im Ribbon unter Externe Daten eine der Schaltflächen Gespeicherte Importe oder Gespeicherte Exporte (siehe Bild 4).
Bild 4: Anzeigen der gespeicherten Importe und Exporte
Dies öffnet in beiden Fällen den gleichen Dialog, der jeweils eine Registerkarte für die Importe und die Exporte enthält (siehe Bild 5).
Bild 5: Anzeigen der gespeicherten Importe und Exporte per Ribbonbutton
Klicken wir doppelt auf einen der Einträge, wird der Import oder Export erneut ausgeführt. Dazu können wir den gewünschten Eintrag auch zuvor markieren und dann die Schaltfläche Ausführen betätigen. Wir können auch hier wieder eine Outlook-Aufgabe auf Basis des Imports oder Exports erstellen oder den Import oder Export löschen.
Gespeicherte Importe und Exporte per VBA
Spannend wird es, wenn wir uns ansehen, wie wir die gespeicherten Importe oder Exporte per VBA nutzen und verwalten können. Wenn wir im VBA-Editor im Objektkatalog nach Elementen suchen, die Import oder Export im Namen tragen, finden wir die folgenden interessanten Einträge:
- RunSavedImportExport: Methode der DoCmd-Klasse, mit der wir einen gespeicherten Import oder Export starten können
- acCmdSavedExports: RunCommand-Parameter. Öffnet den Dialog zur Anzeige von gespeicherten Importen und Exporten und aktiviert die Registerseite mit den Exporten.
- acCmdSavedImports: RunCommand-Parameter. Öffnet den Dialog zur Anzeige von gespeicherten Importen und Exporten und aktiviert die Registerseite mit den Importen.
- ImportExportSpeficications: Auflistung der CurrentProject– und der CodeProject-Klasse. Erlaubt den Zugriff auf die gespeicherten Importe und Exporte.
- ImportExportSpecification: Klasse, über die wir auf die Eigenschaften von gespeicherten Importen oder Exporten zugreifen können.
Schauen wir uns an, was wir mit den verschiedenen VBA-Befehlen anstellen können.
Anzeigen des Dialogs zur Anzeige von gespeicherten Importen
Mit dem folgenden Befehl zeigen wir per VBA den Dialog zur Anzeige von gespeicherten Importen an:
RunCommand acCmdSavedImports
Anzeigen des Dialogs zur Anzeige von gespeicherten Exporten
Mit dem folgenden Befehl zeigen wir per VBA den Dialog zur Anzeige von gespeicherten Exporten an:
RunCommand acCmdSavedExports
Aufrufen eines gespeicherten Imports oder Exports per VBA
Gegebenenfalls soll der Benutzer selbst Importe oder Exporte durchführen können, die wir zuvor angelegt haben. Da in professionellen Access-Anwendungen die eingebauten Ribbons nicht angezeigt werden, fügen wir entsprechende Steuerelemente im Ribbon oder in Formularen ein.
Wenn wir einen Import oder Export mit einem bestimmten Namen per VBA ausführen wollen, verwenden wir beispielsweise den folgenden Befehl:
DoCmd.RunSavedImportExport "Name des Exports oder Imports"
Arbeiten mit den gespeicherten Importen oder Exporten per VBA
Auf die einzelnen gespeicherten Import- und Exportspezifikationen können wir über die Auflistung ImportExportSpecifications zugreifen. Die enthaltenen Elemente haben den Typ ImportExportSpecification. Um die Namen der verfügbaren Import- und Exportspezifikationen auszugeben, können wir beispielsweise die folgende Prozedur verwenden:
Public Sub ImporteUndExporte() Dim objSpecification As ImportExportSpecification For Each objSpecification In _ CurrentProject.ImportExportSpecifications Debug.Print objSpecification.Name Next objSpecification End Sub
Per IntelliSense sehen wir die Eigenschaften und Methoden des ImportExportSpecification-Objekt auf einen Blick (siehe Bild 6).
Bild 6: Eigenschaften von Import- und Export-Spezifikationen
Hier ist die Beschreibung der einzelnen Elemente:
- Application: Liefert einen Verweis auf das übergeordnete Application-Objekt.
- Delete: Löscht die referenzierte Spezifikation.
- Description: Gibt die Beschreibung aus, die wir beim Speichern der Spezifikation angegeben haben.
- Execute: Führt den Import oder Export aus. Die Methode weist den optionalen Parameter Prompt auf. Dieser hat den Standardwert True. Wenn wir False angeben, werden eventuell notwendige Dialoge wie zum Beispiel zur Abfrage, ob eine vorhandene Datei überschrieben werden soll, nicht angezeigt und die Datei wird einfach überschrieben.
- Name: Liefert den Namen, den wir beim Speichern angegeben haben.
- Parent: Liefert einen Verweis auf das übergeordnete Objekt, hier CurrentProject oder CodeProject.
- XML: Liefert die Definition der Spezifikation im XML-Format.
Mögliche Fehler beim Export
Wenn wir die Execute-Methode für einen Export aufrufen und dabei eine Datei erzeugen, die geöffnet ist und nicht überschrieben werden kann, lösen wir damit den Fehler 2001 aus. Diesen können wir wie folgt umgehen:
Select Case Err.Number Case 2001 MsgBox "Die Datei ist vorhanden und geöffnet " _ & "und kann nicht überschrieben werden." Case 0 Case Else MsgBox "Fehler " & Err.Number & vbCrLf _ & Err.Description End Select
XML-Beschreibung der Spezifikation ausgeben
Mit der Eigenschaft XML geben wir die vollständige Dokumentation der Spezifikation aus. Diese sieht beispielsweise für den Export einer Tabelle im PDF-Format wie in Listing 1 aus.
<?xml version="1.0" encoding="utf-8" ?> <ImportExportSpecification Path = "C:\...\MSysObjects.pdf" xmlns="urn:www.microsoft.com/office/access/imexspec"> <ExportPDF AccessObject="MSysObjects" ObjectType="Table" AutoStart="false" Quality="screen" UseISO19005_1="false" /> </ImportExportSpecification>
Listing 1: Exportspezifikation für eine Tabelle, die als PDF-Dokument exportiert werden soll
Die Spezifikation gibt den Ziel- oder Quellpfad und den Namespace an. Außerdem enthält sie ein Element namens ExportPDF. Dieses stellt die Attribute mit den übrigen Eigenschaften bereit:
- AccessObject: Name des zu exportierenden Access-Objekts
- ObjectType: Typ des zu exportierenden Access-Objekts
- AutoStart: Angabe, ob die erstellte Datei automatisch geöffnet werden soll.
- Quality: Qualität des Exports (hier zum Beispiel screen).
- UseISO19005_1: Gibt an, ob das Format PDF/A verwendet werden soll.
Für den Export einer Textdatei fallen bereits wesentlich mehr Informationen an, wie Listing 2 zeigt.
<?xml version="1.0" encoding="utf-8" ?> <ImportExportSpecification Path = "C:\...\MSysObjects.txt" xmlns="urn:www.microsoft.com/office/access/imexspec"> <ExportText TextFormat="Delimited" FirstRowHasNames="false" FieldDelimiter=";" TextDelimiter="{DoubleQuote}" CodePage="1252" AccessObject="MSysObjects" ObjectType="Table" > <DateFormat DateOrder="DMY" DateDelimiter="." TimeDelimiter=":" FourYearDates="true" DatesLeadingZeros="false" /> <NumberFormat DecimalSymbol="," /> <Columns PrimaryKey="{Auto}"> <Column Name="Col1" FieldName="Connect" Indexed="NO" SkipColumn="false" DataType="Memo" Width="512" /> <Column Name="Col2" FieldName="Database" Indexed="NO" SkipColumn="false" DataType="Memo" Width="512" /> <Column Name="Col3" FieldName="DateCreate" Indexed="NO" SkipColumn="false" DataType="DateTime" Width="19" /> <Column Name="Col4" FieldName="DateUpdate" Indexed="NO" SkipColumn="false" DataType="DateTime" Width="19" /> <Column Name="Col5" FieldName="Flags" Indexed="NO" SkipColumn="false" DataType="Long" Width="11" /> <Column Name="Col6" FieldName="ForeignName" Indexed="NO" SkipColumn="false" DataType="Text" Width="255" /> <Column Name="Col7" FieldName="Id" Indexed="NO" SkipColumn="false" DataType="Long" Width="11" /> <Column Name="Col8" FieldName="Lv" Indexed="NO" SkipColumn="false" DataType="LongBinary" Width="5" /> ... </Columns> </ExportText> </ImportExportSpecification>
Listing 2: Exportspezifikation für eine Tabelle, die als Textdatei exportiert werden soll
Die entscheidende Frage, die sich hier stellt, ist: Können wir diese XML-Dokumente anpassen und in die Eigenschaft XML zurückschreiben, um die Spezifikationen per Code anzupassen oder sogar zu erstellen?
Die Antwort lautet ja. Wie genau funktioniert das? Wir müssen einfach den Inhalt der Eigenschaft XML auslesen, diese beispielsweise in einer Variablen speichern und dort bearbeiten und sie dann wieder der Eigenschaft XML zuweisen. Eine geänderte XML-Eigenschaft wird im Hintergrund dauerhaft in der Spezifikation gespeichert.
Was können wir nun damit anfangen? Wir können so beispielsweise den Pfad anpassen, in den die zu exportierende Datei gespeichert werden soll. Oder wir ändern das Attribut UseISO19005_1 für den Export in eine PDF-Datei, um sicherzustellen, dass die Datei PDF/A-konform ist. Das können wir zum Beispiel auf zwei Arten erledigen:
- indem wir einfach mit Zeichenkettenfunktionen nach dem zu ersetzenden Wert suchen und diesen ersetzen
- oder indem wir die XML-Bibliothek nutzen, um zielgenau die Attribute der entsprechenden Elemente anzupassen.
Wir wollen an einem kurzen Beispiel zeigen, wie wir damit den Export eines Berichts in eine PDF-Datei unter dem gewünschten Pfad erledigen können. Dazu legen wir zunächst einen gespeicherten Export an, den wir unter dem Namen ExportBerichtPDFA3 speichern.
Die Prozedur aus Listing 3 soll nun dafür sorgen, dass der mit dem Parameter strPath übergebene Pfad als Speicherort für die zu erstellende PDF-Datei verwendet wird.
Public Sub ExportPDF(strPath As String) Dim objSpecification As ImportExportSpecification Dim objXML As MSXML2.DOMDocument Dim objNode As MSXML2.IXMLDOMNode Dim objPath As MSXML2.IXMLDOMAttribute Set objSpecification = CurrentProject.ImportExportSpecifications("ExportBerichtPDFA3") Set objXML = New MSXML2.DOMDocument objXML.loadXML objSpecification.XML Set objNode = objXML.selectSingleNode("ImportExportSpecification") Set objPath = objNode.Attributes.getNamedItem("Path") objPath.nodeTypedValue = strPath objSpecification.XML = objXML.XML objSpecification.Execute End Sub
Listing 3: Ersetzen des Pfades für die zu exportierende PDF-Datei
Hier referenzieren wir als Erstes die unter dem Namen ExportBerichtPDFA3 gespeicherte Spezifikation. Dazu ermitteln wir das gesuchte Element aus der Auflistung ImportExportSpecifications, indem wir den Namen der Spezifikation als Parameter übergeben. Dann legen wir ein neues XML-Dokument des Typs DOMDocument an – hierfür ist das Setzen eines Verweises auf die Bibliothek Microsoft XML, v3.0 erforderlich -, und referenzieren es mit der Variablen objXML.
Wir laden das XML-Dokument der Spezifikation aus ihrer XML-Eigenschaft in die gleichnamige Eigenschaft von objXML. Mit der SelectSingleNode-Funktion holen wir uns einen Verweis auf das Element ImportExportSpecification und daraus das Attribut Path. Dieses füllen wir über die Eigenschaft nodeTypedValue mit dem Pfad aus strPath. Das so geänderte XML-Dokument schreiben wir nun aus der Eigenschaft XML von objXML in die entsprechende Eigenschaft von objSpecification zurück.
Diese können wir nun mit der Execute-Methode ausführen und sorgen so dafür, dass unser PDF-Dokument unter dem als Parameter angegebenen Pfad gespeichert wird und nicht unter dem ursprünglich angegebenen Pfad.
Auf diese Weise können wir auch alle übrigen Eigenschaften für den Export anpassen. Das Gleiche gilt natürlich auch für andere Exporte oder Importe, auch wenn diese andere Formate als PDF betreffen. Wir können sogar komplette Exporte per VBA in einem XML-Dokument zusammenstellen und dieses als neues ImportExportSpecification-Objekt speichern.
Zusammenfassung und Ausblick
Dieser Artikel zeigt, wie wir per VBA auf die Import- und Exportspezifikationen zugreifen können. Mit den hier vorgestellten Techniken können bestehende Spezifikationen beliebig angepasst und sogar komplett neue Spezifikationen erstellt werden.
Downloads zu diesem Beitrag
Enthaltene Beispieldateien:
GespeicherteImporteUndExporteVerwalten.accdb