我是尝试用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
答案 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"