将ADODB循环转换为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和时间段select每个事务。

我使用这种循环的原因是,我们只需要一次约20个产品的数据,它们不一定是一个序列,所以ID可以是1,2,4,7,200 ,205,654等

这些ID存储在列A中,然后请求循环并粘贴列C中的每个新列。

我有两个问题:

  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