Per ODBC auf Excel zugreifen

SELECT-Anweisungen formulieren

Anders als Access, kennt Excel Tabellen nur in Form von Tabellenblättern, die zudem aus weitaus mehr Zeilen und Spalten bestehen, als mit Daten gefüllt sind. In Access ist das anders. Hier gibt es weder undefinierte Spalten noch komplette leere Zeilen in einer Tabelle. Zumindest ist Letzteres die Regel, weil eigentlich jede logisch aufgebaute Datenbank dafür sorgt, dass Datensätze gelöscht und nicht nur geleert werden, wenn die Daten nicht mehr erforderlich sind.

Da es auch leere Spalten und Zeilen gibt, genügt es nicht, die Tabellen anzugeben, aus denen die Daten stammen, sondern Sie sollten auch den Zellbereich bestimmen, in dem tatsächlich Daten gespeichert sind. Grundsätzlich gibt es folgende Möglichkeiten eine SELECT-Abfrage zu definieren:

  • SELECT * FROM [tabAdressen$]

  • SELECT ID, Nachname, Vorname, Strasse, PLZ, Ort FROM Adressliste

  • SELECT ID, Nachname, Vorname, Strasse, PLZ, Ort FROM [tabAdressen$]

  • SELECT ID, Nachname, Vorname, Strasse, PLZ, Ort FROM [tabAdressen$A1:G20]

Immer dann, wenn Sie den Namen des Tabellenblatts als Tabellename verwenden möchten, müssen Sie ihn in Klammern setzen und danach ein $-Zeichen angeben. Die Anweisung SELECT * FROM [tabAdressen$] gibt also alle Datensätze aus dem Tabellenblatt tabAdressen zurück. Bei der Anweisung SELECT ID,Nachname,Vorname, Strasse, PLZ, Ort FROM [tabAdressen$] werden nur bestimmte Spalten in der hier angegebenen Reihenfolge zurückgegeben. Wichtig ist dabei, dass Sie die Spalten so bezeichnen, wie Sie in der ersten Zeile des Tabellenblattes angegeben sind. Berücksichtigt werden in beiden Fällen nur die Zeilen, die nicht leer sind, bei Angabe des * in der Feldliste werden nur die Spalten zurückgegeben, die nicht leer sind.

Anders sieht das aus, wenn Sie wie in der zweiten Alternative einen benannten Bereich anstelle des Blattnamens angeben. Hier heißt der Bereich „Adressliste“ und umfasst die Spalten A bis G des Blatts. Hinter dem Schlüsselwort FROM folgt dann der Name des Zellbereichs.

Nutzen Sie Zellbereiche, können Sie natürlich auch auf einem Blatt mehrere Bereiche definieren und wie separate Tabellen in der SQL-Abfrage verwenden. Der Nachteil ist allerdings, dass beim Einlesen der Daten alle Zeilen und Spalten im Bereich verwendet werden, auch dann, wenn sie leer sind.

Das bedeutet, dass Sie bei Angabe eines Zellbereichs, der komplette Spalten umfasst, unter Umständen zwei Datensätze zurückbekommen und über 16.000 leere Zeilen. Das ist nicht nur unschön, sondern aus Performancegründen auch nicht optimal. Sie können aber natürlich auch über WHERE-Ausdrücke die Anzahl Datensätze begrenzen. In der Beispieltabelle könnte dieser Filter so lauten:

SELECT * FROM Adressliste WHERE ID>0

Der Vergleich ID>0 ist hier deshalb korrekt, weil in der Spalte ID nur numerische Werte stehen, die auch nicht als Text formatiert wurden. Daher werden sie wie numerische Felder einer Datenbank behandelt. Leere Zellen werden in numerischen Spalten als 0 interpretiert.

Alternativ zu benannten Zellbereichen können Sie auch den zu berücksichtigenden Zellbereich nach dem Tabellenblattnamen angeben. Im folgenden Beispiel wird der Zellbereich "A1" bis "G20" verwendet.

SELECT ID, Nachname, Vorname, Strasse, PLZ, Ort FROM [tabAdressen$A1:G20]