您好我一直在开发一个vba项目,其中有很多示例帮助。我正在尝试从Excel VBA访问MS Access数据库,并为每个请求导入大型数据集(500-100 +行)。
目前,以下循环使用ADODB,但是Range(“”)。Copyfromrecordset行每个请求花费大约7秒钟。
Public Sub BC_Data()
Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim strCon, SQL As String
Dim ID As Integer
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...\Database.accdb;"
cn.Open strCon
For i = 0 To n
ID = Range("A2").Offset(i, 0).Value
SQL = "SELECT [Sales] WHERE [ID] = " & ID & _
" AND [Date] >= #" & [A1].Text & "# AND [Date] <= #" & _
[B1].Text & "#;"
rs.Open SQL, cn
Range("C2").Offset(0, i).CopyFromRecordset rs
rs.Close
Next
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
SQL工作正常,只是为给定的产品ID和时间段选择每个事务。
我使用这种循环的原因是我们一次只想要约20个产品的数据,并且它们不一定是序列中的ID,因此ID可以是1,2,4, 7,200,205,654等。
ID存储在A列中,然后请求循环并将每个新列粘贴到C列以上。
我有两个问题:
使用DAO连接代替ADODB会加快此过程吗?如果是这样,我将如何在DAO中复制此内容?
我正在使用的方法循环访问ID,然后请求有效的ID吗?是否有更快的方法,可能使用“For each”循环代替?
谢谢!
答案 0 :(得分:0)
Sub test()
Dim vaIds As Variant
Dim sSql As String
vaIds = Split("1 2 4 7 200 205 654", Space(1))
sSql = "SELECT [Sales] WHERE [ID] In(" & Join(vaIds, ",") & ")" & _
" AND [Date] >= #" & [A1].Text & "# AND [Date] <= #" & _
[B1].Text & "#;"
Debug.Print sSql
End Sub