🚀 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:
- Quelltabelle oder -abfrage auswählen – über eine Dropdown-Liste, die aus einer einzigen Konstante im Quellcode befüllt wird
- Felder auswählen – per Doppelklick aus der Liste der verfügbaren Felder in die Exportliste verschieben
- Filter definieren – bis zu zwei WHERE-Bedingungen mit vollständiger Operatorauswahl
- Sortierung festlegen – beliebig viele Sortierfelder, eine gemeinsame Sortierrichtung (ASC/DESC)
- Datensatzmenge begrenzen – optional TOP N für die ersten N Datensätze
- 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:
- SQL validieren – leere Strings werden mit Hinweis abgebrochen
- DAO Recordset öffnen – dbOpenSnapshot für maximale Leseperformance
- Leeres Ergebnis abfangen – kein leeres Excel-Workbook wird erzeugt
- Exportparameter aufbereiten – Zeilennummer aus dem sRange-Parameter parsen
- Excel verbinden – laufende Instanz wiederverwenden (GetObject) oder neue erstellen (CreateObject)
- Workbook anlegen – neues leeres Workbook als Ziel
- Performance-Einstellungen setzen – ScreenUpdating, Calculation, EnableEvents deaktivieren (nach Workbooks.Add!)
- Daten per CopyFromRecordset übertragen – schnellste Methode, kein zeilenweiser Loop
- Spaltenköpfe schreiben – Feldnamen aus dem Recordset, inkl. SQL-AS-Aliase
- Unerwünschte Spalten löschen – rechts-nach-links, indexpositionen bleiben stabil
- Letzte Datenzeile ermitteln – via End(xlUp) aus Excel
- AutoFit – alle Spalten und Zeilen automatisch anpassen
- Kopfzeile formatieren – fett, Farbfüllung, Rahmen, AutoFilter-Dropdowns
- Fixierung – Kopfzeile als Fensterbereich einfrieren
- Berichtstitel – A1 mit großem, farbigem Calibri-Font
- Datenbereich formatieren – Rahmen-Raster, Ausrichtung
- Seiteneinrichtung – A4 Querformat, Ränder, Druckoptionen
- Performance-Einstellungen wiederherstellen
- 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




