我认为这有一个简单的答案,但我在疯狂地试图给谷歌答案。 我有一个Excel工具,可以通过VBA从Access数据库下载数据。到目前为止,除了我尝试更新数据时,所有这些工作都很好。
我认为问题是我通过QueryTable导入数据。我似乎无法获得更简单的代码来运行以下内容:
这是我的代码:
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说它无法运行查询的地方。
有什么想法吗?我知道答案可以这么简单。
谢谢!
答案 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