将VBA变量传递给Access Query(Excel VBA)

时间:2016-06-24 22:55:19

标签: sql excel-vba ms-access vba excel

我是尝试用vba构建查询的新手。我试图弄清楚如何在VBA语法中传递变量。介意我愚蠢的地方?

我在下面尝试了这个,但是出现了自动化错误。我已经注意到,在播放aroudn时,如果你的语法错误就会出现自动化错误,所以希望它有点小吗?

非常感谢任何帮助

Sub GetDataFromAccess()
   Dim cmd As New ADODB.Command, rs As ADODB.Recordset
   Dim recordNum As Integer

   recordNum = 7

   cmd.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Ashleysaurus\Desktop" & "\" & "xyzmanu3.accdb"
   cmd.CommandType = adCmdText

   cmd.CommandText = "SELECT * FROM Invoice WHERE OrderNumber <" & "'" & recordNum & "'" & "ORDER BY OrderNumber ASC"

   Set rs = cmd.Execute
   Sheet1.Range("A2").CopyFromRecordset rs

   rs.Close
   cmd.ActiveConnection.Close

   Debug.Print "Done!"
End Sub

2 个答案:

答案 0 :(得分:4)

在学习构建VBA查询时,请考虑参数化查询并避免任何引号需求!在动态SQL查询中传递值时,这是跨所有语言的行业最佳实践。

Sub GetDataFromAccess()
   Dim cmd As New ADODB.Command, rs As ADODB.Recordset
   Dim recordNum As Integer

   recordNum = 7

   With cmd
       .ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                 & "Data Source=C:\Users\Ashleysaurus\Desktop" & "\" & "xyzmanu3.accdb"
       .CommandType = adCmdText
       .CommandText = "SELECT * FROM Invoice" _
                        & " WHERE OrderNumber < ? ORDER BY OrderNumber ASC"    
   End With

   cmd.Parameters.Append cmd.CreateParameter("recordNumParam", adInteger, adParamInput, 10)
   cmd.Parameters(0).Value = recordNum

   Set rs = cmd.Execute
   Sheet1.Range("A2").CopyFromRecordset rs

   rs.Close
   cmd.ActiveConnection.Close

   Debug.Print "Done!"

End Sub

答案 1 :(得分:2)

假设OrderNumber是一个数字,请不要使用引号。 还要确保在Order By:

之前有空格
cmd.CommandText = "SELECT * FROM Invoice WHERE OrderNumber <" & recordNum & " ORDER BY OrderNumber ASC"