通过Excel更新访问数据

时间:2017-09-01 20:24:00

标签: excel vba ms-access

我认为这有一个简单的答案,但我在疯狂地试图给谷歌答案。 我有一个Excel工具,可以通过VBA从Access数据库下载数据。到目前为止,除了我尝试更新数据时,所有这些工作都很好。

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

  1. 创建与Access数据库表的连接
  2. 删除表格中的所有项目
  3. 运行" INSERT INTO"查询同一个表
  4. 这是我的代码:

        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 =表/对象的名称

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

    有什么想法吗?我知道答案可以这么简单。

    谢谢!

2 个答案:

答案 0 :(得分:0)

您执行查询的方式对于返回结果但不会针对操作查询的查询有效,因为它们不会返回任何内容,因此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#)

答案 1 :(得分:0)

以这种方式试试。

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