【问题标题】:Updating Access Data Through Excel通过 Excel 更新 Access 数据
【发布时间】:2017-09-01 20:24:00
【问题描述】:

我认为这有一个简单的答案,但我试图用谷歌搜索答案让自己发疯了。 我有一个 Excel 工具,它通过 VBA 从 Access 数据库下载数据。到目前为止,除了我尝试更新数据时,所有这些都运行良好。

我认为问题在于我正在通过 QueryTable 导入数据。我似乎无法获得更简单的代码来运行以下代码:

  1. 创建与 Access 数据库表的连接
  2. 删除表格中的所有项目
  3. 对同一个表运行“INSERT INTO”查询

这是我的代码:

    Set obj = ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
    "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & cPath & ";Mode=ReadWrite"), Destination:=Range("W6")).QueryTable
With obj
    .CommandType = xlCmdSql
    .CommandText = Array(cRng.Offset(3, 0).Value)
    .PreserveFormatting = True
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SaveData = True
    .PreserveColumnInfo = True
    .SourceDataFile = cPath
    .ListObject.DisplayName = cName
    .Refresh BackgroundQuery:=False
End With

在哪里,

cPath = 访问数据库路径

cRng = 带有 SELECT 查询的 Excel 单元格(这很好用)

cName = 表/对象的名称

然后我运行两个“with obj”以使用 DELETE 和 INSERT INTO 查询更新 .CommandText,但这就是 Excel 说它无法运行查询的地方。

有什么想法吗?我知道答案很简单。

谢谢!

【问题讨论】:

  • 请在您的问题中包含完整的查询文本。此外,确保您的 Excel 文件在单元格中没有任何非 ascii 字符(Excel 倾向于添加一个字符来右对齐,一个简单的检查是将其复制并粘贴到即时窗口中,并检查意外的问号)。
  • 它们是非常简单的查询:“SELECT * from tbl_Date”、“DELETE * from tbl_Date”和“INSERT INTO tbl_Date VALUES ('7/7/2017')”

标签: excel vba ms-access


【解决方案1】:

您执行查询的方式对返回结果的查询有效,但对操作查询无效,因为它们不返回任何内容,因此 Excel 无法使用其结果创建表。

您可以使用 ADO 执行查询(您可以保持选择查询不变,并将其用于插入和删除)。您需要在 Excel 中设置对 Microsoft ActiveX 数据对象的引用(或修改代码以使用后期绑定)。

Dim conn As New ADODB.Connection
Dim adoRS As New ADODB.Recordset
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=" & cPath & ";Mode=ReadWrite"
adoRS.Open cRng.Offset(3, 0).Value, conn
adoRS.Close
conn.Close

此外,您的 INSERT 查询包含无效的 SQL(您尚未指定列,并且假设您要插入日期字段,则您没有正确分隔日期(它们是 # 分隔的) , 并建议使用 YYYY/MM/DD 日期格式以避免语言环境错误)。

INSERT INTO tbl_Date(MyDateColumn) VALUES (#2017/07/07#)

【讨论】:

    【解决方案2】:

    试试这个方法。

    Sub RunQueriesInAccess()
    
        Dim AC As Object
        Set AC = CreateObject("Access.Application")
        Dim strDatabasePath As String
        strDatabasePath = ThisWorkbook.Path & "\Your_Database.accdb"
    
        With AC
            .OpenCurrentDatabase (strDatabasePath)
            Dim db As Object
            Set db = .CurrentDb
            .DoCmd.SetWarnings False
            .DoCmd.OpenQuery "Query1"
            .DoCmd.OpenQuery "Query2"
            Dim qry As Object
            Set qry = db.QueryDefs("Parameter_Query")
            qry.Parameters(0) = Worksheets("Sheet1").Range("A1").Value
            qry.Execute
    
            .DoCmd.SetWarnings True
            .Quit
        End With
        ActiveWorkbook.RefreshAll
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多