День добрый всем.
Вопрос скорее теоретический, поэтому пока без примера.
Недавно решал задачку на множественное приложение фильтров к набору данных. Excel 2003
По итогам работы нужно было получить суммы по отфильтрованным записям, при этом количество примененных фильтров - несколько тысяч (перебор различных границ интервалов). То есть, сами отфильтрованные записи не нужны, нужно получить лишь несколько чисел (суммы) для каждого из вариантов фильтров.
Для реализации выбрал следующую схему:
Данные на листе, делаем ADODB.Connection
Запускаем циклы перебора параметров фильтров
В цикле делаем Recordset.Open cо сборной строкой constr типа:
где t1, t2, m1, m2 - это параметры фильтрации
То есть, на каждом шагу цикла открываем Recordset с итоговыми функциями в строке запроса, выгружаем результат, закрываем Recordset
По идее, скорость работы макроса должна зависеть больше от количества циклов, но при увеличении количества записей в исходной базе данных без изменения количества прилагаемых фильтров, скорость уменьшилась практически кратно.
Похоже, на каждом этапе получение итоговых функций требует время, более-менее кратное количеству записей в исходном массиве.
Так как ADODB я только овладеваю, то пара вопросов:
1) Как можно ускорить работу макроса - у меня большие сомнения относительно целесообразности Open/Close для Recordset столько раз. Но строка запроса каждый раз отличается. Может быть, есть какие-то приемы для работы с ADODB, чтобы не заниматься "хлопанием дверями"?
2) не будет ли быстрее в данном случае гонять массив, проверяя условия на каждой записи? В принципе, оправдано ли применение ADODB для такой задачи?
Спасибки
Вопрос скорее теоретический, поэтому пока без примера.
Недавно решал задачку на множественное приложение фильтров к набору данных. Excel 2003
По итогам работы нужно было получить суммы по отфильтрованным записям, при этом количество примененных фильтров - несколько тысяч (перебор различных границ интервалов). То есть, сами отфильтрованные записи не нужны, нужно получить лишь несколько чисел (суммы) для каждого из вариантов фильтров.
Для реализации выбрал следующую схему:
Данные на листе, делаем ADODB.Connection
Код |
---|
Set oBase = CreateObject("ADODB.Connection") oBase.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & _ ";Extended Properties='Excel 8.0;HDR=YES';" Set oRS = CreateObject("ADODB.Recordset") |
Запускаем циклы перебора параметров фильтров
В цикле делаем Recordset.Open cо сборной строкой constr типа:
Код |
---|
"Select COUNT([Поле 1]),SUM([Поле 2]),SUM([Поле 3]),SUM([Поле 4]) FROM [База$] Where HField & " >= " & t1 & " AND " & HField & " < " & t2 AND " & SField & " >= " & m1 & " AND " & SField & "< " & m2 |
где t1, t2, m1, m2 - это параметры фильтрации
Код |
---|
oRS.Open constr, oBase ... ' выгружаю результат в итоговый массив oRS.Close Next m2, m1, t2, t1 ' берем другие параметры фильтрации |
То есть, на каждом шагу цикла открываем Recordset с итоговыми функциями в строке запроса, выгружаем результат, закрываем Recordset
По идее, скорость работы макроса должна зависеть больше от количества циклов, но при увеличении количества записей в исходной базе данных без изменения количества прилагаемых фильтров, скорость уменьшилась практически кратно.
Похоже, на каждом этапе получение итоговых функций требует время, более-менее кратное количеству записей в исходном массиве.
Так как ADODB я только овладеваю, то пара вопросов:
1) Как можно ускорить работу макроса - у меня большие сомнения относительно целесообразности Open/Close для Recordset столько раз. Но строка запроса каждый раз отличается. Может быть, есть какие-то приемы для работы с ADODB, чтобы не заниматься "хлопанием дверями"?
2) не будет ли быстрее в данном случае гонять массив, проверяя условия на каждой записи? В принципе, оправдано ли применение ADODB для такой задачи?
Спасибки
F1 творит чудеса