2013-04-03 266 views
1

我使用宏将数据从Access数据库提取到Excel工作表中。我首先打开到数据库的连接,在字符串VAR定义我的SQL语句,然后倾倒在一个记录数据:从Excel工作表数据更新Access数据库

Dim db As Database 
Dim rs As RecordSet 
Dim sql As String 
Dim dbLocation As String 

dbLocation = ThisWorkbook.Path & "\database\data.accdb" 
Set db = OpenDatabase(dbLocation) 
sql = "Select * FROM [Master Table]" 
Set rs = db.OpenRecordSet(sql, dbOpenSnapshot) 

If Not rs.EOF Then 
    Worksheets("Sheet1").Range("A1").CopyFromRecordset rs 
End If 

rs.Close 
Set rs = Nothing 
db.Close 
Set db = Nothing 

这完美的作品。我将这些分发给一些人,并要求他们更新字段。然后我需要使用传回的数据更新Access数据。就设计而言,简单的事情是提取的excel数据反映结构中的访问数据库,因此更新查询应该很简单。还有一个主键,所以我只需要在该字段上映射。

任何想法如何做到这一点?我可以将整个excel数据表加载到记录集中并运行一些时髦的更新查询吗?

回答

2

您需要循环上表1行,并为每一行作出SQL字符串,看起来像:

"update [Master table] set 
    TableField1 = " & Range(Row, Col1).Value & "," 
    TableField2 = " & Range(Row, Col2).Value & "," 
    ... 
where IDTableField = " & Range(Row, IDColNum).Value 

然后做

db.Execute thatString 

PS:有可能是错误我的语法。在创建字符串时,您需要将单元格值转换为字符串。

0

shibormot的解决方案使用DAO的扩展:

Set objConnection = CreateObject("DAO.DBEngine.36") 
Set db = objConnection.OpenDatabase(strDBPath, blnExclusive, blnReadOnly, strPassword) 

For Each row In Range("A1:C3").Cells 
    strSQL = "UPDATE table SET " 
    strSQL = strSQL & "Field1 = " & Chr(34) & row.Cells(1) & Chr(34) & "," 
    strSQL = strSQL & "Field2 = " & Chr(34) & row.Cells(2) & Chr(34) & "," 
    strSQL = strSQL & "Field3 = " & Chr(34) & row.Cells(3) & Chr(34) 
    Db.Execute 
Next 

加送CHR(34)字符串数据

+2

不要不添加WHERE子句运行这样的代码,否则你会更新你的整个桌子,而不只是个别的行... – 2013-04-03 23:55:44

+0

非常好的一点 – 2013-04-03 23:56:40