SQL to MS Excel – Access-Daten gezielt nach Excel exportieren

‚Kannst du mir die aktiven Kunden aus Stadt X, sortiert nach Nachname, als Excel schicken?’ – und beim nächsten Mal anders. Dieses selbst-enthaltene VBA-Tool lässt Endanwender ihre Datenexporte selbst konfigurieren: ohne SQL-Kenntnisse, ohne Access-Erfahrung, ohne den Entwickler jedes Mal einzubeziehen.

Ein Datenbankbenutzer kommt zum Administrator: „Kannst du mir die Kundendaten aus Stadt X, nur aktive Kunden, sortiert nach Nachname, als Excel schicken?” Kein Problem – beim nächsten Mal aber eine andere Filterung, ein anderer Zeitraum, andere Felder. Der Wunsch nach gezielten Datenexporten ist in der Praxis nahezu täglich anzutreffen.

Genau dafür ist SQL to MS Excel entstanden: ein vollständig in VBA geschriebenes, selbst-enthaltenes Tool, das Endanwender in die Lage versetzt, ihre eigenen Exporte zu konfigurieren – ohne SQL-Kenntnisse, ohne Access-Erfahrung und ohne den Entwickler jedes Mal einzubeziehen.

Was kann das Tool?

Es besteht aus zwei Komponenten, die einzeln oder gemeinsam genutzt werden können.

1. Der interaktive SQL Statement Builder (frmExportExcel)

Eine vollständige grafische Oberfläche zum Aufbau von SQL-SELECT-Statements – der Benutzer muss kein SQL können, das Statement entsteht automatisch und in Echtzeit. Der Aufbau ist bewusst linear:

  1. Quelltabelle/-abfrage wählen (Dropdown, aus einer einzigen Konstante befüllt)
  2. Felder wählen (per Doppelklick in die Exportliste)
  3. Filter definieren – bis zu zwei WHERE-Bedingungen mit voller Operatorauswahl
  4. Sortierung festlegen – beliebig viele Felder, eine Richtung (ASC/DESC)
  5. Menge begrenzen – optional TOP N
  6. SQL prüfen oder direkt exportieren – das SQL kann vorher manuell nachbearbeitet werden

2. Die Exportfunktion ExcelExportSQL (direkter Aufruf)

Wer das SQL kennt oder es per Code erzeugt, ruft die Funktion direkt auf – ganz ohne Formular:

Call ExcelExportSQL("SELECT * FROM tblKunden", "Kundenliste")

Ideal für geplante Exporte, Berichte aus bestehenden Abfragen oder Fälle, in denen das SQL schon in anderen Modulen entsteht.

Der Builder im Detail

Live-Vorschau: Jede Änderung (Feldauswahl, Operator, Sortierung, TOP N) berechnet das SQL sofort neu und zeigt es in der Textbox txtSQL. Nützlicher Nebeneffekt: Der Benutzer kann das Statement vor dem Export manuell anpassen.

Filteroperatoren – für jeden der zwei Filter:

Operator Beschreibung
= <> < > <= >= Standardvergleiche
BETWEEN Von-Bis mit zwei Eingabefeldern
IS NULL / IS NOT NULL Kein Wert / ein Wert vorhanden
= TRUE / = FALSE Ja/Nein-Felder
LIKE *Wert* Enthält den Begriff
LIKE Wert* Beginnt mit dem Begriff
LIKE *Wert Endet auf den Begriff
NOT LIKE (3 Varianten) Negierung der LIKE-Varianten

Je nach Operator blendet das Formular die passenden Eingabefelder ein oder aus: BETWEEN zeigt Von/Bis, IS NULL blendet alle Felder aus, alle anderen zeigen ein einzelnes Wertefeld.

Typsichere WHERE-Klauseln

Ein oft unterschätztes Problem: die korrekte Formatierung von Literalwerten. Je nach Feldtyp muss ein Wert anders im SQL stehen:

  • Text: einfache AnfĂĽhrungszeichen – 'Berlin'
  • Datum: Access-Rauten-Format – #2024-12-31#
  • Numerisch: keine AnfĂĽhrungszeichen – 42
  • Boolean: -1 (True) oder 0 (False)

Das Tool ermittelt den Typ DAO-basiert: GetFieldType() öffnet einen minimalen SELECT TOP 1-Snapshot und liest den Field.Type direkt aus. FormatCriterion() formatiert danach jeden Wert deterministisch anhand des tatsächlichen Feldtyps.

Das verhindert den bekannten Access-Laufzeitfehler 3464 („Datentypkonflikt in Kriterienausdruck”) – der genau dann auftritt, wenn ein numerisch aussehender Wert in einem Textfeld ohne Anführungszeichen ins SQL gebaut wird.

Die Exportfunktion ExcelExportSQL im Detail

Public Sub ExcelExportSQL(sSQL As String, _
                          Optional sFileName As String = "Export", _
                          Optional sRange As String = "A2", _
                          Optional sHeader As String, _
                          Optional sColumnsToDelete As String)
  • sFileName – Dateiname (ohne Erweiterung)
  • sRange – Startposition der Daten
  • sHeader – Titel in Zelle A1
  • sColumnsToDelete – kommagetrennte Spaltennamen zum Löschen

Ablauf in 19 Schritten (alle im Quellcode dokumentiert): SQL validieren → DAO-Recordset öffnen (dbOpenSnapshot) → leeres Ergebnis abfangen → Exportparameter aufbereiten → Excel verbinden (GetObject/CreateObject) → Workbook anlegen → Performance-Einstellungen deaktivieren → Daten per CopyFromRecordset übertragen → Spaltenköpfe schreiben (inkl. AS-Aliase) → unerwünschte Spalten löschen (rechts→links) → letzte Datenzeile ermitteln → AutoFit → Kopfzeile formatieren (+ AutoFilter) → Kopfzeile einfrieren → Berichtstitel in A1 → Datenbereich formatieren → Seiteneinrichtung (A4 quer) → Performance wiederherstellen → Abschlussmeldung (Workbook bleibt offen).

Der sRange-Parameter (Standard "A2"): Daten ab Zeile 2, Köpfe in Zeile 1, Titel in A1. Für mehrzeilige Titelblöcke z. B. "A4":

Call ExcelExportSQL("SELECT * FROM tblBestellungen", "Bestellungen", "A4", "BestellĂĽbersicht Q2")

Auch mehrstellige Spaltenangaben ("AB10") werden korrekt geparst.

Spalten nachträglich löschen – interne Felder (IDs, Flags), die im SELECT bleiben müssen (z. B. für JOINs), aber nicht exportiert werden sollen:

Call ExcelExportSQL( _
    "SELECT ID, Vorname, Nachname, internerFlag FROM tblKunden", _
    "Kundenliste", _
    "A2", _
    "Kundenliste Export", _
    "ID,internerFlag")

Gelöscht wird von rechts nach links, damit die Indizes stabil bleiben.

Sprechende Spaltenköpfe per SQL-AS-Alias:

Call ExcelExportSQL( _
    "SELECT " & _
    "usr_nameFirst  AS [Vorname], " & _
    "usr_nameLast   AS [Nachname], " & _
    "cst_zipCode    AS [PLZ], " & _
    "cst_city       AS [Ort], " & _
    "ord_dtInvoice  AS [Rechnungsdatum] " & _
    "FROM tblBestellungen " & _
    "WHERE ord_active = True " & _
    "ORDER BY usr_nameLast", _
    "Rechnungsexport")

Implementierung – Schritt für Schritt

  1. Formular importieren: frmExportExcel in die Zieldatenbank importieren.
  2. EXPORT_SOURCES anpassen: die einzige zwingende Konfiguration, ganz oben im Formularmodul. Format "Anzeigename;TechnischerName" – Paare per Semikolon getrennt. Beliebig viele Quellen möglich, kein weiterer Code nötig.
  3. Formular öffnen – fertig.

Technisch: Late Binding – keine Bibliotheksreferenz

Das gesamte Excel-COM-Objekt wird per Late Binding angesprochen; es gibt keine Referenz auf die Excel-Objektbibliothek. Alle benötigten Excel-Konstanten sind als Private Const im Formularmodul deklariert:

Private Const XL_CALCULATION_MANUAL As Long = -4135
Private Const XL_CONTINUOUS         As Long = 1
Private Const XL_THIN               As Long = 2

Vorteil: Das Tool funktioniert auf jedem Rechner mit irgendeiner Excel-Version, ohne die Referenz nach einem Office-Upgrade neu einstellen zu mĂĽssen.

Fazit

SQL to MS Excel löst ein alltägliches Problem pragmatisch und professionell: Der Endanwender bekommt eine intuitive Oberfläche und professionell formatierte Excel-Dateien, der Entwickler ein wartbares, gut dokumentiertes Modul – mit minimaler Konfiguration (eine Konstante) und ohne externe Abhängigkeiten.

Download

Ein selbst-enthaltenes VBA-Tool für MS Access: Endanwender bauen per Formular SQL-SELECTs zusammen und exportieren typsicher, professionell formatiert nach Excel – oder rufen die Exportfunktion direkt per SQL auf. Late Binding, keine Referenzen.