SQL Select Abfrage in VBA
#1
Guten Morgen,

ich habe vor ein Makro zu erstellen dass bei Ausführung eine SQL Abfrage durchführt (Daten ->Daten Abrufen -> aus SQL Datenbank).
Diese soll dann einfach das Leere Arbeitsblatt eingefügt werden.
So nun funktioniert alles wunderbar nur die Abfrage selbst nicht, da ich mich bei SQL fast nicht auskenne habe ich den Abruf über einen "SQL Abruf Ersteller" angefertigt.
Wenn ich diesen aber in meinen String einfüge und durchlaufen lasse bekomme ich immer wieder den Fehler.

""Der Import D1.dbo.DV_FE_URLAUB" entspricht keinem Export. Dies ist möglicherweise auf einem fehlenden Modulverweis zurückzuführen"

So sieht mein Code aus:

Sub SQL()

Dim sqlabfrage As String
sqlabfrage = "Select dvk.ANF_TERMIN , dvk.D2_FRUEHESTER_TERMIN, dvk.END_TERMIN, dvk.ORT, dvk.ORG_TERMIN, dvk.ANZAHL, dvk.WUNSCH_TERMIN, FROM D1.dbo.DV_FE_URLAUB dvk"

ActiveWorkbook.Queries.Add Name:="D1", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Quelle = Sql.Databases(""111.11.111.111"")," & Chr(13) & "" & Chr(10) & "    M1 = Quelle{[Name=""D1""]}[Data]" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    M1"
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=D1;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = sqlabfrage
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "_D1"
        .Refresh BackgroundQuery:=False
End With

End Sub



Ich denke dass es an dem Format des Abruf Befehls liegt leider kann ich mir da nicht selber weiterhelfen und habe bereits dass halbe Internet durchforstet, was ich jedoch herausgefunden habe mit "Select * FROM [D1]" funktioniert alles wie gewollt nur dass ich halt nicht die Werte bekomme die ich brauche.

Hoffe mir kann da jemand weiterhelfen.

Danke Schonmal,
Gruß,
Thomas
Top
#2
Moin,

eine Möglichkeit:

gibt es eine DSN zur Datenbank?
Wenn ja, verwende das ADODB-Objekt in Verbindung mit einem ADODB.Recordset.

Fülle das Recordset mit der Methode .GetRows und Application.WorksheetFunction.Transpose() in ein 2 dimensionales Array und schreibe dieses in Verbindung mit Range.Resize(UBound() ,UBound()) zurück ins Worksheet.

Dieser Code ist besser zu lesen und pflegbarer bei SQL-Statementänderungen.
Top
#3
Servus Mase,

erstmal vielen dank, dass du mir wieder hilfst.

DSN ist mir jetzt keine Bekannt. Läuft alles über IP und Benutzer....
SQL-Statementänderungen werden keine stattfinden sobald dieser Code einmal funktioniert bleibt die Abfrage so.

Ich denke weiterhin dass irgendwas mit dem Select/From nicht stimmt.

Gruß
Thomas
Top
#4
Dann versuch doch mal via MS-Query die Abfrage zu erstellen.

Wenn Du Daten im MS-Query nach absetzen des Statements in Tabellenform angezeigt bekommst,
kannst Du das funktionierende SQL-Statement im MS-Query über die Menüleiste -> Ansicht -> SQL einsehen und via copy/paste in Deinem Code der Variable sqlabfrage zuweisen.


Alternativ:
MS-Access die Tabellen verknüpfen und das SQL-Statement bei Erfolg kopieren.
Top
#5
An MS-Query hab ich auch schon gedacht aber komischerweise ist diese Abfrageform in meinem Excel ausgegraut....
Mal schauen was ich da machen kann.

Dass mit Access ist auch ein guter Ansatz vlt. probier ich das mal.

Danke Schonmal

Gruß,
Thomas
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste