2015-06-23 67 views
2

您好我一直在開發一個vba項目,這裏有很多來自示例的幫助。我試圖從Excel VBA訪問一個MS Access數據庫,併爲每個請求導入大型數據集(500-100 +行)。將ADODB循環轉換爲DAO

目前,以下循環使用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」循環?

謝謝!

回答

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 
+0

很好用!花了7s到1的時間,謝謝! –