快速"快速"我的意思是使用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中我想要更新的查询(视图)的名称。
答案 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表进行更新,或者您将不得不求助于循环和更新单个记录。