【问题标题】:Updating Access Database from Excel Worksheet Data从 Excel 工作表数据更新 Access 数据库
【发布时间】:2013-03-25 19:51:48
【问题描述】:

我使用宏将 Access 数据库中的数据提取到 Excel 工作表中。我首先打开与数据库的连接,在字符串 var 中定义我的 sql 语句,然后将该数据转储到记录集中:

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数据在结构上镜像了access db,所以更新查询应该很简单。还有一个主键,所以我只需要映射到那个字段。

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

【问题讨论】:

    标签: sql excel vba ms-access


    【解决方案1】:

    您需要遍历工作表 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:我的语法可能有错误。并且在制作字符串时需要将单元格值转换为字符串。

    【讨论】:

      【解决方案2】:

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

      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)

      【讨论】:

      • 不要在不添加 WHERE 子句的情况下运行这样的代码,否则您将更新整个表而不仅仅是单个行...
      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多