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
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
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
Ü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