Приложение вычислить из VBA - игнорировать изменчивые функции - PullRequest
3 голосов
/ 14 марта 2019

Вопрос

Можно ли эффективно смоделировать результат application.calculate из VBA, но игнорируя изменчивые функции?

Деталь

Определение: энергонезависимый эквивалент: Для любой энергозависимой рабочей книги определите энергонезависимый эквивалент как рабочую книгу, в которой все ячейки с энергозависимыми ссылками были заменены их необработанными значениями.

Определение: различия в энергонезависимых вычислениях: Предположим, у нас есть какая-либо рабочая книга. Теперь предположим, что мы взяли его энергонезависимый эквивалент и сделали полный пересчет по этому вопросу. Возьмем ячейки, значения которых изменились в энергонезависимом эквиваленте, и их значения. Это энергонезависимые расчёты различий.

Вопрос задаёт это. Существует ли способ эффективного применения только нелетучих различий для любой книги с потенциальными летучими ссылками? Эффективность является ключевой здесь - это единственная причина, по которой мы стремимся игнорировать изменчивые функции - см. Пример использования ниже. Поэтому любое решение, которое не превосходит полный пересчет, бесполезно.

Вариант использования

У нас есть рабочая книга, которая используется INDIRECT. INDIRECT - нестабильная функция Excel. В книге содержится около 300 000 таких книг, в которых содержится около 1,5 миллиона использованных ячеек. У нас нет возможности изменить это. В результате этих INDIRECT использований наша Рабочая тетрадь занимает много времени для пересчета. Около 10 секунд. Таким образом, у нас отключен автоматический расчет, и пользователи периодически нажимают на калькуляцию вручную, чтобы обновить данные по ходу работы.

Наши бизнес-пользователи согласны с этим, но некоторые из новых функций VBA, которые мы добавляем, могут использовать что-то более эффективное, чем 10-секундное ожидание.

Что мы уже пробовали

  • Sheet.Calculate - это удобно в некоторых случаях. И мы используем это. Но он обрабатывает данные на всех других листах как значения, а не как формулы. Поэтому, если есть какие-либо зигзагообразные ссылки, это не дает полностью согласованного результата. Например. представьте себе ссылку из листа A -> лист B -> лист A: тогда нужно будет рассчитать лист A, затем B, затем A. Число зигзагов произвольно. И это только один случай с двумя листами. Чтобы решить эту проблему, необходимо существенно переписать весь расчет Excel.

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Есть одна вещь, которая приходит мне в голову, и она не идеальна.Возможно, вы можете сделать свою собственную функцию, которая не является изменчивой и хранится в электронной таблице, которая будет делать именно то, что делает INDIRECT (или любые формулы, которые вы используете).Вы можете назвать это INDIRECT2 или как-то, и просто заменить их функции в вашей электронной таблице.

К сожалению, эта функция недоступна для Application.WorksheetFunction.functionName, но есть способы обойти это.Это всего лишь моя общая идея.

1 голос
/ 14 марта 2019

Используйте энергонезависимую пользовательскую функцию, которая выполняет ту же работу, что и INDIRECT?

Public Function INDIRECT_NV(ByVal ref_text As String, Optional ByVal a1 As Boolean) As Variant
    'Non-volatile INDIRECT function
    'Does not accept R1C1 notation - the optional is purely for quick replacement
    INDIRECT_NV = CVErr(xlErrRef) 'Defaults to an  error message
    On Error Resume Next 'If the next line fails, just output the error
    Set INDIRECT_NV = Range(ref_text) 'Does the work of INDIRECT, but not for R1C1
End Function

В качестве альтернативы, в зависимости от варианта использования, можно использовать INDEX и * 1006.* (энергонезависимые функции) вместо INDIRECT запросов вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...