2017-09-01 74 views
0

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

我认为问题是我通过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 = Access数据库的路径

cRng = Excel中使用SELECT查询电池(这只是正常)

CNAME =表的名称/对象

我然后运行两个 “与目标文件” s到使用DELETE和INSERT INTO查询更新.CommandText,但这是Excel表示无法运行查询的地方。

任何想法?我知道答案可以非常简单。

谢谢!

+0

请在您的问题中包含完整的查询文字。此外,请确保您的Excel文件在单元格中没有任何非ASCII字符(Excel倾向于添加一个字符来对齐事物,一个简单的检查就是将其复制并粘贴到即时窗口中,并检查意外的问题标记)。 –

+0

它们是非常简单的查询:“SELECT * from tbl_Date”,“DELETE * from tbl_Date”,“INSERT INTO tbl_Date VALUES('7/7/2017')” – ddelpinal

回答

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#) 
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