|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Всем добрый день! Вопрос по функциям в VBA: есть пользовательская функция, которая используется в книге много-много раз. Так вот, эта функция пересчитывается каждый раз для всех ячеек. И занимает это порядка 10 секунд. Можно ли как-то сократить это время? Ведь при работе с книгой при любом изменении начинается этот длительный пересчет формул.... Привожу текст функции: Код: vbnet 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. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 14:43 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Уберите её из формул и повесьте на кнопку. Саму кнопку делайте неактивной по нажатию (запуску пересчёта), а активной - по любому изменению в диапазоне (worksheet_change, проверяйте target), который влияет на результат расчёта. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 15:24 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Странная у вас функция, дублирующая имеющийся функционал... Нельзя было воспользоваться формулами листа - ВПР() или массивной ИНДЕКС(ПОИСКПОЗ(... ? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 15:26 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
AndreTM, ВПР тут неподойдет, значение d_excel - это число, его нельзя найти в таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 15:31 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Akina, как вариант. но интересно, можно ли как-то решить проблему по скорости, ведь внутренние функции excel не вызывают такой задержки ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 15:33 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
skleppiВПР тут неподойдет, значение d_excel - это число, его нельзя найти в таблицеВ смысле "нельзя найти"? Вы же его в функцию откуда-то передаёте? Может, вы не так поняли? Если в A1 находится type , в B1 - d_excel , в C1, например, пишем: Код: vbnet 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 16:10 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
AndreTM, понятно)) да, можно так, но есть желание упростить эту громоздкую формулу ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 16:43 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
skleppiесть желание упростить эту громоздкую формулу В Вашем коде 798 знаков, в формуле AndreTM - 89 Вот так упрощение ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 16:47 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Serge 007, ну упростить с точки зрения использования в книге ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 16:56 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Упростить чем? Дополнительным распределением памяти под массивы? Затратами на заполнение этих массивов? Прямым поиском в неотсортированном массиве? Тем более, что, как и говорилось, можно воспользоваться ПОИСКПОЗ() , а дальше - работать с индексами строк/столбцов. Впрочем, если действительно хочется собственный алгоритм... Можно сделать так: - При заполнении source_sheet - сортируйте табличку по type . Еще лучше - сделать уникальные числовые коды для символьных type , и сортировать уже по ним. - Массив type-coef можно (нужно!) хранить глобально в процессе работы, а не считывать каждый раз. (Пере)создавать его надо только при запуске и после изменений на листе source_sheet . - Поиск значения в отсортированном массиве проще выполнять методом половинного деления интервала, а не последовательным перебором. - И вообще, вместо массива можно создавать и хранить коллекцию, а при наличии уникальных идентификаторов - еще и в виде сбалансированного дерева. Соответственно, и поиск выполнять методами самого класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:02 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
упростить впр макросом.. поржал отдуши ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:13 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
PlanB, угу, так смешно ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:19 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
AndreTM, спасибо за развернутый ответ, попробую поменять свой алгоритм ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:21 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
PlanB , не, ну смысл имеет. Когда формула должна применяться в любых случайных местах листа с расчетами (т.е. простым копированием - надоест), а формул много. Когда диапазон "справочника" динамический. Хотя именованные диапазоны никто не отменял. Когда хочется сэкономить объем файла (то, что ТС подразумевала под "громоздкостью"). Когда, наконец, хочется просто покреативить ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:28 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
> упростить с точки зрения использования в книге Если функция используется в одном столбце, создайте имя-функцию из формулы AndreTM. Если в разных местах, то "переведите" формулу на VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:28 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
Но вообще странно, что при ЛЮБОМ изменении начинается пересчёт... ибо я в упор не вижу Application.Volatile ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 17:50 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
AndreTM, а как поможет индексирование, если всё равно поиск идет по названию? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 18:00 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
skleppi, Так ведь каждый индекс будет соответствовать одному конкретному "названию" И вообще-то, String тоже можно отсортировать, ведь суть-то "половинного интервала" только в том, что мы сравниваем искомое со значением в списке, а для отсортированного списка - мы однозначно можем сделать вывод - передвигаться нам для продолжения поиска к предыдущему интервалу, или к следующему. Просто с числами - проще, быстрее и понятнее. Да и просто - дайте уж вашу source_sheet , и покажу, как и что можно сделать... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 18:49 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
skleppiа как поможет индексирование, если всё равно поиск идет по названию?Раз у вас source_sheet - некий "справочник", то зачем вам на рабочем(их) листе(ах) использовать именно названия, а не их коды? Всё же просто - к справочнику привязывается List/Combo, и юзер выбирает значение из списка. При этом юзеру демонстрируется "наименование", а реально на лист пишется код/индекс. Ну и наименование, если надо... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2012, 18:56 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
AndreTM, вот такой source_sheet ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2012, 11:05 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
случайно отправила без файла)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2012, 11:06 |
|
Function (VBA) - расчет
|
|||
---|---|---|---|
#18+
А зачем вам одинаковые type с разными коэффициентами? - ведь вы ищете только первые в списке коэффициентов... А если, действительно, коэффициенты множественные - то по какому же признаку определять, которые из коэффициентов использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2012, 18:56 |
|
|
start [/forum/topic.php?fid=61&msg=37919859&tid=2175456]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 315ms |
total: | 442ms |
0 / 0 |