Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Aus Excel-Zeilen SQL generieren

Aus Excel-Zeilen SQL generieren
22.07.2008 18:28:00
Jan
Hallo *,
leider kann ich überhaupt kein VBA, muss aber folgendes bewerkstelligen (was wahrscheinlich für einen Könner ziemlich einfach ist). Ich hoffe hier gibt es einen hilfreichen Geist, der mir weiterhelfen kann :)
Ein Excel Arbeitsblatt enthält mehrere Reiter in denen jeweils eine einzige Tabelle enthalten ist.
Die Erste Zeile enthält die Spaltenüberschriften.
Die darauffolgenden Zeilen enthalten die Daten, die in die Tabelle sollen
Spalte 1 | Spalte 2 | Spalte 3 | Spalte 4 | Spalte 5 | etc.
11 Tralala Huhn 12n1 2008.01.31
12 Tut Henne 2 2008.01.31 ....
Nun soll über ein VBA auf Knopfdruck eine Ausgabe erzeugt werden, die mir folgendes SQL Statement ausgibt
Insert into VALUES (11,"Tralala","Huhn","12n1","2008.01.31");
Insert into VALUES (12,"Tut","Henne",2,"2008.01.31); etc.
Das Auslesen der Spaltenüberschriften in der ersten Zeile ergibt somit die Anzahl der Spalten der Tabelle.
Der Reiter heisst so wie die Datenbanktabelle.
( Wenn die erste Zeile Ax leer sein sollte, so wird die Ausgabe beendet, da keine weiteren Daten mehr folgen oder aber allgemein es sollen nur AUsgaben für Zeilen mit Werten ausgegeben werden )
Das wahrscheinlich eigentliche Problem ist nun, daß abhängig von der Formatierung der Zellen Hochkommata gesetzt werden oder nicht. Wenn der Inhalt numerisch ist (integer) müssen keine Hochkammata gesetzt werden, wenn der Inhalt alphanumerisch oder ein Datumsformat ist, so müssen
Hochkommata gesetzt werden. Datumsfelder sind immer in das Fomat YMD4. zu konvertieren (JJJJ.MM.DD)
Das das ganze eigentlich nach Access gehört, ist mir klar, aber leider bin ich an Excel und diese Lösung gebunden.
Ich hoffe ihr könnt helfen :(
Viele Grüße
Jan

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Aus Excel-Zeilen SQL generieren
22.07.2008 22:31:34
Yal
Hallo Jan,
deine Daten liegen in Excel aber Du willst diese in eine SQL-Datenbank rüberbringen, richtig?
Noch zu fragen wäre, ob es sich um eine einmalige Angelegenheit handelt oder etwas, was regelmässig gemacht werden soll (und dann mit welcher Häufigkeit).
Die Lösung würde ich so sehen:
_ Daten in Access importieren. ollte der Vorgang öfter verwendet werden, soll beim ersten Mal die Importspezifikation sauber definiert werden, um diese wiederverwenden zu können (der Assistent steht dafür hilfbereit),
_ die Zieltabelle der SQL-Datenbank (ich gehe davon aus, dass es sich hier um etwas anderes als Access, ansonsten machen die "insert into" keinen Sinn) auch in die Access-Anwendung per ODBC einbinden
_ eine einfache Abfrage herstellen, um die Daten aus Excel in der Zieltabelle hinzufügen.
Fertig.
Ev. noch eine Makro herstellen, um die 3 Schritte zu automatisieren.
Viel Erfolg
Yal

Anzeige
AW: Aus Excel-Zeilen SQL generieren
23.07.2008 07:03:01
Jan
Hallo,
vielen Dank für die Antwort. Die Sache wird oft durchgeführt und ein Import nach Access ist nicht möglich (es steht kein Acces zur Verfügung und es darf auch kein access installiert werden).
Das ganze soll in eine Oracle DB importiert werden (aber letzendlich ist es ja egal), das insert into dürfte auf jeder DB funktionieren.
Es muß also das valide Statement aus der Excel-Anwendung heraus generiert werden.
Grüße
Jan

Anzeige
AW: Aus Excel-Zeilen SQL generieren
23.07.2008 21:44:23
Yal
Hallo Jan,
trotz dem "Kaum Excel/VBA-Kenntnisse" gehe ich davon aus, da Du mit SQL jongliert, dass Du EDV-tauglich bist.
Das VBA-Coding, um Daten direkt in einer ODBC-Datenbank zu versenden sieht so aus:

Sub DatenNachSQL_senden()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim LetzteSpalte%, LetzteZeile%
Dim Felder$()
Dim Daten$()
Set db = New ADODB.Connection
db.Open "ODBC;OdbcName;" 'zu vervollständigen
For Each W In Worksheets
Set rs = New ADODB.Recordset
'Recordset öffnen. Wir nehmen an, die Excel-Tabelle haben die selben Namen, wie die  _
Zieltabelle
rs.Open "select * from " & W.Name, db, adOpenDynamic, adLockOptimistic
LetzteSpalte = W.Range("IV1").End(xlToRight).Column
LetzteZeile = W.Range("A65536").End(xlUp).Row
ReDim Felder(1 To LetzteSpalte)
ReDim Daten(1 To LetzteSpalte)
'Übenrahme der Liste der Feldnamen:
For i = 1 To LetzteSpalte
Felder(i) = W.Cells(1, i).Value
Next i
'Übernahme der Daten und Versand:
For j = 2 To LetzteZeile
For i = 1 To LetzteSpalte
Daten(i) = W.Cells(j, i).Value
Next i
rs.AddNew Felder, Daten
Next j
rs.Close
Next W
db.Close
End Sub


Coding ist getestet worden und bedarf eventuell Anpassung.
Es gibt sonst eine Möglichkeit die Insert into direkt mit Formel zu erzeugen.
In eine freie Spalte -sagen wir rechts vom Datenbereich- folgende Formelaufbau ab Zeile 2 verwenden, hier im Beispiel nur 3 Spalten, aber beliebig erweiterbar:
="Insert into MeineTabelle (" &$A$1&","&$B$1&","&$C$1&") values ("&wenn(istzahl($A2;$A2; "'"&$A2&"'") &","&wenn(istzahl($B2);$B2;"'"&$B2&"'") & "," & wenn(istzahl($C2);$C2;"'"&$C2&"'") &"); "
Die Reihenfolge "'" ist Doppel-Hochkomma, Hochkomma, Doppel-Hochkomma. Schwer so zu erkennen.
Also gar nicht so kompliziert.
Viel Erfolg
Yal

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Aus Excel-Zeilen SQL generieren


Schritt-für-Schritt-Anleitung

Um Excel-Daten in eine SQL-Datenbank zu übertragen, kannst du die folgenden Schritte befolgen:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul hinzufügen: Klicke auf Einfügen > Modul.

  3. Code einfügen: Kopiere den folgenden VBA-Code in das Modul:

    Sub DatenNachSQL_senden()
        Dim db As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim LetzteSpalte%, LetzteZeile%
        Dim Felder$()
        Dim Daten$()
    
        Set db = New ADODB.Connection
        db.Open "ODBC;OdbcName;" 'zu vervollständigen
    
        For Each W In Worksheets
            Set rs = New ADODB.Recordset
            rs.Open "select * from " & W.Name, db, adOpenDynamic, adLockOptimistic
    
            LetzteSpalte = W.Range("IV1").End(xlToRight).Column
            LetzteZeile = W.Range("A65536").End(xlUp).Row
    
            ReDim Felder(1 To LetzteSpalte)
            ReDim Daten(1 To LetzteSpalte)
    
            ' Feldnamen übernehmen
            For i = 1 To LetzteSpalte
                Felder(i) = W.Cells(1, i).Value
            Next i
    
            ' Daten übernehmen und versenden
            For j = 2 To LetzteZeile
                For i = 1 To LetzteSpalte
                    Daten(i) = W.Cells(j, i).Value
                Next i
                rs.AddNew Felder, Daten
            Next j
    
            rs.Close
        Next W
    
        db.Close
    End Sub
  4. ODBC-Verbindung anpassen: Ersetze "OdbcName;" durch den Namen deiner ODBC-Datenbankverbindung.

  5. Makro ausführen: Schließe den VBA-Editor und führe das Makro über Entwicklertools > Makros aus.


Häufige Fehler und Lösungen

  • Fehler: ODBC-Verbindung kann nicht hergestellt werden
    Lösung: Überprüfe, ob die ODBC-Treiber korrekt installiert sind und die Verbindungsdaten stimmen.

  • Fehler: Leere Zellen führen zu Problemen
    Lösung: Stelle sicher, dass du in deinem Code eine Bedingung einfügst, die leere Zellen ignoriert:

    If W.Cells(j, i).Value <> "" Then
        Daten(i) = W.Cells(j, i).Value
    End If

Alternative Methoden

Eine alternative Methode, um Daten aus einer Excel-Tabelle in SQL umzuwandeln, ist die Verwendung von Formeln. Du kannst eine Formel in eine leere Spalte einfügen, um die SQL-Insert-Anweisungen direkt zu generieren:

="Insert into MeineTabelle (" & $A$1 & "," & $B$1 & "," & $C$1 & ") values (" & WENN(ISTZAHL($A2); $A2; "'" & $A2 & "'") & "," & WENN(ISTZAHL($B2); $B2; "'" & $B2 & "'") & "," & WENN(ISTZAHL($C2); $C2; "'" & $C2 & "'") & ");"

Diese Methode hilft dir, die SQL-Insert-Anweisungen für mehrere Zeilen zu generieren, ohne VBA verwenden zu müssen.


Praktische Beispiele

Angenommen, deine Excel-Tabelle sieht wie folgt aus:

Spalte 1 Spalte 2 Spalte 3 Spalte 4
11 Tralala Huhn 2008.01.31
12 Tut Henne 2008.01.31

Das resultierende SQL-Statement würde wie folgt aussehen:

Insert into MeineTabelle VALUES (11, "Tralala", "Huhn", "2008.01.31");
Insert into MeineTabelle VALUES (12, "Tut", "Henne", "2008.01.31");

Tipps für Profis

  • SQL-Spalte einfügen: Wenn du eine neue Spalte in deiner SQL-Tabelle hinzufügen möchtest, achte darauf, die Struktur der Excel-Tabelle entsprechend anzupassen, bevor du das SQL-Insert erstellst.

  • Sicherheit: Achte darauf, dass du SQL-Injection vermeidest, indem du die Eingabewerte überprüfst, bevor du sie in die Datenbank schreibst.

  • Batch-Insert: Wenn du viele Zeilen hast, überlege, ob du mehrere SQL-Insert-Statements in einem einzigen Befehl zusammenfassen kannst, um die Effizienz zu steigern.


FAQ: Häufige Fragen

1. Kann ich Excel-Daten direkt in eine Oracle-Datenbank importieren?
Ja, du kannst VBA verwenden, um die Verbindung zur Oracle-Datenbank herzustellen und die Daten zu übertragen.

2. Was tun, wenn ich keine ODBC-Verbindung einrichten kann?
In diesem Fall kannst du auch die alternative Methode mit Formeln verwenden, um die SQL-Statements zu generieren und diese manuell in die Datenbank einzufügen.

3. Wie gehe ich mit leeren Zellen um?
Füge Bedingung in deinen VBA-Code ein, um leere Zellen zu ignorieren, oder verwende die Excel-Formeln, um nur vollständige Datensätze zu generieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige