VBA ADO更新查询

时间:2017-10-27 09:34:16

标签: sql excel vba ado

我正在尝试创建一个链接到"服务器"的动态客户端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 Query时,更新列' Col'到 3 '它工作得很好,但是当我尝试使用主文件中的SELECT进行更新时,我收到以下错误

  

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

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

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

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

OR

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

答案 1 :(得分:1)

我使用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文件。