Новости:

Из правил форума: Тема должна отражать суть вопроса, топики типа "help please" будут удаляться!

Главное меню

Быстродействие вычислений в excel

Автор silentland, 13.08.2011, 20:13

« назад - далее »

silentland

Понял в чем была ошибка, но не понял почему. У меня первая ячейка диапазона была пустой. Заполнил — и вся сразу заработало.

Serge 007

Цитата: silentland от 14.08.2011, 00:25
Понял в чем была ошибка, но не понял почему. У меня первая ячейка диапазона была пустой. Заполнил — и вся сразу заработало.
Надо видеть файл.
Иначе точно определить "Почему?" невозможно.
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

silentland

Цитата: Serge 007 от 14.08.2011, 00:32
Надо видеть файл.
Иначе точно определить "Почему?" невозможно.

Для вашего файла это тоже справедливо. Если перемещаю единичку из первой строки во вторую, то сумма так же обнуляется.

P.S. Провел эксперимент: скопировал свою монструозную формулу в 5 ячеек, засек время обновления: 7,95 с.
Добавил в формулы проверку на пустоту ячеек и повторил эксперимент: 7,98 с.
Как-то неэффективно :-)

Serge 007

Цитата: silentland от 14.08.2011, 00:39
Для вашего файла это тоже справедливо. Если перемещаю единичку из первой строки во вторую, то сумма так же обнуляется.
Я же выложил другую формулу:
=СУММПРОИЗВ((A1:A3<>"")*A1:A3)
Если очень надо именно формулу массива то:
=СУММ(ЕСЛИ(ЕПУСТО(A1:A3);;A1:A3))

Цитата: silentland от 14.08.2011, 00:39
P.S. Провел эксперимент: скопировал свою монструозную формулу в 5 ячеек, засек время обновления: 7,95 с.
Добавил в формулы проверку на пустоту ячеек и повторил эксперимент: 7,98 с.
Как-то неэффективно :-)
Смотря как делали. Всё зависит от порядка выполнения операторов. Я его не знаю, но если Вы выложите то с чем экспериментировали, то посмотрим.
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

silentland

Вложил файл.

Монструозная формула массива в желтой ячейке. Знак равенства специально не стал ставить, чтобы не висло

Serge 007

Так это обе - формулы массива!
Я уже писал ранее - они работают со всем указанным массивом, поэтому тут разницы особенно не будет :(
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

silentland

#21
Цитата: Serge 007 от 14.08.2011, 01:14
Так это обе - формулы массива!
Я уже писал ранее - они работают со всем указанным массивом, поэтому тут разницы особенно не будет :(

Получается, что для формул в фигурных скобках проверки на пустоту не годятся? Жалко.

...

Чего-то я запутался. А чем моя формула {=G15-СУММ(...;...;...)} хуже =СУММПРОИЗВ((A1:A3<>"")*A1:A3) или {=G15-СУММПРОИЗВ((A1:A∞<>"")*...;...;...)}?

...

Сделал по-другому. Проблему, конечно, не решил, но все же.
Забил ключевые массивы в Диспетчер имен. Теперь, если значений станет много, их размер можно будет увеличить или, наоборот, уменьшить при тормозах.

silentland

Кстати, чем отличается функция ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;...) от СУММ? Работает быстрее? Вообще, зачем введена эта функция?

Serge 007

Цитата: silentland от 14.08.2011, 17:23
Кстати, чем отличается функция ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;...) от СУММ? Работает быстрее? Вообще, зачем введена эта функция?
СУММ может только суммировать, причём только указанный диапазон, а ПРОМ.ИТОГИ - функционала завались.
Подробнее см. здесь: http://www.excelworld.ru/publ/funcs/math/subtotal/12-1-0-95

ЗЫ Кстати, функция ПРОМ.ИТОГИ - единственная в Excel до версии 2010, которая различает скрытые и не скрытые строки.
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

silentland

Еще вопрос про быстродействие.

Во многих формулах у меня используется конструкция типа:

СУММЕСЛИМН(Цена;Кредит;"="&К;Контрагент;"="&КА)-СУММЕСЛИМН(Цена;Дебет;"="&К;Контрагент;"="&КА)

которая естественно все время пересчитывается.

Если её забить в диспетчер имен станет ли быстрее?

Serge 007

Цитата: silentland от 16.08.2011, 18:14
...которая естественно все время пересчитывается...

Если её забить в диспетчер имен станет ли быстрее?
1. Почему Вы решили что она пересчитывается? СУММЕСЛИМН сама по себе не волатильная. И если имена Цена, Дебет и Контрагент не содержат в себе "летучих" функций, то и вся формула тоже пересчитываться будет только при изменениях в диапазонах формулы.
2. Нет. Сам не проверял, доверяю Уокенбаху :)
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

kimtan

#26
1. СУММЕСЛИМН(), впрочем как и СУММЕСЛИ() сама по себе может стать "летучей" в тех редких случаях, когда задаются неравные по размерности диапазоны и функции приходится самой "додумывать" размерность.
2. Скорее всего станет еще медленнее  :)
P.S. В примере "летучая" СУММЕСЛИ()
Webmoney: E350157549801 Z116603216205 R268084006579

silentland

Немного другое имел в виду.

Например, у меня есть формула =(A*B+A*B-A*B*A*B) и эта формула забита в 5000 ячеек. Естественно, выражение A*B в каждой ячейке будет считаться заново.
Если же A*B я обзову в диспетчере X это означает, что тогда A*B будет вычислено 1 раз, а в 5000 ячеек будет использоваться просто константа X: (X+X-X*X)?

kimtan

Мы поняли, что Вы имели ввиду.
Специально для Вас сделал просчет по последним приведенным данным (прикладывать его здесь не буду, по понятным причинам - прийдется поверить мне на слово)
Итак: 5000 ячеек - время пересчёта без имен - 5,72 миллисекунды, а с именами 8,9 миллисекунд.
Делайте выводы...
Webmoney: E350157549801 Z116603216205 R268084006579

silentland

Да уж... И тут Эксель не даст убыстрить.

5,72 миллисекунды... Как вы такие промежутки засекаете?