Gelegentlich werden Sie als Access-Entwickler vor der Aufgabe stehen, den Import aus Excel-Dateien zu implementieren. Manchmal gibt es dabei Sonderfälle, in denen etwa die Daten aus mehreren Sheets eingelesen oder bereitgestellt werden sollen. Wir schauen uns an, wie das mit mehreren Sheets gelingt.
Verschiedene Excel-Sheets importieren
Wenn Sie einmal verschiedene Seiten eines Excel-Dokuments importieren möchten, müssen Sie dafür bei der TransferSpreadsheet-Methode des DoCmd-Objekts einen bestimmten Ausdruck für den Parameter Range angeben.
Angenommen, Sie verwenden eine Excel-Datei, die zwei Sheets namens Tabelle1 und Tabelle2 wie in Bild 1 enthält.
Bild 1: Excel-Datei mit zwei Sheets
Im ersten Beispiel wollen wir beide Sheets in jeweils eine eigene Tabelle einfügen – die Feldüberschriften sind ja bereits auf geeignete Weise ausgelegt.
Der dazu verwendete Befehl lautet DoCmd.TransferSpreadsheet. Normalerweise würden Sie diesen Befehl wie folgt einsetzen, um die Daten von Excel in eine Access-Datenbank zu importieren:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "tblTest1", _
CurrentProject.Path & "\Test.xlsx", True
Der erste Parameter legt dabei fest, dass es sich um einen Import und nicht etwa um eine Verknüpfung handelt. Der zweite legt die Art der Quelle fest. Der dritte Parameter bestimmt den Namen der Tabelle, in welche die Daten importiert werden sollen, der vierte die Quelldatei. Schließlich legen Sie mit dem Wert True für den fünften Parameter fest, dass die Werte der ersten Zeile als Spaltenüberschriften interpretiert werden sollen.
Um diese Anweisung testweise wiederholt aufrufen zu können, haben wir diese in die Prozedur aus Listing 1 eingefügt. Die ersten Zeilen dieser Anweisung versuchen, bei deaktivierter eingebauter Fehlerbehandlung eine eventuell vorhandene Tabelle namens tblTest1 zu löschen. Dies kann zum Beispiel fehlschlagen, weil die Tabelle noch gar nicht vorhanden ist – dieser Fehler wird ignoriert.
Public Sub ImportExcelEinfach() On Error Resume Next DoCmd.DeleteObject acTable, "tblTest1" If Err.Number = 2008 Then MsgBox "Die Tabelle kann nicht gelöscht und neu erstellt werden, da diese geöffnet ist." Exit Sub End If On Error GoTo 0 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "tblTest1", _ CurrentProject.Path & "\Test.xlsx", True End Sub
Listing 1: Import eines Excel-Sheets
Es kann jedoch auch sein, dass die Tabelle gerade geöffnet ist. In diesem Fall erscheint eine entsprechende Meldung und die Prozedur wird abgebrochen. Alternativ könnten Sie hier auch eine Anweisung voranstellen, welche die Tabelle zuvor schließt.
Das Ergebnis sieht wie in Bild 2 aus. Es werden natürlich nur die Daten der ersten gefundenen Tabelle der Excel-Datei importiert.
Bild 2: Import ohne Angabe des Quellsheets
Zwei Sheets in zwei Tabellen
Im nächsten Schritt wollen wir die Daten der beiden Sheets in jeweils eine eigene Tabelle importieren. Hier wird es interessant: Spätestens in der zweiten DoCmd.TransferSpreadsheet-Anweisung müssen wir irgendwie festlegen, dass nicht das erste, sondern das zweite Sheet der Excel-Datei importiert werden soll.