如何使用VBAdynamicSQL SELECT语句调用MS Access参数查询

我search了MSDN,StackOverflow,SQLServer Central和太多的网站提及。 我一直在尝试几天find一种方法来执行MS Access中的参数查询使用Excel VBA代码中的dynamicSQL SELECT语句。 我使用的系统在SQL Server TVF上工作得非常好,但由于失去了服务器支持,我必须将其转换为Access。 VBA代码首先循环访问Excel中的一个“input”工作表,选取用于构builddynamicSQL SELECT语句的参数值和函数/查询名称。 下面是构build连接的代码,并且仅为需要1个input参数之一的查询(有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行中发生错误。打开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个input参数,取决于在给定的时间执行哪个访问查询。

它看起来像你试图包含在你的SELECT语句的string中的参数值。 但是,我不确定我是否理解你要做什么,所以我会为你提供一个简单的testing参数查询,它从ADODB.Command对象打开一个logging集。

这是从下面的代码立即窗口输出:

 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