Привет, Я разрабатывал проект 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 вопроса:
Будет ли с помощью соединения DAO вместо скорости ADODB этот процесс? Если да, то как я могу повторить это в DAO?
Является ли метод, который я использую для прокрутки идентификаторов, а затем запросить эффективный? Есть ли более быстрый метод, возможно, вместо этого используется цикл «Для каждого»?
Спасибо!
Отлично работает! Принял время с 7 до 1, спасибо! –