Exceldaten per SQL und DAO

Im der Artikelreihe “Excel fernsteuern” haben Sie erfahren, wie Sie per Automation auf eine Excel-Datei zugreifen und dabei Daten aus der Tabelle lesen, schreiben oder bearbeiten können. Die Daten Zelle für Zelle zu durchlaufen ist dabei in vielen Fällen unumgänglich, vor allem, wenn Sie dabei auch noch individuelle Formatierungen unterbringen wollen. Wenn Sie jedoch schnell Daten von Excel nach Access oder umgekehrt bewegen wollen, ohne eine Excel-Instanz zu erzeugen und keine besonderen Anforderungen an die Formatierung haben, gibt es eine praktische Alternative – und zwar eine, bei der Sie sogar von Ihren vorhandenen DAO-Kenntnissen profitieren können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1803_ExceldatenPerSQLUndDAO.accdb.

Excel-Zugriff per OpenRecordset und SELECT

Wenn Sie per DAO auf die Daten einer Datenbank zugreifen wollen, um diese entweder per VBA zu durchlaufen oder diese zu löschen, anzulegen oder zu bearbeiten, beginnen Sie in der Regel mit dem öffnen eines Recordset-Objekts auf Basis der Tabelle oder Abfrage, in der sich die Daten befinden, die durchlaufen oder bearbeitet werden sollen. Die Syntax für die dazu verwendete OpenRecordset-Methode des Database-Objekts ist dabei hinlänglich bekannt – Sie benötigen zwei Objektvariablen namens db und rst und dann geht es los:

Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT *                  FROM tblArtikel", dbOpenDynaset)
'... etwas mit den Datensätzen machen

Benötigte Excel-Informationen

Aber wie können wir das nun für den Zugriff auf die Daten einer Excel-Tabelle wie etwa der aus Bild 1 nutzen Dazu benötigen wir nur einige wenige Informationen über die Excel-Daten, auf die wir zugreifen wollen:

Formular-Entwurf unseres Beispielformulars

Bild 1: Formular-Entwurf unseres Beispielformulars

  • den Dateinamen inklusive Verzeichnis,
  • den Namen der Tabelle und
  • den Bereich, auf den wir zugreifen wollen.

Den Rest bekommen wir durch geschickte Formulierung der SELECT-Abfrage hin. Diese ist gar nicht so viel komplizierter aufgebaut wie eine herkömmliche SELECT-Anweisung – wenn man weiß, wie es geht. Ein Beispiel ist das folgende:

SELECT * FROM [Artikelliste$A:J] IN 'C:\...\Artikel.xlsx'[Excel 8.0;HDR=No;IMEX=0;]

Diese Abfrage erwartet hinter dem FROM-Schlüsselwort den Namen der Tabelle in der Excel-Datei (hier Artikelliste)und davon durch ein Dollar-Zeichen ($) getrennt den betroffenen Bereich, hier A:J. Dieser Ausdruck muss in eckigen Klammern zusammengefasst werden. Danach müssen wir allerdings noch angeben, in welcher Datei sich die Daten befinden. Diese geben wir mit dem IN-Schlüsselwort an.

Dieses erwartet zwei Bestandteile. Als Erstes den Dateinamen in Hochkommata (‘C:\…\Artikel.xlsx’) und als zweites in eckigen Klammern Informationen darüber, in welchem Format die gelieferten Daten vorliegen ([Excel 8.0;HDR=No;IMEX=0;]).

Mit HDR geben Sie an, ob beim Zugriff vom Vorhandensein von Spaltenüberschriften in der ersten Zeile ausgegangen werden soll. In unseren Tests machte es allerdings keinen Unterschied – wir erhielten sowohl mit Yes als auch mit No nur die gewünschten Daten zurück und nicht die Spaltenüberschriften.

Die Prozedur aus Listing 1 zeigt, wie Sie die verschiedenen Parameter wie Dateiname, Tabellenname und Bereich einzeln in Variablen erfassen und diese dann zu einer SELECT-Anweisung zusammenstellen.

Public Sub ExcelPerRecordset()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strDatei As String
     Dim strTabelle As String
     Dim strBereich As String
     Dim strSQL As String
     Set db = CurrentDb
     strDatei = CurrentProject.Path & "\Artikel.xlsx"
     strTabelle = "Artikelliste"
     strBereich = "A:J"
     strSQL = "SELECT * FROM [" & strTabelle & "$" & strBereich & "] IN '" & strDatei & "'[Excel 8.0;HDR=Yes;IMEX=0;]"
     Debug.Print strSQL
     Set rst = db.OpenRecordset(strSQL)
     Debug.Print rst.Fields(0).Name, rst.Fields(1).Name
     Do While Not rst.EOF
         Debug.Print rst.Fields(0), rst.Fields(1)
         rst.MoveNext
     Loop
End Sub

Listing 1: Diese Prozedur erstellt ein Recordset auf Basis einer Excel-Tabelle und gibt die enthaltenen Daten aus.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar