Daten aus Excel-Sheets importieren

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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.

Excel-Datei mit zwei Sheets

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.

Import ohne Angabe des Quellsheets

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.

Wenn man den Trick einmal kennt, ist es jedoch ganz einfach: Sie geben einfach für den sechsten Parameter namens Range den Namen des Sheets an, wie er unten im Reiter der Excel-Tabelle angegeben ist – in unserem Fall also etwa Tabelle1 oder Tabelle2. Das ist allerdings noch nicht der ganze Clou: Sie müssen diesen Bezeichnungen nämlich noch ein Ausrufezeichen anhängen, also beispielsweise Tabelle1! oder Tabelle2!. Wie dies aussieht, sehen Sie in Listing 2.

Public Sub ImportExcelNachTabelle()
     On Error Resume Next
     DoCmd.Close acTable, "tblTest1"
     DoCmd.Close acTable, "tblTest2"
     DoCmd.DeleteObject acTable, "tblTest1"
     DoCmd.DeleteObject acTable, "tblTest2"
     On Error GoTo 0
     DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
         "tblTest1", CurrentProject.Path & "\Test.xlsx", _
         True, "Tabelle1!"
     DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
         "tblTest2", CurrentProject.Path & "\Test.xlsx", _
         True, "Tabelle2!"
End Sub

Listing 2: Import zweier Excel-Sheets

Das Ergebnis finden Sie schließlich in Bild 3. Die Tabellen könnten auch unterschiedlich aufgebaut sein, da der Import einzeln erfolgt.

Import zweier Sheets in zwei Tabellen

Bild 3: Import zweier Sheets in zwei Tabellen

Zwei Sheets in eine Tabelle

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar