Einleitung
In meiner jüngsten Projektarbeit stand ich vor einer komplexen Herausforderung: dem Export einer Access-Tabelle nach Excel, wobei zusätzliche Berechnungen und eine flexible Spaltenauswahl erforderlich waren. Die Aufgabe erforderte einen Ansatz, der es ermöglicht, nur ausgewählte Spalten zu exportieren und diese Entscheidung durch eine Abfrage konfigurierbar zu machen.
Ausgangslage
Die Basis bildete eine einfache Tabelle in Access, genannt “Haupttabelle”, und eine Ansicht namens “auszugebende_Spalten”.
Ansatz 1: Festlegung der Spalten für den Export
Ermittlung der Spaltenanzahl
Um zu verstehen, welche Spalten exportiert werden sollen, gibt es zwei Methoden:
(a) Mittels RecordSet
Public Function Columns_Count(strTable As String) As Integer | |
Dim db As DAO.Database | |
Dim rs As DAO.Recordset | |
Dim iFieldCount As Integer | |
Set db = CurrentDb | |
Set rs = db.OpenRecordset("Select * from " & strTable, dbOpenSnapshot) | |
iFieldCount = rs.Fields.Count | |
Columns_Count = iFieldCount | |
rs.Close | |
db.Close | |
End Function |
(b) Mittels TableDefs/QueryDefs
Public Function Columns_Count2(strTable As String) As Integer | |
Dim db As DAO.Database | |
Set db = CurrentDb | |
Dim tdf As DAO.TableDef | |
For Each tdf In db.TableDefs | |
If tdf.Name = strTable Then | |
Columns_Count2 = db.TableDefs(strTable).Fields.Count | |
db.Close | |
Exit Function | |
End If | |
Next | |
Dim qdf As DAO.QueryDef | |
For Each qdf In db.QueryDefs | |
If qdf.Name = strTable Then | |
Columns_Count2 = db.QueryDefs(strTable).Fields.Count | |
db.Close | |
Exit Function | |
End If | |
Next | |
End Function |
Ermittlung der Spaltennamen
Ähnliche Methoden können zur Ermittlung der Spaltennamen verwendet werden:
Methode 1
Public Function Read_Columns(strTable As String) As Collection | |
Dim db As DAO.Database | |
Dim rs As DAO.Recordset | |
Dim Field As DAO.Field | |
Dim myColl As Collection | |
Set myColl = New Collection | |
Set db = CurrentDb | |
Set rs = db.OpenRecordset("Select * from " & strTable, dbOpenSnapshot) | |
For Each Field In rs.Fields | |
myColl.Add Field.Name | |
Next | |
rs.Close | |
db.Close | |
Set rs = Nothing | |
Set db = Nothing | |
Set Read_Columns = myColl | |
Set myColl = Nothing | |
End Function |
Methode 2
Public Function Read_Columns2(strTable As String) As Collection | |
' Ähnlicher Code wie Methode 1, aber mit Prüfung auf Tabelle oder Abfrage | |
' und Sammeln der Spaltennamen | |
End Function |
Export2Excel
Für den Export nach Excel habe ich eine Funktion entwickelt, die die ermittelten Spalten und Berechnungsergebnisse in eine Excel-Tabelle exportiert.
Public Sub sExport2Excel1() | |
' (1) Ermitteln der auszugebenden Spalten und (2) Erstellen einer Excel Datei | |
' Code zum Erstellen der Excel-Tabelle und Setzen der Spaltenüberschriften | |
' (3) Auslesen des Recordsets & Übertragung ins Excel | |
' Code zum Durchlaufen des Recordsets und Übertragen der Daten nach Excel | |
' (4) Excel anzeigen | |
appExcel.Visible = True | |
End Sub |
Ansatz 2: Ansicht programmatisch um die benötigten Spalten erweitern
Um die für Berechnungen erforderlichen Spalten dynamisch hinzuzufügen, habe ich eine Funktion entwickelt, die eine bestehende Abfrage um zusätzliche Felder erweitert.
Public Function AddFields2Query(strQuery As String, strQuellTabelle As String, Fields As Collection) As String | |
' Code zum Erweitern einer bestehenden Abfrage um zusätzliche Felder | |
End Function |
Export2Excel mit erweiterter Abfrage
Public Sub sExport2Excel2() | |
' (1) bis (5) Ermitteln der Spalten und Erstellen der erweiterten Abfrage | |
' Code zum Erstellen der Excel-Datei, Festlegen der Felder und Ermitteln der erweiterten Abfrage | |
' (6) Datenbank abfragen und (7) Excel anzeigen | |
' Code zum Durchlaufen der erweiterten Abfrage und Übertragen der Daten nach Excel | |
End Sub |
Fazit
Die Entwicklung dieser Exportfunktionen zeigt die Flexibilität von VBA bei der Bearbeitung von Datenbankinhalten. Mit VBA können wir komplexe Anforderungen wie dynamische Spaltenauswahl und zusätzliche Berechnungen während des Exports nach Excel effizient umsetzen.