如何使用 VBA 动态 SQL SELECT 语句调用 MS Access 参数查询
Posted
技术标签:
【中文标题】如何使用 VBA 动态 SQL SELECT 语句调用 MS Access 参数查询【英文标题】:How to call MS Access Parameter queries using VBA dynamic SQL SELECT statements 【发布时间】:2014-02-11 21:45:51 【问题描述】:我搜索了 MSDN、***、SQLServer Central 和太多的网站,不胜枚举。几天来,我一直在尝试寻找一种在 MS Access 中使用 Excel VBA 代码中的动态 SQL SELECT 语句执行参数查询的方法。我使用的系统与 SQL Server TVF 配合得非常好,但由于失去服务器支持,我必须将其转换为 Access。 VBA 代码首先循环遍历 Excel 中的“输入”表,以获取用于构建动态 SQL SELECT 语句的参数值和函数/查询名称。下面是构建连接并为仅需要 1 个输入参数的查询之一(有 20 个)调用 Access Query 的代码:
Dim strSQL
' set up our connection
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\PathToDB Tables 2013-12-13.accdb;"
Set conn = CreateObject("ADODB.Connection")
conn.Open strConnection
' open the view and create the report
Set rs = CreateObject("ADODB.recordset")
Application.ODBCTimeout = 0
conn.CommandTimeout = 0
strSQL = "select * FROM "
strSQL = strSQL & strFunction
strSQL = strSQL & " (" & strParameters & ");"
'strSQL = strSQL & strOrderBy
rs.Open strSQL, conn
此时strSQL中的值为SELECT * FROM Report_1_2_StaffAdds (#12/31/2013#);
错误发生在 rs.Open strSQL, conn 行 带有错误消息“FROM 子句中的语法错误。”
这是 MS Access 查询:(查询名称是 Report_1_2_StaffAdds)
PARAMETERS [previous_month] DateTime;
SELECT [1_2_StaffAddsPart1].Unit, [1_2_StaffAddsPart1].Role, [1_2_StaffAddsPart1].Start_Date, [1_2_StaffAddsPart2].First_Worked, [1_2_StaffAddsPart2].Last_Worked, [1_2_StaffAddsPart1].Emp_Name, [1_2_StaffAddsPart1].Emp_Id, [1_2_StaffAddsPart2].Hours_to_Date
FROM 1_2_StaffAddsPart1 INNER JOIN 1_2_StaffAddsPart2 ON [1_2_StaffAddsPart1].Emp_Id = [1_2_StaffAddsPart2].Emp_Id;
任何帮助将不胜感激。我相信如果我能得到答案,我可以修改它以包含最多 3 个输入参数,具体取决于在给定时间执行的 Access 查询。
【问题讨论】:
user3299120,请在发布问题后尝试确保您的代码已格式化 为您的问题添加了 MS-Access 标签,让合适的人查看您的问题 【参考方案1】:在我看来,您正试图在包含您的 SELECT
语句的字符串中包含参数值。但是,我不确定我是否理解你想要做什么,所以我会为你提供一个简单的测试参数查询,它会从 ADODB.Command
对象打开一个记录集。
这是下面代码的即时窗口输出:
PARAMETERS which_date DateTime;
SELECT * FROM tblFoo
WHERE datetime_field = [which_date];
id datetime_field
27 2/11/2014 10:16:58 AM
代码:
Dim cmd As Object ' ADODB.Command
Dim conn As Object ' ADODB.Connection
Dim rs As Object ' ADODB.Recordset
Dim strConnection As String
Dim strSql As String
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\share\Access\database1.mdb;"
Set conn = CreateObject("ADODB.Connection")
conn.Open strConnection
strSql = "PARAMETERS which_date DateTime;" & vbCrLf & _
"SELECT * FROM tblFoo" & vbCrLf & _
"WHERE datetime_field = [which_date];"
Debug.Print strSql
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = strSql
Set rs = cmd.Execute(, CDate("2/11/2014 10:16:58 AM"))
With rs
If Not (.BOF And .EOF) Then
Debug.Print "id", "datetime_field"
Debug.Print !id, !datetime_field
End If
.Close
End With
【讨论】:
非常感谢HansUp!我要试一试,我会再次发帖让你知道。仅供参考,所有过滤和处理都是由数据库中的多个查询完成的,因为参数(都是日期)被传入,因此一个简单的 select 语句可以提取正确的记录集。再次感谢! HansUp,这就像一个魅力。我做了一点修改,所以它会使用引用变量,但你让我很开心!非常感谢你!!这表明我需要更多地学习 ADO/DAO 编程!!以上是关于如何使用 VBA 动态 SQL SELECT 语句调用 MS Access 参数查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VBA 访问的子窗体中显示 Select SQL 语句的结果?
在access中用vba如何把SQL语句查询到的一个值赋给变量?