在excel vba中从Access 2007运行参数查询时出错

我试图从Excel 2007 VBA脚本中运行Access 2007数据库中的查询。 Access查询具有称为“年”和“月”的参数。

我试图让下面的代码工作:

Sub RunMyQuery() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim dbPath As String Dim stQRY As String Dim stCon As String Dim cmd As New ADODB.Command Dim prmYear As New ADODB.Parameter Dim prmMonth As New ADODB.Parameter dbPath = "<PATH_TO_MY_DB>" stCon = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & dbPath & ";" cn.Open (stCon) cn.CursorLocation = adUseClient Set cmd.ActiveConnection = cn Set prmYear = cmd.CreateParameter("Year", adNumeric, adParamInput, , 2011) Set prmMonth = cmd.CreateParameter("Month", adNumeric, adParamInput, , 5) cmd.Parameters.Append prmYear cmd.Parameters.Append prmMonth cmd.CommandText = "SELECT * FROM [Month_Totals]" cmd.CommandType = adCmdTable Set rs = cmd.Execute Sheets("Sheet1").Range("A1").CopyFromRecordset rs rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub 

当我运行这个,代码停止在“cmd.Execute”与

运行时错误'-214217900(80040e14)':

FROM子句中的语法错误。

我错了什么?

  • 命令文本对我来说似乎很简单。 我错过了什么吗?

  • 我滥用ADODB.Command的参数function吗? 我不认为这是这里的问题,因为我已经试过用一个非参数化的查询来替代Month_Totals来运行这个脚本,并且得到了同样的错误。

我相信只有在访问中使用保存的查询时才能使用这些参数。 我将通过将参数移动到SQL语句来解决您的问题。

更改

 "SELECT * FROM [Month_Totals]" 

 "SELECT * FROM [Month_Totals] WHERE Year = 2011 AND Month = 5" 

这是返回错误的原因是命令types设置为adCmdtable ,但该命令不引用表,它引用一个SQLstring,所以:

 cmd.CommandType = adCmdText 

接下来,为了返回特定的数据,您需要包含一个WHERE子句,并按照正确的顺序为参数指定字段名称:

 cmd.CommandText = "SELECT * FROM [Month_Totals] Where [Year]=? AND [Month]=?"