自从创建此线程以来已经很长时间了。如果我理解正确,我可能会添加一些有用的东西。我已经为 OP 描述的内容命名,即使用保存在 ACCDB 中的查询中的 SQL 以通过 DAO 或 ADOBD 在 VBA 中运行的过程。我给它起的名字是“对象属性提供者”,即使在我的笔记中有首字母缩写词 OPP,对象名称前缀/后缀也是如此。
这个想法是 ACCDB 中的现有对象(通常是查询)提供了您需要在 VBA 中使用的属性(通常是 SQL)。我拼凑了一个函数,只是为了从查询中吸出 SQL;见下文。预警:抱歉,不过这都是在DAO,我对ADODB用处不大。希望您仍然会发现这些想法很有用。
我什至设计了一种在来自这些 OPP 查询的 SQL 中使用/插入可替换参数的方法。然后我在 VBA 中使用 SQL 之前使用 VBA.Replace() 进行替换。
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