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

时间:2013-01-18 13:08:22

标签: vba excel-vba ms-access-2007 adodb excel

访问保存了一个使用名为“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语句

5 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:0)

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

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

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

答案 3 :(得分:0)

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

sqlQuery = "SELECT * FROM QueryName;"

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

答案 4 :(得分: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
相关问题