2015-06-23 2 views
2

Привет, Я разрабатывал проект vba с большой помощью из примеров здесь. Я пытаюсь получить доступ к базе данных MS Access из Excel VBA и импортировать большие наборы данных (500-100 + строк) для каждого запроса.Преобразование ADODB Loop в 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 работает нормально и просто выбирает каждую транзакцию для заданного идентификатора продукта и периода времени.

Причина, по которой я использую этот тип цикла, состоит в том, что нам нужны только данные для ~ 20 продуктов за раз, и они не обязательно в последовательности, поэтому идентификаторы могут быть 1,2,4 , 7, 200, 205, 654 и т. Д.

Идентификаторы хранятся в столбце A, а затем запрос обрабатывает и вставляет каждый новый столбец в столбцы C и далее.

У меня 2 вопроса:

  1. Будет ли с помощью соединения DAO вместо скорости ADODB этот процесс? Если да, то как я могу повторить это в DAO?

  2. Является ли метод, который я использую для прокрутки идентификаторов, а затем запросить эффективный? Есть ли более быстрый метод, возможно, вместо этого используется цикл «Для каждого»?

Спасибо!

ответ

0

DAO может быть немного быстрее, но не материально. Вместо этого используйте предложение IN в вашем SQL-заявлении, поэтому вам нужно сделать это только один раз.

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

Отлично работает! Принял время с 7 до 1, спасибо! –