将ADODB循环转换为DAO

时间:2015-06-23 13:30:35

标签: excel vba ms-access ado dao

您好我一直在开发一个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列以上。

我有两个问题:

  1. 使用DAO连接代替ADODB会加快此过程吗?如果是这样,我将如何在DAO中复制此内容?

  2. 我正在使用的方法循环访问ID,然后请求有效的ID吗?是否有更快的方法,可能使用“For each”循环代替?

  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

DAO可能会快一点,但不是很重要。相反,在SQL语句中使用IN子句,因此您只需执行一次。

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