Excel (2016). Предположим, у меня есть часть Excel в AnalysisSheet который анализирует данные в каком-то другом листе данных. И предположим следующее:

  1. На самом деле таких листов несколько. Например, они могут быть названы MayData , JunData , JulData , и так далее.

  2. Все технические данные идентичны по формату; только их данные разные. Например, это может быть один и тот же финансовый отчет за разные месяцы

  3. AnalysisSheet только когда-либо смотрит на один из листов данных за один раз. В любой точке «использования» он анализирует ЛИБО MayData , ИЛИ ЖЕ JunData , ИЛИ ЖЕ JulData , и т.п.

  4. Таблицы данных могут быть в той же книге, что и AnalysisSheet или они могут быть в другой отдельной рабочей книге, или они могут быть распределены по ряду других рабочих книг, или их комбинации

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

ВОПРОС : В чистом Excel (то есть без VB и без сторонних надстроек), Как мне минимизировать работу, необходимую для того, чтобы пользователь SheetAnalyze изменить, из каких данных берутся данные?


Как я сейчас это делаю

Я использую INDIRECT () для динамического построения ссылок на требуемый лист данных. Так, например, в AnalysisSheet У меня может быть следующее:

B1 = "MayData" (то есть имя листа, содержащего данные)

B2 = "MayReport.xlsx" (т. Е. Имя книги, содержащей таблицу данных; это поле остается пустым, если таблица данных находится в той же книге, что и AnalysisSheet )

B3 = "C23" (например, то есть название некоторой интересующей ячейки в листе данных)

И тогда у меня будет что-то вроде этого в B4:

B4 = CONCATENATE ("'", IF (ISBLANK (B2), "", CONCATENATE ("[", B2, "]")), B1, "'!", B3)

Последний в этом примере создает строку: '[MayReport.xlsx] MayData'! C23

Затем я могу использовать это в INDIRECT () для правильного анализа. Итак, чтобы посмотреть на эту конкретную камеру, я мог бы иметь;

B5 = НЕПРЯМОЙ (B4) (см. Примечание **)

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

Все, что мне нужно сделать, чтобы изменить, какие данные просматриваются, это изменить ячейки B1 и B2. И если я буду осторожен с вещами, я мог бы сократить его до изменения только названия месяца (в этом примере), а затем построить даже то, что в B1 и B2 для этого.

ПРОБЛЕМА В том, что INDIRECT () является изменчивым! В результате, когда набор данных большой и, возможно, происходит много подобных вещей, производительность снижается. В худшем случае, я обнаружил, что мне нужно подождать несколько минут для единственного изменения в одной ячейке в AnalysisSheet , в то время как Excel перебирает каждую функцию INDIRECT () и перезапускает ее. Внизу в области состояния в правом нижнем углу моего листа я вижу, как загружается центральный процессор на всех узлах.

Буду признателен за любые идеи.


** Конечно, как правило, я бы не просто пошел на одну клетку. Вместо этого я бы вытащил одну или несколько целых таблиц из целевого листа данных в лист или листы в той же книге, что и AnalysisSheet , Оттуда все остальное может использовать ссылки на эту локальную версию данных.

tkp
источник