通过VBA中的Excel查询从Access执行查询

问题描述 投票:2回答:5

Access已保存使用名为“myQuery”的查询构建器设计的查询。数据库通过ODBC连接连接到系统。宏全部启用。

Excel已建立ADODB连接以通过连接到数据库

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
With con
 .Provider = "Microsoft.ACE.OLEDB.12.0"
 .Open "MyDatabase.accdb"
End With

通常你会继续编写你的SQL,这完全没问题,然后就像做一样

Dim sqlQuery As String
sqlQuery = "SELECT * FROM myTable"
Set rs = New ADODB.Recordset
rs.Open sqlQuery, con, ...

但我想访问我在访问数据库中保存的查询。那么如何在刚刚连接的数据库中调用已保存的查询。

已经尝试过

  1. con.Execute(“EXEC myQuery”)但是那个人告诉我它无法找到myQuery。
  2. rs。打开“myQuery”,con但是那个是无效的并且需要SELECT / etc语句
vba excel-vba ms-access-2007 adodb excel
5个回答
6
投票

我认为你可以像对待存储过程一样对待它。

如果我们在Dim sqlQuery As String之前开始

 Dim cmd as new ADODB.Command
 cmd.CommandType = adCmdStoredProc
 cmd.CommandText = "myQuery"
 cmd.ActiveConnection = con

 Set rs = cmd.Execute()

然后在此之后启动记录集工作。


1
投票

你快到了:

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
With con
 .Provider = "Microsoft.ACE.OLEDB.12.0"
 .Open "z:\docs\MyDatabase.accdb"
End With
con.Execute "MyQuery"

离开Exec吧。

您也可以添加参数,这有点旧,但应该有所帮助:update 2 fields in Access database with Excel data and probably a Macro


0
投票

我能够使用以下命令运行已保存在Access中的更新查询:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

这给了我错误,直到我用Access数据库和execute语句中的下划线替换查询名称中的空格。


0
投票

这是一种黑客工作,但您可以查询查询。也就是说,用以下代码替换你的sql字符串:

sqlQuery = "SELECT * FROM QueryName;"

在运行此之前,必须确保已保存Access数据库,即。按Ctrl + S(查询在Access中运行是不够的)。


0
投票

自创建此线程以来已经很久了。如果我理解正确,我可能会添加一些有用的东西。我已经给出了OP描述的名称,即从保存在ACCDB中的查询中使用SQL通过DAO或ADOBD在VBA中运行的过程。我给它的名字是“对象属性提供者”,即使我的笔记中有首字母缩略词OPP,也有对象名称前缀/后缀。

这个想法是ACCDB中的现有对象(通常是查询)提供了您需要在VBA中使用的属性(通常是SQL)。我打了一个函数只是为了从这个查询中抽出SQL;见下文。预警:对不起,但这完全是DAO,我对ADODB没什么用处。希望你仍然会发现这些想法很有用。

我甚至设计了一种在来自这些OPP查询的SQL中使用/插入可替换参数的方法。然后我使用VBA.Replace()在我在VBA中使用SQL之前进行替换。

ACCDB中查询的SQL的DAO对象路径如下:

mySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

我使用可替换参数的方法是评估需要替换的内容,并为实际数据库中可能不存在的参数选择一个不寻常的名称。在大多数情况下,我所做的唯一替换是字段或表名,或WHERE和HAVING子句的表达式。所以我将它们命名为“{ReplaceMe00000001}”,然后使用Replace()函数来完成工作......

sqlText = VBA.Replace(sqlText, "{ReplaceMe00000001}", "SomeActualParameter")

...然后在VBA中使用sqlText。这是一个有效的例子:

Public Function MySqlThing()
    Dim sqlText as String
    Dim myParamater as String
    Dim myExpression as String

    'Set everything up.
    sqlText = getSqlTextFromQuery("myQuery")
    myParameter = "{ReplaceMe00000001}"
    myExpression = "SomeDateOrSomething12/31/2017"

    'Do the replacement.
    sqlText = VBA.Replace(sqlText, myParameter, myExpression)

    'Then use the SQL.
    db.Execute sqlText, dbFailOnError
End Function

Function getSqlTextFromQuery(ByVal oppName As String) As String

    Dim app As Access.Application
    Dim db As DAO.Database
    Dim qdefs As DAO.QueryDefs
    Dim qdef As DAO.QueryDef
    Dim sqlText As String

    Set app = Access.Application
    Set db = app.CurrentDb
    Set qdefs = db.QueryDefs
    Set qdef = qdefs(oppName)

    oppGetSqlText = qdef.SQL

End Function
© www.soinside.com 2019 - 2024. All rights reserved.