2017-10-27 10 views
0

Ich versuche, eine dynamische Client-Excel-Datei (en) zu erstellen, die mit einer Master-Excel-Datei "Server" verknüpft ist.VBA ADO Aktualisierungsabfrage

Ziel ist es, alle Daten in jeder der Dateien aktualisiert zu halten. Grundsätzlich, wenn die Client-Datei geöffnet ist, habe ich ein Update von der Master-Datei, und ich möchte dann die Master-Datei entsprechend jeder Änderung in der Client-Datei aktualisiert werden.

Ich kann Daten mit SELECT sehr leicht erhalten, aber Update-Abfrage wird nicht funktionieren. Hier ist ein Teil des Codes:

Option Explicit 


Private Type FichierSource 
    'Objet Fichier source. 
    Path As String 
    SourceSheet As String 
    TargetSheet As String 
    Columns As String 
    Filter As String 
    Name As String 
End Type 

Sub GetFiles() 
    'Take !M sheet to create files and their informations 
    Dim Base As FichierSource 

    '---------------------------- 
    'Create files object 
    '---------------------------- 

    'Fichier Source 
    Base.Path = "U:\Macros\SQL\Base.xlsx" 
    Base.SourceSheet = "DATA" 
    Base.TargetSheet = "Base2" 
    Base.Columns = "*" 
    Base.Filter = "" 
    Base.Name = "Base.xlsx" 


    '--------------------------- 
    'Launch queries 
    '--------------------------- 

    With Base 
     Call UPDATEQUERY(.Path, .SourceSheet, .TargetSheet, .Columns, .Filter) 
    End With 

End Sub 

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 
    Dim i As Long 

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


    Set Cn = New ADODB.Connection 

    QUERY_SQL = _ 
    "UPDATE [" & TargetSheet & "$] SET [Col] = (SELECT [Col] FROM [" & SourceSheet & "$] " & _ 
    "IN '" & SourcePath & "' " & CHAINE_HDR & Filter & ")" 



    STRCONNECTION = _ 
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source='" & ThisWorkbook.FullName & "';" & _ 
    "Extended Properties=""Excel 12.0 Macro;"";" 

' QUERY_SQL = _ 
' "UPDATE [" & TargetSheet & "$] SET " & _ 
' "[Col] = '3'" 

    'MsgBox (QUERY_SQL) 
    Cn.Open STRCONNECTION 

    Cn.Execute (QUERY_SQL) 


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

End Sub 

Als ich die kommentierten SQL-Abfrage ausführen, um die Spalte ‚Col‘ zu aktualisieren, um ‚3 ‘ es perfekt aber funktioniert, wenn ich versuche, das zu aktualisieren verwenden Wählen Sie aus der Master-Datei ich folgende Fehlermeldung

Betrieb eine aktualisierbare Abfrage

UPDATE bekommen verwenden müssen: ich denke, das eigentliche Problem ist da:

Ich habe Fragen zu dem Thema gelesen, aber jede funktionierte für mich. In der Tat Wenn ich 'ReadOnly = False' in meiner Verbindungszeichenfolge gesetzt habe, bekomme ich den folgenden Fehler 'Pilote ISAM introuvable' ('ISAM-Treiber nicht gefunden).

UPDATE 2: ISAM Treiberfehler wird angezeigt, wenn die Verbindungszeichenfolge nicht korrekt ist. (zB: eine schlechte Excel-Versionsnummer). Die ReadOnly = False (oder Mode = 'Freigabe verweigern Write') ist erforderlich, so ist die innere Verknüpfung.

Ich habe das bereits manuell erreicht, indem ich eine Verbindung zur Master-Datei in Excel-Verbindung hinzufüge, also weiß ich, dass dies möglich sein sollte.

Dank

Antwort

1

ich einen ähnlichen Test mit einem update gemacht habe und ein join, nur zum Spaß, und es funktionierte perfekt. Hier ist mein Code:

Sub SQLUpdateExample() 
    Dim con As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Set con = New ADODB.Connection 
    con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _ 
      "DriverId=790;" & _ 
      "Dbq=" & ThisWorkbook.FullName & ";" & _ 
      "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;" 
    Set rs = New ADODB.Recordset 
    Set rs = con.Execute("UPDATE [Sheet1$] inner join [Sheet2$] on [Sheet1$].test1 = [Sheet2$].test1 SET [Sheet1$].test3 = [Sheet2$].test3 ") 

    Set rs = Nothing 
    Set con = Nothing 
End Sub 

Vielleicht alles, was Sie benötigen, ist dies ;ReadOnly=False; in Ihrer Verbindungszeichenfolge?
Beachten Sie, dass trotz des Namens, den ich für den Treiber verwende, dies in einer XLSM-Datei funktioniert.

+0

Wie gesagt, wenn ich die 'readonly = false' der Verbindungszeichenfolge hinzufüge, wird ein Fehler ausgegeben. Ich werde versuchen, die Tabellen – Lich4r

+0

versuchen, meine Verbindungszeichenfolge? –

+0

Das Problem ist, dass Sheet2 in einer anderen Arbeitsmappe ist. So sagt das Programm, dass es es nicht findet. Wie füge ich ein "FROM" in die Update-Syntax ein? Und "ReadOnly = False" löst dieselbe Fehlermeldung aus: "Pilote ISAM introuvable" – Lich4r

1

ich hinzugefügt, um den SQL-Tag auf Ihre Frage so vielleicht ein SQL-Guru kann Ihnen helfen, besser. Wenn Sie jedoch die UPDATE-Syntax betrachten, aktualisiert eine UPDATE-Abfrage ohne WHERE-Klausel die angegebene Spalte jeder Zeile der Tabelle mit demselben Wert. Wenn Sie Ihren SELECT-Teil der Abfrage betrachten, sieht das so aus, als würde er mehr als einen Wert abrufen.

Wenn Sie die Spalte der Tabelle mit dem Wert einer übereinstimmenden Spalte in einer anderen Tabelle aktualisieren möchten, müssen Sie die Tabellen mithilfe einer WHERE-Klausel verknüpfen. Ich denke, die folgende wäre ein richtiges Beispiel sein:

UPDATE table1 SET col = (SELECT col FROM table2 WHERE table1.key=table2.key) 

ODER

UPDATE t1 
SET t1.Col = t2.Col 
FROM table1 AS t1 
    INNER JOIN table2 AS t2 
     ON t1.Key = t2.Key 
+0

Muss der Schlüssel der Spaltenname sein? Ich habe versucht, aber die gleiche Fehlermeldung erhalten. – Lich4r

+0

Die 'WHERE'-Klausel kann einen Ausdruck mit AND und OR annehmen, aber im Wesentlichen ja, es müssen Spaltennamen sein, sonst können Sie den Tabellen nicht beitreten. –