使用Excel VBA使用Excel数据快速更新Access数据

时间:2015-06-22 06:48:25

标签: sql vba excel-vba ms-access adodb

快速"快速"我的意思是使用UPDATE SQL查询而不是循环遍历每个记录集。

Here我发现这个好查询:

''Batch update (faster)
strSQL = "UPDATE [;Database=c:\Docs\DBFrom.mdb;].Table1 t " _
    & "INNER JOIN [Sheet7$] s " _
    & "ON s.id=t.id " _
    & "SET t.Field1=s.Field1 " _
    & "WHERE s.Field1<>t.Field1 "
cn.Execute strSQL

但是,从 Access VBA 连接到将数据从Excel提取到Access时,将使用此示例。

在我的情况下,我需要从 Excel VBA 连接并使用来自同一Excel文件(命名范围,不带标题)的数据更新Access数据。除了标题之外,数据具有完全相同的结构

我似乎无法理解如何使用此UPDATE方法,因为它使用了INNER JOIN个表,这些表是Access中的一个,另一个是Excel中的表。只有一个连接(cn),那么它如何读取和连接两个表?我猜测它不需要显式连接到自己的Access数据,因此只有一个连接到Excel数据。在我的情况下,我在Excel中,所以我假设我需要创建2个连接(对于Access和Excel,因为Excel不是数据库)?我可以在我的情况下使用这种批量更新方法(如果有帮助,我会在Excel中添加标题)吗?

我目前的情况:

Sub test_update()

Dim cn As Object    ''late binding - ADODB.Connection
Dim strSQL As String
Dim strFile As String
Dim strCon As String

Set cn = CreateObject("ADODB.Connection")

strFile = "C:\Temp\Tom\Tom.accdb"

''Consider HDR=Yes, so you can use the names in the first row of the set to refer to columns
''HDR=No;IMEX=1 - imex for mixed data types in a column
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";"
cn.Open strCon

''Batch update (fast)
strSQL = "UPDATE [;Database=" & strFile & ";].testQuery t " _
    & "INNER JOIN [testSheet$ExternalData_1] s " _
    & "ON s.ID=t.ID " _
    & "SET t.col1=s.F2 " _
    & "WHERE t.col1<>s.F2 "

cn.Execute strSQL


Set cn = Nothing

End Sub

我在cn.Execute strSQL收到运行时自动化错误,因为我了解我的strSQL必须无效。

testSheet是工作表的工作表名称和代码名称 ExternalData_1是指定的范围 testQuery是Access中我想要更新的查询(视图)的名称。

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找这样的代码:

Dim db As Object
Dim engine As Object
Set engine = CreateObject("DAO.DBEngine.120")
Set db = engine.OpenDatabase("C:\your\database.accdb")

Dim sql As String
sql = "UPDATE AccTable  AS acc " & _
    " INNER JOIN (SELECT * FROM [NamedRange] IN ""C:\your\excel\file.xlsx"" ""Excel 12.0 xml;"" ) AS xls " & _
    " ON acc.ID = xls.ID " & _
    " Set acc.SomeField = xls.SomeField "

db.Execute sql

不幸的是,对于所有当前版本的Access / DAO.DBEngine,这会引发错误消息You cannot edit this field because it resides in a linked Excel spreadsheet. The ability to edit data in a linked Excel spreadsheet has been disabled in this Access release.,因为出于安全原因, Microsoft故意禁用此功能

而且,是的,这是无稽之谈,因为您甚至没有尝试更新Excel中的数据,但它仍然不再起作用。据我所知,它适用于在单个SQL语句中将Excel工作表链接到Access-Table的所有可能方法。

作为一个工作,您可以尝试导入 Excel数据到Access数据库表(我不知道这是否仍然有效!)然后链接两个Access表进行更新,或者您将不得不求助于循环和更新单个记录。