将 ADODB 循环转换为 DAO

Converting ADODB Loop into 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 可以是 1,2, 4、7、200、205、654 等

ID 存储在 A 列中,然后请求循环遍历并将每个新列粘贴到 C 列中。

我有 2 个问题:

  1. 使用 DAO 连接而不是 ADODB 会加速这个过程吗?如果是这样,我将如何在 DAO 中复制它?

  2. 我使用的方法是循环遍历 ID 然后请求一个有效的方法吗?有没有更快的方法,也许改用 "For each" 循环?

谢谢!

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