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

Datenbankabfrage SQL ODBC VBA

Forumthread: Datenbankabfrage SQL ODBC VBA

Datenbankabfrage SQL ODBC VBA
16.08.2002 14:12:31
Marc.L
Hallo Leute,

Ich habe folgendes Problem:

ich habe zwei Datenbankabfragen im VBA mit SQL über eine ODBC-Schnittstelle erstellt:

1.

Columns("A:B").Select
Selection.ClearContents
AuftrNr = Worksheets("Wochensheet").Range("a1")


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=riszeit-test;UID=dba;PWD=sql", Destination:=Range("A1"))

.CommandText = Array( _
"SELECT ade_ag.ag_bez, ade_auftr.auftr_id" & Chr(13) & "" & Chr(10) & _
"FROM ESCAD.ade_ag ade_ag, ESCAD.ade_auftr ade_auftr" & Chr(13) & "" & Chr(10) & _
"WHERE ade_ag.auftr_nr = ade_auftr.auftr_nr AND ((ade_auftr.auftr_id='" & AuftrNr & "'))")

.Name = "Abfrage von riszeit-test_1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = True
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub

2.

Columns("A:H").Select
Selection.ClearContents


With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=riszeit-test;UID=dba;PWD=sql", Destination:=Range("A1"))

.CommandText = Array( _
"SELECT ade_auftr.auftr_id, ade_wert.abr_dat, ade_ag.ag_bez, ade_wert.zeit_von, ade_wert.zeit_bis, pstamm.p_name, pstamm.p_vorname, ade_wert.dauer" & Chr(13) & "" & Chr(10) & _
"FROM ESCAD.ade_ag ade_ag, ESCAD.ade_auftr ade_auftr, ESCAD.ade_wert ade_wert, taurus.pstamm pstamm" & Chr(13) & "" & Chr(10) & _
"WHERE ade_wert.ag = ade_ag.ag_nr AND ade_ag.auftr_nr = ade_auftr.auftr_nr AND ade_wert.p_nr = pstamm.p_nr AND ((ade_wert.abr_dat Between 20020800 And 20020900) AND (pstamm.abt_nr=17) AND (ade_wert.zeit_von Not Like zeit_bis) AND (ade_ag.ag_bez Not In ('ROBCAD','ROBCAD 1-3','ROBCAD 4-5')))" & Chr(13) & "" & Chr(10) & _
"ORDER BY ade_wert.abr_dat DESC, ade_wert.zeit_von DESC")

.Name = "Abfrage von riszeit-test_1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = True
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub


Nun Das Problem:

Nur das Erste Makro läuft.

Ich habe die Vermutung, das der SQL-String der 2.Abfrage zu lang ist.
Ich habe glaube ich auch schon mal einen Beitrag im Forum über diese Thema gesehen, kann ihn aber nicht mehr finden.

Bitte helft mir.

Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Datenbankabfrage SQL ODBC VBA
19.08.2002 14:32:45
mathias r.
Die Zeilenumbrüche (chr10, chr13) sind in SQL überflüssig. Das bringt nur Fehlerquellen. Ein Space reicht als Abgrenzung
Anzeige
;
Anzeige

Infobox / Tutorial

Datenbankabfrage mit SQL über ODBC in Excel VBA


Schritt-für-Schritt-Anleitung

  1. ODBC-Datenquelle einrichten: Stelle sicher, dass die ODBC-Datenquelle korrekt konfiguriert ist. Gehe dazu in die Systemsteuerung und wähle "ODBC-Datenquellen" aus. Füge eine neue DSN hinzu, falls notwendig.

  2. VBA-Editor öffnen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.

  3. Modul hinzufügen: Klicke im Menü auf Einfügen und wähle Modul, um ein neues Modul zu erstellen.

  4. VBA-Code einfügen: Füge den folgenden Code in das Modul ein:

    Sub Datenbankabfrage()
        Dim AuftrNr As String
        AuftrNr = Worksheets("Wochensheet").Range("A1").Value
    
        ' Erste Abfrage
        With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DSN=riszeit-test;UID=dba;PWD=sql", Destination:=Range("A1"))
            .CommandText = "SELECT ade_ag.ag_bez, ade_auftr.auftr_id FROM ESCAD.ade_ag ade_ag, ESCAD.ade_auftr ade_auftr WHERE ade_ag.auftr_nr = ade_auftr.auftr_nr AND ((ade_auftr.auftr_id='" & AuftrNr & "'))"
            .Refresh BackgroundQuery:=False
        End With
    
        ' Zweite Abfrage
        With ActiveSheet.QueryTables.Add(Connection:= _
            "ODBC;DSN=riszeit-test;UID=dba;PWD=sql", Destination:=Range("A1").Offset(1, 0))
            .CommandText = "SELECT ade_auftr.auftr_id, ade_wert.abr_dat, ade_ag.ag_bez FROM ESCAD.ade_ag ade_ag, ESCAD.ade_auftr ade_auftr WHERE ade_ag.auftr_nr = ade_auftr.auftr_nr"
            .Refresh BackgroundQuery:=False
        End With
    End Sub
  5. Makro ausführen: Schließe den VBA-Editor und kehre zu Excel zurück. Drücke ALT + F8, wähle das Makro Datenbankabfrage aus und klicke auf Ausführen.


Häufige Fehler und Lösungen

  • Fehler: Zweite Abfrage läuft nicht: Überprüfe die Länge des SQL-Strings. Zu lange Strings können Probleme verursachen. Reduziere die Anzahl der Spalten oder vereinfache die Abfrage.

  • Lösung: Zeilenumbrüche entfernen: Mathias R. hat angemerkt, dass Zeilenumbrüche (Chr(10), Chr(13)) in SQL überflüssig sind. Ersetze sie durch ein Leerzeichen, um Fehlerquellen zu vermeiden.


Alternative Methoden

  • Verwendung von ADO: Alternativ kannst du ADO (ActiveX Data Objects) verwenden, um eine Verbindung zur Datenbank herzustellen. Das bietet mehr Flexibilität und Kontrolle.

    Dim conn As Object
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "DSN=riszeit-test;UID=dba;PWD=sql"
  • Power Query: Nutze Power Query in Excel, um eine benutzerfreundliche Schnittstelle zur Durchführung von Datenbankabfragen zu erhalten, ohne VBA verwenden zu müssen.


Praktische Beispiele

  • Beispiel 1: Holen von Daten für einen spezifischen Auftrag.

    .CommandText = "SELECT * FROM Aufträge WHERE AuftragsID = 12345"
  • Beispiel 2: Daten filtern mit NOT LIKE.

    .CommandText = "SELECT * FROM Kunden WHERE Name NOT LIKE '%Muster%'"

Tipps für Profis

  • SQL-Optimierung: Achte darauf, deine SQL-Abfragen zu optimieren, indem du nur die benötigten Daten abfragst. Das reduziert die Ladezeit und verbessert die Performance.

  • Fehlerbehandlung in VBA: Implementiere Fehlerbehandlungen, um Probleme während der Ausführung deines VBA-Codes abzufangen und zu beheben.

    On Error Resume Next

FAQ: Häufige Fragen

1. Frage
Wie kann ich meine ODBC-Verbindung testen?
Antwort: Du kannst die ODBC-Verbindung über die ODBC-Datenquellenverwaltung testen. Wähle die DSN aus und klicke auf "Testdatenquelle".

2. Frage
Was tun, wenn die Abfrage zu lange dauert?
Antwort: Überprüfe deine Abfragen auf unnötige Joins oder Filter, die die Performance beeinträchtigen könnten. Optimiere die SQL-Abfragen und reduziere die abgerufenen Datenmengen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige