Одним из источников замедления может быть использование функции MEDIAN
- это более дорого / медленно для вычисления, чем AVERAGE
.
В быстром и грязном тестировании моего оборудования с использованием строк по 16 КБ фиктивной даты и с Расчеты, События и Обновление экрана все включено (без ускорений), ваша формула
=IFERROR(([@[Dollar Share ]] - MEDIAN([[Dollar Share ]])) / STDEV.P([[Dollar Share ]]), "")
потребовалось 5.4 seconds
для выполнения, но когда AVERAGE
используется вместо MEDIAN
=IFERROR(([@[Dollar Share ]] - AVERAGE([[Dollar Share ]])) / STDEV.P([[Dollar Share ]]), "")
он работал в 0.8 seconds
, ускорение ~ 6,6X.
Проблема усугубляется тем, что одни и те же MEDIAN
и STDEV.P
пересчитываются (расточительно) 16K раз (по одному разу для каждой строки таблицы). Похоже, что механизм расчета Excel оптимизирует для этого. Вы должны быть в состоянии ускорить свои таблицы, вычисляя эти значения ТОЛЬКО ОДИН РАЗ и затем повторно используя.
Один из способов сделать это - добавить строку Totals
в таблицу и использовать MEDIAN
в качестве общей функции. Тогда, если ваш код:
Sheet1.ListObjects("Table1").ListColumns("Dollar Share ").DataBodyRange.Formula = "=IFERROR(([@[Dollar Share ]] - Table1[[#Totals],[Dollar Share ]]) / STDEV.P([[Dollar Share ]]), """")"
, время выполнения сокращается до 0.52 seconds
, что в 10 раз лучше. Вы также можете иметь вспомогательные ячейки на рабочем листе для хранения всех значений MEDIAN
и STDEV.P
; это должно дать еще большее ускорение.
Надеюсь, это поможет.