Wer regelmäßig Daten aus Excel ins SQL-System übertragen muss, weiß: Copy & Paste ist fehleranfällig – und spätestens bei Automatisierungen keine Option mehr. Hier zeige ich Dir, wie Du mit einem VBA-Skript aus einem Tabellenblatt in Excel einen vollständigen SQL-Befehl erzeugst – bestehend aus CREATE TABLE und den passenden INSERT INTO-Statements.

💡 Was das Makro kann:

  • Liest eine Tabelle aus einem Excel-Blatt (z. B. ab Zelle A1 mit Überschriften).
  • Wandelt die Spaltenüberschriften in SQL-Spaltennamen um.
  • Erzeugt einen CREATE TABLE-Befehl.
  • Erzeugt für jede Datenzeile einen INSERT INTO-Befehl.
  • Gibt das fertige SQL-Skript in einer MsgBox oder in einer Textdatei aus.

🔧 Der VBA-Code

Sub ExportTableToSQL()
    Dim ws As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim row As Long, col As Long
    Dim tableName As String
    Dim createSQL As String, insertSQL As String, fullSQL As String
    Dim colNames() As String
    Dim dataType As String
    Dim cellValue As String
    
    ' Tabelle auswählen
    Set ws = ActiveSheet
    tableName = "MeineTabelle" ' Alternativ: InputBox("Tabellenname eingeben")

    ' Letzte Zeile und Spalte ermitteln
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ' Spaltenüberschriften lesen
    ReDim colNames(1 To lastCol)
    For col = 1 To lastCol
        colNames(col) = ws.Cells(1, col).Value
    Next col

    ' CREATE TABLE generieren
    createSQL = "CREATE TABLE [" & tableName & "] (" & vbCrLf
    For col = 1 To lastCol
        ' Datentyp vereinfachend auf NVARCHAR(MAX) gesetzt – kann erweitert werden
        dataType = "NVARCHAR(MAX)"
        createSQL = createSQL & "    [" & colNames(col) & "] " & dataType
        If col < lastCol Then createSQL = createSQL & "," & vbCrLf
    Next col
    createSQL = createSQL & vbCrLf & ");" & vbCrLf & vbCrLf

    ' INSERT INTO generieren
    For row = 2 To lastRow
        insertSQL = insertSQL & "INSERT INTO [" & tableName & "] ("
        For col = 1 To lastCol
            insertSQL = insertSQL & "[" & colNames(col) & "]"
            If col < lastCol Then insertSQL = insertSQL & ", "
        Next col
        insertSQL = insertSQL & ") VALUES ("
        For col = 1 To lastCol
            cellValue = Replace(ws.Cells(row, col).Value, "'", "''")
            insertSQL = insertSQL & "'" & cellValue & "'"
            If col < lastCol Then insertSQL = insertSQL & ", "
        Next col
        insertSQL = insertSQL & ");" & vbCrLf
    Next row

    ' Gesamten SQL-Text kombinieren
    fullSQL = createSQL & insertSQL

    ' Ausgabe z.B. in MsgBox (besser: in Textdatei)
    Dim fso As Object, txtFile As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtFile = fso.CreateTextFile(Application.DefaultFilePath & "\" & tableName & ".sql", True)
    txtFile.Write fullSQL
    txtFile.Close

    MsgBox "SQL-Skript wurde gespeichert in: " & Application.DefaultFilePath & "\" & tableName & ".sql", vbInformation
End Sub

🧪 Beispiel

Wenn Dein Excel-Sheet so aussieht:

IDNameAlter
1Alice31
2Bob45

Dann erzeugt das Makro folgendes SQL:

CREATE TABLE [MeineTabelle] (
    [ID] NVARCHAR(MAX),
    [Name] NVARCHAR(MAX),
    [Alter] NVARCHAR(MAX)
);

INSERT INTO [MeineTabelle] ([ID], [Name], [Alter]) VALUES ('1', 'Alice', '31');
INSERT INTO [MeineTabelle] ([ID], [Name], [Alter]) VALUES ('2', 'Bob', '45');

🛠️ Erweiterungen möglich

  • Automatische Datentyp-Erkennung pro Spalte
  • Unterstützung für NULL-Werte
  • Export in verschiedene Datenbankformate (z. B. PostgreSQL, MySQL)
  • Direkter Upload per ADO in eine Datenbank

📥 Wenn Du öfter solche Exporte brauchst oder SQL-Skripte automatisiert generieren willst, lohnt sich die Integration in ein größeres Tool oder die Nutzung der Power Platform. Ich helfe Dir gerne bei der Umsetzung.

👉 Möchtest Du Deine Excel-Prozesse automatisieren und SQL-Workflows vereinfachen? Schreib mir – ich entwickle die passende Lösung für Dein Unternehmen.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert