2017-10-28 32 views
0

Ich versuche, eine SQL-UPDATE-Abfrage in einem VBA-Programm zu konfigurieren.OPENROWSET in VBA ADO-Abfrage

Grundsätzlich aktualisiere ich eine Tabelle in der aktuellen Arbeitsmappe aus einer Tabelle in einer geschlossenen Arbeitsmappe. Dies funktioniert gut, die unter Abfrage nur, wenn die Quelle-Arbeitsmappe eine .xls-Datei ist:

Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _ 
Columns As String, Filter As String) 

    Dim Cn As ADODB.Connection 
    Dim QUERY_SQL As String 
    Dim CHAINE_HDR As String 
    Dim STRCONNECTION As String 

    CHAINE_HDR = "[Excel 8.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=1;Extended Properties='HDR=YES;'] " 

    Set Cn = New ADODB.Connection 

    QUERY_SQL = _ 
    "UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM [" & SourceSheet & "$] " & _ 
    "IN '" & SourcePath & "' " & CHAINE_HDR & ") t2 " & _ 
    "ON [" & TargetSheet & "$].id = t2.id " & _ 
    "SET [" & TargetSheet & "$].ColA = t2.ColA " 

    STRCONNECTION = _ 
    "Driver={Microsoft Excel Driver (*.xls)};" & _ 
    "DriverId=790;" & _ 
    "Dbq=" & ThisWorkbook.FullName & ";" & _ 
    "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 


    Cn.Open STRCONNECTION 
    Cn.Execute (QUERY_SQL) 

    '--- Fermeture connexion --- 
    Cn.Close 
    Set Cn = Nothing 

End Sub 

als So XLSX-Datei als Quelldatei zu verwenden, die ich an der Quelle verbinden möchten den gleichen Provider/Treiber, den ich verwende, um eine Verbindung zum aktuellen wb herzustellen, das ist MSDASQL.1 anstelle von Microsoft.ACE.OLEDB.12.0. Wenn ich nur 'CHAINE_HDR' auf Excel 12.0 setze, bekomme ich einen "ISAM-Treiber nicht gefunden".

Um dies zu erreichen Ich versuche OPENROWSET wie folgt zu verwenden:

Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _ 
Columns As String, Filter As String) 

    Dim Cn As ADODB.Connection 
    Dim QUERY_SQL As String 
    Dim STRCONNECTION As String 
    Dim STRCONNECTION_SOURCE As String 


    STRCONNECTION_SOURCE = _ 
    "'MSDASQL.1'," & _ 
    "'Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" & SourcePath & ";'," & _ 
    "'SELECT * FROM [Data$]'" 

    Set Cn = New ADODB.Connection 

    QUERY_SQL = _ 
    "UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM OPENROWSET(" & STRCONNECTION_SOURCE & ")) t2 " & _ 
    "ON [" & TargetSheet & "$].id = t2.id " & _ 
    "SET [" & TargetSheet & "$].ColA = t2.ColA " 

    STRCONNECTION = _ 
    "Driver={Microsoft Excel Driver (*.xls)};" & _ 
    "DriverId=790;" & _ 
    "Dbq=" & ThisWorkbook.FullName & ";" & _ 
    "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 


    Cn.Open STRCONNECTION 
    Cn.Execute (QUERY_SQL) 

    '--- Fermeture connexion --- 
    Cn.Close 
    Set Cn = Nothing 

End Sub 

Allerdings erhalte ich ein "Synthax Fehler in FROM-Klausel".

Wie richtig meine SQL-Abfrage einrichten?

Dank

Antwort

1

Zuerst OPENROWSET ist eine Microsoft SQL Server-Methode (das heißt, TSQL), die Ihre Link Referenzen. Solche Abfragen würden nur innerhalb einer SQL Server-Abfrage ausgeführt werden. Es ist keine Jet/ACE SQL Engine-Methode (die Sie gerade verwenden). So bekommen Sie Ihre Datenbanken durcheinander. In Analogie dazu würden Oracle-Methoden in Postgres-Datenbanken nicht funktionieren.

Und ja, können die ACE 12.0 Anbieter sowohl älteren .xls und aktuellen .xlsx Dateien verbinden, so wie es kann mit älterem MS Access (Office Geschwister zu MS Excel) .mdb und aktuellen .accdb Dateien. Ändern Sie einfach die Versionen: Excel 8.0; zu Excel 12.0 Xml;.

In der Tat, Sie brauchen nicht einmal den Provider in den Inline-SQL-Befehlen angeben, indem Sie das folgende Format verwenden:

...INNER JOIN [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\File.xlsx].[SHEETNAME$] 

Mit MS Access (hoch für Datenbank Bedürfnisse beraten und verfügbar Excel-Parameter auf allen Windows-Rechnern, unabhängig von MSAccess.exe App installieren oder nicht), würden Sie nicht angeben müssen:

...INNER JOIN [C:\Path\To\Access\File.mdb].[TABLENAME] 

...INNER JOIN [C:\Path\To\Access\File.accdb].[TABLENAME] 
+0

Das Problem ist, wenn ich Ihr INNER JOIN und meine noch Verbindungsstring (STRCONNECTION) mit MSDQSL Ich bekomme einen 'ISAM-Treiber nicht gefunden'. Der eigentliche Grund, warum ich diesen Provider anstelle von ACE verwende, ist, dass ACE den folgenden Fehler generiert: "Sie können dieses Feld nicht bearbeiten, da es in einer verknüpften Excel-Tabelle gespeichert ist." Von dem, was ich gelesen habe, musste ich ACE durch das alte ersetzen, dh MSDASQL.1. Meine Verbindungszeichenfolge ist nicht mit der 'Excel 12.0' für die Quelldatei kompatibel. Wenn ich '{Microsoft Excel-Treiber (* .xls, * .xlsx, * .xlsm, * .xlsb)}} verwende, bekomme ich auch den verknüpften Excel-Tabellenkalkulationsfehler. – Lich4r

+0

Dann einfach die ursprüngliche Syntax beibehalten und die Versionen ändern: 'Excel 12.0 Xml;'. Es tut mir leid, dass ich keine Aktualisierungsabfragen für Arbeitsmappen ausführe und diesen Pfad nicht verirren möchte, da Excel keine Datenbank ist. – Parfait

+0

Übrigens ist ACE die Engine, die hier verwendet wird, um eine Verbindung zu Arbeitsmappen herzustellen, während OLEDB-Provider und ODBC-Treiber die APIs sind, um sich mit Arbeitsmappen zu verbinden. Sie sind komplementär und ersetzen keine Software.Und ACE.12.0 sollte eine Verbindung zu .xlsx-Dateien herstellen. Der ältere Jet 4.0 war auf .xls-Dateien beschränkt. – Parfait

Verwandte Themen