Вопрос
Можно ли эффективно смоделировать результат application.calculate
из VBA, но игнорируя изменчивые функции?
Деталь
Определение: энергонезависимый эквивалент. Для любой энергонезависимой книги определите энергонезависимый эквивалент как книгу, в которой все ячейки с изменчивыми ссылками заменены их необработанными значениями.
Определение: энергонезависимые различия в расчетах. Предположим, у нас есть рабочая тетрадь. Теперь предположим, что мы взяли его энергонезависимый эквивалент и полностью пересчитали его. Возьмите ячейки, значения которых изменились в энергонезависимом эквиваленте, и их значения. Это энергонезависимые расчеты.
Вопрос в этом. Есть ли способ эффективно применить только энергонезависимые различия к любой книге с потенциально изменчивыми ссылками? Ключевым моментом здесь является эффективность - именно по этой причине мы стараемся игнорировать изменчивые функции - см. Пример использования ниже. Поэтому любое решение, которое не превосходит полный перерасчет, бесполезно.
Вариант использования
У нас есть рабочая тетрадь, в которой INDIRECT
используется. INDIRECT
- это нестабильная функция Excel. В книге их около 300 000, что в общей сложности содержит около 1,5 миллиона использованных ячеек. У нас нет возможности их изменить. В результате этих INDIRECT
использований наша Рабочая книга требует много времени для перерасчета. Примерно 10 секунд. Таким образом, у нас отключен автоматический расчет, и пользователи периодически нажимают кнопку ручного пересчета, чтобы обновлять данные по мере их поступления.
Наших бизнес-пользователей это устраивает, но некоторые из новых функций VBA, которые мы добавляем, могут использовать что-то более эффективное, чем 10-секундное ожидание.
Что мы пробовали до сих пор
Sheet.Calculate
- это удобно в некоторых случаях. И мы этим пользуемся. Но он обрабатывает данные на всех других листах как значения, а не формулы. Таким образом, если есть какие-либо зигзагообразные ссылки, это не дает полностью согласованного результата. Например. представьте себе ссылку с листа A -> листа B -> листа A: тогда нужно будет вычислить лист A, затем B, затем A. Число зигзагов произвольно. И это всего лишь один случай с двумя листами. Чтобы решить эту проблему, необходимо существенно переписать весь расчет Excel.