VBA ADO 更新查询

VBA ADO Update Query

我正在尝试创建链接到 "server" 主 excel 文件的动态客户端 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 进行更新时,我收到以下错误

Operation must use an updatable query

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

我已阅读有关该主题的问题,但对我有用。实际上 如果我在我的连接字符串中设置 'ReadOnly=False',我会收到以下错误 'Pilote ISAM introuvable'(“未找到 ISAM 驱动程序”)。

更新 2:只要连接字符串不正确,就会弹出 ISAM 驱动程序错误。 (例如:错误的 excel 版本号)。 ReadOnly=False(或 Mode='Share Deny Write')是必需的,内部联接也是如此。

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

谢谢

我在你的问题中添加了 SQL 标签,所以也许 SQL 专家可以更好地帮助你。但是,查看 UPDATE 语法,没有 WHERE 子句的 UPDATE 查询将使用相同的值更新 table 每一行的指定列。查看查询的 SELECT 部分,看起来好像会检索多个值。

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

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

我用 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; 即可?
请注意,尽管我为驱动程序使用了名称,但这在 .XLSM 文件中有效。