🚀 SQL to MS Excel – Datenbankdaten gezielt exportieren mit Microsoft Access VBA


Das Problem kennt jeder Access-Entwickler

Ein Datenbankbenutzer kommt zum Administrator und sagt: „Kannst du mir die Kundendaten von Stadtname X, nur aktive Kunden, sortiert nach Nachname, als Excel-Datei schicken?" – Kein Problem. Beim nächsten Mal soll es eine andere Filterung sein, ein anderer Zeitraum, andere Felder. Der Wunsch nach gezielten Datenexporten aus Access-Datenbanken ist in der Praxis nahezu täglich anzutreffen.

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


Was kann das Tool?

Das Tool besteht aus zwei Komponenten, die unabhängig voneinander oder gemeinsam genutzt werden können:

1. Das Dialogformular – der interaktive SQL Statement Builder

Das Formular frmExportExcel ist eine vollständige grafische Oberfläche zum Aufbau von SQL-SELECT-Statements. Der Benutzer muss kein SQL können – das Statement wird automatisch und in Echtzeit erzeugt und im Formular angezeigt.

Der Aufbau ist bewusst linear gehalten:

  1. Quelltabelle oder -abfrage auswählen – über eine Dropdown-Liste, die aus einer einzigen Konstante im Quellcode befüllt wird
  2. Felder auswählen – per Doppelklick aus der Liste der verfügbaren Felder in die Exportliste verschieben
  3. Filter definieren – bis zu zwei WHERE-Bedingungen mit vollständiger Operatorauswahl
  4. Sortierung festlegen – beliebig viele Sortierfelder, eine gemeinsame Sortierrichtung (ASC/DESC)
  5. Datensatzmenge begrenzen – optional TOP N für die ersten N Datensätze
  6. SQL prüfen oder direkt exportieren – das generierte SQL kann manuell nachbearbeitet werden, bevor der Export ausgelöst wird

2. Die Exportfunktion – direkter Aufruf per SQL

Wer das SQL-Statement bereits kennt oder es per Code erzeugt, kann die Exportfunktion ExcelExportSQL direkt aufrufen – ganz ohne das Formular:

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

Das ist besonders praktisch für geplante Exporte, Berichte aus bestehenden Abfragen oder Fälle, in denen das SQL bereits in anderen Modulen aufgebaut wird.


Der SQL Statement Builder im Detail

Live-Vorschau des SQL-Statements

Jede Änderung im Formular – ob Feldauswahl, Filteroperator, Sortiereintrag oder TOP-N-Wert – löst sofort eine Neuberechnung des SQL-Statements aus. Das Ergebnis ist in der Textbox txtSQL am unteren Rand des Formulars immer aktuell sichtbar.

Dieses Feature hat einen wichtigen Nebeneffekt: Der Benutzer kann das generierte Statement manuell anpassen, bevor er den Export startet. Erfahrenere Anwender oder Entwickler können so gezielt eingreifen, ohne die gesamte Auswahl zurücksetzen zu müssen.

Filteroperatoren

FĂĽr jeden der zwei Filter stehen folgende Operatoren zur VerfĂĽgung:

Operator

Beschreibung

=, <>, <, >, <=, >=

Standardvergleiche

BETWEEN

Von-Bis-Abfrage 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 gewähltem Operator blendet das Formular die passenden Eingabefelder automatisch ein oder aus: BETWEEN zeigt Von/Bis, IS NULL blendet alle Eingabefelder aus, alle anderen zeigen ein einzelnes Wertefeld.

Typsichere WHERE-Klauseln

Ein häufig unterschätztes Problem beim dynamischen Aufbau von SQL-Statements ist die korrekte Formatierung von Literalwerten. Gibt man einen Zahlenwert in eine Access-Textbox ein und setzt ihn als SQL-Literal ein, muss das Ergebnis vom korrekten Typ abhängen:

  • Text-Felder benötigen einfache AnfĂĽhrungszeichen: 'Berlin'
  • Datums-Felder das Access-spezifische Rauten-Format: #2024-12-31#
  • Numerische Felder keine AnfĂĽhrungszeichen: 42
  • Boolean-Felder die Werte -1 (True) oder 0 (False)

Das Tool löst das Problem durch eine DAO-basierte Typermittlung: Die Funktion GetFieldType() öffnet einen minimalen SELECT TOP 1-Snapshot auf die Quelltabelle und liest den Field.Type-Wert direkt aus dem DAO-Feldobjekt aus. Die Funktion FormatCriterion() formatiert anschließend jeden Wert deterministische anhand des tatsächlichen Feldtyps – unabhängig davon, wie der Wert aussieht.

Das verhindert den in Access bekannten Laufzeitfehler 3464 (Datentypkonflikt in Kriterienausdruck), der genau dann auftritt, wenn ein numerisch aussehender Wert in einem Textfeld steckt und ohne AnfĂĽhrungszeichen ins SQL eingebaut wird.


Die Exportfunktion ExcelExportSQL im Detail

Signatur

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 im Ăśberblick

Die Funktion arbeitet in 19 klar definierten Schritten, die alle im Quellcode dokumentiert sind:

  1. SQL validieren â€“ leere Strings werden mit Hinweis abgebrochen
  2. DAO Recordset öffnen – dbOpenSnapshot für maximale Leseperformance
  3. Leeres Ergebnis abfangen – kein leeres Excel-Workbook wird erzeugt
  4. Exportparameter aufbereiten – Zeilennummer aus dem sRange-Parameter parsen
  5. Excel verbinden – laufende Instanz wiederverwenden (GetObject) oder neue erstellen (CreateObject)
  6. Workbook anlegen – neues leeres Workbook als Ziel
  7. Performance-Einstellungen setzen – ScreenUpdating, Calculation, EnableEvents deaktivieren (nach Workbooks.Add!)
  8. Daten per CopyFromRecordset übertragen – schnellste Methode, kein zeilenweiser Loop
  9. Spaltenköpfe schreiben – Feldnamen aus dem Recordset, inkl. SQL-AS-Aliase
  10. Unerwünschte Spalten löschen – rechts-nach-links, indexpositionen bleiben stabil
  11. Letzte Datenzeile ermitteln – via End(xlUp) aus Excel
  12. AutoFit â€“ alle Spalten und Zeilen automatisch anpassen
  13. Kopfzeile formatieren – fett, Farbfüllung, Rahmen, AutoFilter-Dropdowns
  14. Fixierung â€“ Kopfzeile als Fensterbereich einfrieren
  15. Berichtstitel â€“ A1 mit groĂźem, farbigem Calibri-Font
  16. Datenbereich formatieren – Rahmen-Raster, Ausrichtung
  17. Seiteneinrichtung – A4 Querformat, Ränder, Druckoptionen
  18. Performance-Einstellungen wiederherstellen
  19. Abschlussmeldung – Workbook bleibt offen, Benutzer speichert manuell

 

Der sRange-Parameter

Standardwert ist "A2". Das bedeutet: Daten starten in Zeile 2, Spaltenköpfe kommen in Zeile 1, Titel kommt immer in A1.

Wer mehrzeilige Titelblöcke oder eine Leerzeile zwischen Titel und Kopfzeile möchte, übergibt z.B. "A4": Dann landen die Spaltennamen in Zeile 3, die Daten ab Zeile 4, und Zeilen 1–2 stehen für eigene Inhalte zur Verfügung.

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

Der Parameter unterstützt auch mehrstellige Spaltenangaben ("AB10") – die Zeilennummer wird zeichenweise extrahiert, nicht mit Mid(sRange, 2) abgeschnitten.

Spalten nachträglich löschen

Manchmal enthält eine Tabelle interne Felder (IDs, Flags, technische Schlüssel), die im Export nicht erscheinen sollen, aber aus praktischen Gründen im SELECT stehen müssen (z.B. für einen JOIN). Der optionale Parameter sColumnsToDelete nimmt eine kommagetrennte Liste von Spaltenüberschriften entgegen:

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

Die Löschung erfolgt von rechts nach links, damit die Indizes der noch zu löschenden Spalten nicht verschoben werden.


SQL-Aliase für sprechende Spaltenköpfe

Ein häufiger Praxisfall: Die Feldnamen in der Tabelle sind technisch benannt (usr_nameFirst, cst_zipCode, ord_dtInvoice). Im Excel-Export sollen lesbare Überschriften erscheinen.

Lösung: SQL AS-Aliase direkt im Statement:

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" )

Die Spaltentitel im Excel-Workbook lauten dann exakt: Vorname, Nachname, PLZ, Ort, Rechnungsdatum.


Implementierung – Schritt für Schritt

Schritt 1: Formular importieren

Das Formular frmExportExcel in die Zieldatenbank importieren:
Access → Externe Daten → Access oder direkt über den VBA-Editor per Drag & Drop.


Schritt 2: EXPORT_SOURCES anpassen

Die einzige zwingend notwendige Konfiguration befindet sich ganz oben im Formularmodul:

Format: "Anzeigename;TechnischerName" – Paare, durch Semikolon getrennt. Der Anzeigename erscheint in der Dropdown-Liste; der technische Name wird für das SQL verwendet. Beliebig viele Quellen können eingetragen werden – kein weiterer Code muss angefasst werden.


Schritt 3: Formular öffnen

​

Technische Details fĂĽr den Entwickler

Late Binding – keine Bibliotheksreferenz nötig

Das gesamte Excel-COM-Objekt wird per Late Binding angesprochen. Es gibt keine Referenz auf die Excel-Objektbibliothek (Microsoft Excel xx.x Object Library). Alle benötigten Excel-Konstantwerte sind als Private Constants 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
​usw.

Vorteil: Das Tool funktioniert auf jedem Rechner mit irgendeiner installierten Excel-Version, ohne dass die Referenz nach einem Office-Upgrade neu eingestellt werden muss.


đź’¬ 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 bekommt ein wartbares, gut dokumentiertes Modul, das er in beliebige Access-Datenbanken einbinden kann – mit minimaler Konfiguration (eine Konstante) und ohne externe Abhängigkeiten.


đź§Ş Probier es aus

Du entwickelst viel mit Access? Dann probier’s aus – ich freu mich auf Feedback oder Ideen fĂĽr weitere Funktionen! đźš€

​


Die ausführliche Beschreibung und alle Hinweise findet ihr direkt im Code – wie gewohnt gut dokumentiert.


 đź“Ą  DOWNLOAD  
Version: 1.0  04.05.2026


Wenn du es hilfreich findest und seinen Wert anerkennst, wĂĽrde ich mich ĂĽber eine kleine Spende freuen, die den Aufwand und den Nutzen widerspiegelt, den es dir bietet. PayPal Eine kleine Spende