Die TransferSpreadsheet-Methode des DoCmd-Objekts ist die erste Wahl, wenn es um das Importieren von Excel-Daten per VBA geht. Und auch wenn die Online-Hilfe diese Methode auf einer Bildschirmseite abhakt, gibt es doch einiges mehr zum praktischen Umgang damit zu berichten.
Grundsätzlich können Sie mit der TransferSpreadsheet-Methode nicht nur Daten importieren, sondern auch Verknüpfungen mit Excel-Tabellen erstellen und Daten aus Access-Tabellen nach Excel exportieren. Wir wollen uns in diesem Beitrag jedoch auf den Import konzentrieren. Die Syntax der TransferSpreadsheet-Methode sieht so aus (es gibt noch einen letzten Parameter, der aber nicht verwendet wird):
DoCmd.TransferSpreadsheet(<Transfertyp>, <Dateiformat>, <Tabellenname>, <Dateiname>, <Besitzt Feldnamen>, <Bereich>)
Da wir mit TransferSpreadsheet Daten aus Excel importieren möchten, kommt uns der erste Parameter ganz recht: Mit ihm legen Sie die Art des Datentransfers fest. Dazu verwenden wir den Parameter acImport (die übrigen Konstanten lauten acExport und acLink).
Als Nächstes müssen wir der Methode mitteilen, mit welcher Excel-Version wir es zu tun haben. Wenn Sie die TransferSpreadsheet-Methode für sich selbst verwenden, werden Sie wissen, mit welcher Excel-Version Sie arbeiten. Wenn Sie diese aber in eine Software einbauen, die Sie weitergeben möchten, ist dies möglicherweise nicht der Fall: Dann kann es durchaus vorkommen, dass nicht die gewünschte Excel-Version vorliegt. Also müssen wir herausfinden, um welche Version es sich handelt. Eine einfache Variante erfordert das Erzeugen einer Excel-Instanz und sieht so aus:
Public Function ExcelVersion() As String Dim objExcel As Excel.Application On Error Resume Next Set objExcel = _ CreateObject("Excel.Application") If Err.Number = 0 Then With objExcel ExcelVersion = .Version End With End If objExcel.Quit Set objExcel = Nothing End Function
Die letzten beiden Zeilen sind theoretisch nicht notwendig, weil die Excel-Instanz mit dem Verlassen des Gültigkeitsbereichs der Variablen objExcel ohnehin zerstört wird, aber Ordnung muss sein. Die obige Funktion liefert für Access 2007 beispielsweise den Wert 12.0 zurück – das ist nicht der Wert, den die TransferSpreadsheet-Methode für den Parameter SpreadsheetType erwartet. Die möchte vielmehr eine der dafür vorgesehenen Konstanten sehen, also beispielsweise acSpreadsheetTypeExcel12, was dem Zahlenwert 9 entspricht. Wie aber gelangen wir von einem String-Ausdruck wie 12.0 zu einer Konstanten wie acSpreadsheetTypeExcel12 Wir werden hier wohl nicht um den Einsatz eines Mappings herumkommen, das wie folgt aussieht:
Public Function GetSpreadsheet(strVersion As _ String) Dim intSpreadsheetType As Integer Select Case Val(strVersion) Case 12 ''Excel 2007 intSpreadsheetType = 9 Case 11, 10, 9, 8 ''Excel 97-2003 intSpreadsheetType = 8 End Select GetSpreadsheetType = intSpreadsheetType End Function
Excel-Versionen älter als Excel 97 werden hier nicht berücksichtigt.
Der folgende Parameter ist der Tabellenname der Zieltabelle. Hier können zwei Fälle auftreten: Entweder Sie geben eine Tabelle an, die bereits vorhanden ist, oder einen neuen Tabellennamen. Im ersten Fall fügt die TransferSpreadsheet-Methode die Daten an die angegebene Tabelle an, sonst erstellt sie die Tabelle automatisch neu.
Als Nächstes folgt der Name der Excel-Datei, aus der Sie Daten nach Access importieren möchten. Hier wissen Sie entweder von vornherein, wo die Datei liegt, oder Sie lassen den Benutzer dies auswählen (wie das funktioniert, zeigen wir beispielsweise im Beitrag Excel-Importassistent im Eigenbau, Shortlink 696).
Interessant werden dann wiederum die Parameter HasFieldNames und Range. Wenn Sie diese nicht angeben, liest Access das komplette erste Tabellenblatt der Excel-Datei ein. Der Standardwert für HasFieldNames lautet False. Das bedeutet, dass alle Zeilen des ersten Tabellenblatts ohne Rücksicht auf Verluste eingelesen und in die Zieltabelle geschrieben werden. Geben Sie hingegen den Wert True an, geht Access davon aus, dass die Excel-Tabelle in der ersten Zeile Feldnamen enthält. Dies hat Zweierlei zur Folge:
- Die Feldnamen der neu erstellten Tabelle werden entsprechend den in der ersten Zeile enthaltenen Werten definiert.
- Es werden erst die Daten ab der zweiten Zeile eingelesen.