|
|
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-Nik, 1 не понял смысла применения with 2 отказ от transpose проверял - немного давало.. 3 вот использование константы.. это мысль 4 чем не нравится on error goto erm ? :) 5 еще думал над получением текстового массива, чтобы избежать конвертации в ключ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 12:47 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ps for each тоже хотел.. но .. что-то не срослось :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2008, 12:49 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Добрый вечер, Слэн и всем! Вчера решил погуглить, где кто. Набрал Slan – попал сюда. Набрал свои три буквы - тоже тут оказался :-) Судьба, значит. Почитал, и вот за коллекции немного заступился. По вопросам: - прирост скорости дает? –> все относительно, но вроде дает - экономия памяти не актуальна –> это для небольшой экономии времени - смысл применения with –> теоретически должно быть чуть экономнее 2-х ссылок на Rng - если будет не массив –> справедливо, но не только для этого варианта ;) - избежать конвертации в текстовый ключ –> наверное, но это нужно пробовать Еще Range("CalcTime") быстрее, чем [CalcTime] А Scripting.Dictionary вообще пошустрее коллекций на больших массивах. А если с ранним связыванием, то и на малых. Компания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-) Всех - с наступающим Новым годом! ZVI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 01:00 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
приветZVI! а мы тут Вашу идею дорабатываем. :) я понимаю, что for each быстрее , чем со счетчиком - проверял. :) но в чем выигрыш от использования одного массива? да, второе обращение к диапазону я пропустил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 11:05 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
xА Scripting.Dictionary вообще пошустрее коллекций на больших массивах. А если с ранним связыванием, то и на малых. А примерчик можно в разрезе данной задачи ? ;-) Даже два - для раннего и позднего связывания :-) xКомпания здесь интересная, но с временем напряг, а там еще и планета Павлова открылась ;-) Всех - с наступающим Новым годом! ZVI Вот и подключайся :-) За поздравление - спасибо! ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 15:15 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
а мне еще чуть-чуть убыстрить удалось! :) Private Sub CommandButton3_Click() Dim l&, lm& lm = [steps] Columns(2).ClearContents Dim arr, x, c As New Collection, t As Single t = Timer On Error GoTo erm Application.ScreenUpdating = False For l = 0 To lm With Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) arr = Application.Transpose(.Value) For Each x In arr c.Add 0, CStr(x) arr(c.Count) = x erm: Resume nxt nxt: Next ReDim Preserve arr(c.Count) .Offset(, 1).Value = Application.Transpose(arr) End With Next Range("CalcTime") = Timer - t End Sub и в определенных условиях вдвое.. внешний цикл нужен для определения разницы методов с if err и goto erm goto erm выигрывает 1,5% :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 19:35 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
вот файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 19:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
исправление: ReDim Preserve arr(1 To c.Count) и выигрывает при большом количестве повторов, а при отсутствии - проигрывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 20:38 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Обещанное сравнение Dictionary и Collection. Для чистоты эксперимента общее время взаимодействия VBA на загрузку/выгрузку данных из/в таблицу Excel не учитывается. Основная часть кода также практически одинакова для этой же цели. Тестовые данные (почти случайные числа и строки) для уменьшения размера файла удалил. Жмите "Очистить" чтобы очистить старые и создать новые тестовые данные. Назначение остальных кнопок очевидно. --- ZVI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 21:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Забыл уточнить про связывание. В примере закомментируйте эту строку: With CreateObject("Scripting.Dictionary") ' Позднее связывание И раскомментируйте эту (Reference уже установлен): 'With New Dictionary ' Раннее связывание, нужен Reference на MS Scripting Runtime и почувствуйте разницу :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 21:52 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Вот это было написано Джоном Уокенбахом довольно давно. В моем Excel 2007 (под Vista) и с данными последнего примера, этот код быстрее самого быстрого из последних вариантов _slan_ в 3 раза (мне вообще не очень понятно почему все решения используют транспонирование дважды): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2008, 23:40 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Пардон, адаптация кода была с дефектом. Исправленный код дает меньший выигрыш (13%), но все же: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2008, 00:00 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
KL (XL)Вот это было написано Джоном Уокенбахом довольно давно. В моем Excel 2007 (под Vista) и с данными последнего примера, этот код быстрее самого быстрого из последних вариантов _slan_ в 3 раза (мне вообще не очень понятно почему все решения используют транспонирование дважды): ... Попробуйте использовать этот вариант на 60000 ячейках из моего примера. Получите примерно в 290 раз медленнее. чем с Dictionary с ранним связыванием. Переопределение размера массива Redim() означает reallocation memory, что при большом массиве сильно тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2008, 00:01 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Да, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 13:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) ... Так метод с ранним связыванием тоже рассмешил или порадовал? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 14:20 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
A-NikДа, KL, метод Уокенбаха, честно сказать, меня только рассмешил Кстати, метод с ранним связыванием - тоже :-) Не ожидал такой скорости работы :-) Единственное, что могу предложить, так это ещё немного оптимизировать цикл для варианта с коллекцией: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. :) я тоже уже проверил: Private Sub CommandButton2_Click() Dim l&, lm& lm = [steps] Columns(2).ClearContents Dim arr, arr2(), x, c As New Collection, t As Single, i& Application.ScreenUpdating = False t = Timer For l = 1 To lm With Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) arr = .Value ReDim arr2(1 To UBound(arr), 1 To 1) On Error GoTo erm For Each x In arr c.Add 0, CStr(x) i = i + 1 arr2(i, 1) = x erm: Resume nxt nxt: Next .Offset(, 1).Resize(c.Count) = arr2 End With Next Range("CalcTime") = Timer - t End Sub чуть быстрее, чем у ZVI, но раннему связыванию все же уступает.. вдвое примерно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:17 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
и, кстати, при увеличении числа повторов(а это, мне кажется, вполне вероятно в реальности) использование on error goto даст еще больший выигрыш ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:24 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan_, а если все это полностью на С сделать... вот только удивляюсь - почему же расширенный фильтр так тормозит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 15:27 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
ZVIТак метод с ранним связыванием тоже рассмешил или порадовал? :-)И то и другое :-) И с поздним связываением тоже :-) Ну где ещё придумаешь такое кол-во вариантов, как не в экселе! :-) Уже можно со счёту сбиться :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 16:45 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Вот чего только мозг программиста не выдумает, чтобы на нормальную СУБД не переходить! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 17:53 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
_slan__slan_, а если все это полностью на С сделать... вот только удивляюсь - почему же расширенный фильтр так тормозит? При больших масcивах и оптимизированном VBA-коде тормозит уже не VBA, а объекты Collection или Dictionary, которые. насколько я понимаю, на С++ писаны. Кстати, скорость кода, скомпилирована на С не всегда выше VBA - зависит от компилятора и от кода. Можно, например. функциями VBA написать код, который работает в 3-раза быстрее, чем встроенная в VBA (С++ компилированная) функция Replace(). На определенных тестах, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 18:33 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
интерпретация по определению не может быть быстрее компиляции.. значит разница в алгоритме.. возможно перегруженность проверками надежности.. после каждого действия assert.. :) попробовать что-ли записать алгоритм на С++ ?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 19:34 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
а с коллекциями, по-моему, все. Оптимизировано до конца: Function unic(src As Range, Optional dest As Range) As Long Dim arr, x, c As New Collection arr = src.Value On Error GoTo erm For Each x In arr c.Add 0, CStr(x) arr(c.Count, 1) = x nxt: Next On Error GoTo 0 If Not dest Is Nothing Then dest.Resize(c.Count) = arr unic = c.Count Exit Function erm: Resume nxt End Function или нет? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 20:57 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
:) а точнее так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 21:06 |
|
||
|
Узнать все доступные значения при установке автофильтра
|
|||
|---|---|---|---|
|
#18+
Возникла такая же задача. Подправил код для возврата коллекции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Compile error: Argument not optional С чем связана такая ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 12:58 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=35728081&tid=2178000]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 473ms |

| 0 / 0 |
