VBA ADO更新查询

我正在尝试创build一个链接到“服务器”主excel文件的dynamic客户端excel文件。

目标是保持每个文件中的所有数据更新。 基本上,当客户端文件打开时,我有一个来自主文件的更新,然后我想根据客户端文件中所做的每个更改来更新主文件。

我可以很容易地使用SELECT获取数据,但更新查询将无法正常工作。 这是代码的一部分:

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 

当我执行注释的Sql查询,以便更新列“Col”到“3”它完美的作品,但是当我试图从主文件中使用SELECT更新时,我得到以下错误

操作必须使用可更新的查询

更新:我认为真正的问题在那里:

我已经阅读了关于这个问题提出的问题,但任何为我工作。 事实上, 如果我在连接string中设置“ReadOnly = False”,会出现以下错误“Pilote ISAM introuvable”('ISAM Driver not found)。

更新2:每当连接string不正确时,ISAM驱动程序错误会popup。 (例如:不好的Excel版本号)。 ReadOnly = False(或Mode ='Share Deny Write')是必须的,内连接也是如此。

我已经通过在excel连接中添加一个连接到主文件来手动完成所有这些,所以我知道这应该是可能的。

谢谢

我做了一个类似的testing, updatejoin ,只是为了好玩,而且工作完美。 这是我的代码:

 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 

也许你需要的只是这个;ReadOnly=False; 在你的连接string?
请注意,尽pipe我用于驱动程序的名称,它可以在.XLSM文件中使用。

我将SQL标签添加到您的问题,所以也许一个SQL大师可以帮助你更好。 但是,查看UPDATE语法,则不带WHERE子句的UPDATE查询将使用相同的值更新表的每一行的指定列。 看着你的查询的SELECT部分​​,它看起来好像会检索多个值。

如果要使用另一个表中匹配列的值更新表的列,则必须使用WHERE子句连接表。 我认为以下是一个正确的例子:

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

要么

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