Индекс Excel против смещения / косвенного - я не понимаю, почему смещение / косвенный быстрее в этом случае - PullRequest
6 голосов
/ 27 июня 2011

У меня настроена рабочая книга, где первая вкладка содержит список параметров. Каждый столбец представляет собой набор параметров для другого экземпляра.

Затем у меня есть шаблон для одного экземпляра, и пользователь делает много копий этого шаблона. Шаблон выполняет динамическое перетаскивание параметров с первого листа. Пользователь вводит номер столбца (от 1 до n), и этот столбец параметров извлекается из первого листа, который будет использоваться в этом экземпляре. Затем экземпляр выполняет вычисления сотен тысяч строк с использованием этих параметров.

Таблица параметров

enter image description here

Пример экземпляра

enter image description here

Моя проблема связана с волатильностью. При большом количестве экземпляров, если я использую смещение или косвенное значение для получения параметров, любое изменение в любой ячейке в рабочей книге приводит к повторному извлечению параметров на каждом листе экземпляра, и поэтому каждый лист каждый раз пересчитывается полностью, замораживать рабочую книгу примерно на 3 секунды при каждом изменении.

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

Теперь изменение случайной ячейки в рабочей книге больше не приводит к зависанию всего объекта на 3 секунды во время пересчета, но изменение релевантной ячейки в диапазоне параметров приведет к пересчету каждого листа, и займет около 10 секунд. Почему этот метод намного медленнее. Технически он должен делать то же самое, что и раньше, только при изменении соответствующего параметра.

Есть ли способ настроить это так, чтобы при изменении параметра на первом листе только листы, на которые влияет этот параметр , пересчитывали?

* Решения 1032 *

Я рассмотрел комплексное решение, включающее VBA, после чего при копировании экземпляра шаблона отслеживается его ячейка «Номер экземпляра». Когда это изменилось, код VBA мог скопировать соответствующие параметры на лист и распечатать значения здесь. Мне также нужно, чтобы VBA отслеживал событие изменения на листе основных параметров. Когда что-либо изменяется, ему нужно будет проверить номер столбца, выполнить итерацию по всем шаблонам и повторно скопировать значения, если на этот номер экземпляра ссылаются. Я хочу избежать этого решения по обычным причинам, чтобы не допустить VBA в уравнение, но это может оказаться необходимым, если нет способа сделать Excel более умным при пересчете изменений параметров.

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Проблема вызвана использованием функции индекса для заполнения значений параметра # на листах экземпляров.

При изменении значения для Param 1 в Main в любой строке экземпляра диапазон помечается какизменилось.Поскольку каждый лист экземпляра ссылается на этот диапазон для поиска значения параметра 1, все значения param 1 помечаются как измененные.Тогда все формулы Iteration #, которые ссылаются на Param 1 на всех листах, помечаются как измененные.

Не знаю, какое влияние это окажет на ваш дизайн книги, но подумайте об изменении просмотра индекса в прямой ячейке.Рекомендации.например, в ячейке Экземпляра 1 D3: =Main!B2

При подготовке этого ответа я настроил текст с событием рабочей книги для отчета о пересмотрах листа

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    MsgBox "Calc Sheet " & Sh.Name
End Sub

Я провел несколько экспериментов с различными поисками, используяIndex, Offset и другие, но не удалось найти тот, который не приводил к пересчету всех листов (это не исчерпывающий поиск, поэтому другие могут предложить решение).Единственный обнаруженный мной способ, который не позволил рассчитать все листы, был прямой ссылкой на ячейку

Процедура VBA, помогающая настроить или поддерживать параметр листов листовссылки могут быть в порядке ...

5 голосов
/ 28 июня 2011

Вот старый трюк с макросом Excel, который все еще работает:

  • Отключить автоматический пересчет
  • Выберите все ячейки, которые вы хотите пересчитать
  • Используйте функцию замены, чтобы заменить = на =
  • Это ничего не делает, но заставляет эти конкретные ячейки пересчитывать.

Довольно легко записать это как макрос и делать это регулярно.

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