我正在尝试创建一个链接到"服务器"的动态客户端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连接中添加与主文件的连接手动实现了所有这些,所以我知道这应该是可能的。
由于
答案 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)
我使用update
和join
进行了类似的测试,只是为了好玩,而且效果很好。这是我的代码:
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文件。