Обычно формула массива может быть способом go в таком случае, но INDIRECT
не работает внутри формул массива.
Есть несколько подходов с использованием сценариев, таких как this .
Здесь я опишу другой подход: генерация формулы . Получим строку с формулой и вручную поместим ее в ячейку. Было бы неплохо поместить его в инвертированную функцию FORMULATEXT
, но, к сожалению, на данный момент такой функции нет, поэтому мы просто вставим ее вручную.
Шаг 1
Установите ограничения по годам (названия листов) в некоторых ячейках. Первый год периода будет в K22
, а последний - в M22
.
Я установил период с 2005 по 2040 год.
Все номера года будут e легко генерируется с помощью SEQUENCE
. Если бы были произвольные имена, потребовался бы диапазон этих имен, заданных вручную.
Шаг 2
Напишите генератор формул для того, что вам нужно. Здесь мы просто генерируем строку, в которой будет формула, которую вы обычно вводите вручную. Это несложно, но повторений много, и было бы утомительно писать его вручную.
Вот генератор:
=ARRAYFORMULA(
"=SUM(
FILTER(
{
" & JOIN(
";" & CHAR(10) & " ",
"IFERROR('" & SEQUENCE(M22 - K22 + 1, 1, K22, 1) & "'!D2:D, 0)"
) & "
},
ISNUMBER(
{
" & JOIN(
";" & CHAR(10) & " ",
"IFERROR('" & SEQUENCE(M22 - K22 + 1, 1, K22, 1) & "'!D2:D, 0)"
) & "
}
),
REGEXMATCH(
{
" & JOIN(
";" & CHAR(10) & " ",
"IFERROR('" & SEQUENCE(M22 - K22 + 1, 1, K22, 1) & "'!A2:A, 0)"
) & "
},
""(?i)^TOTAL$""
),
REGEXMATCH(
{
" & JOIN(
";" & CHAR(10) & " ",
"IFERROR('" & SEQUENCE(M22 - K22 + 1, 1, K22, 1) & "'!C2:C, 0)"
) & "
},
""(?i)^"" & IF(F19 = ""Condition 1 Count"", ""Condition 1"", ""Condition 2"") & ""$""
)
)
)"
)
По сравнению с исходной формулой полученная формула сильно изменен, упрощен. Например, при этом подходе нет реальной необходимости в INDIRECT
, EOMONTH
нигде не использовалось и т. Д.
Шаг 3
Скопируйте этот результат как текст, удалите заключительные кавычки замените двойные двойные кавычки на одинарные двойные кавычки: ""
-> "
.
Теперь у нас есть формула, которую нужно вставить куда-нибудь, как мы могли бы ввести вручную. Вот его часть:
=SUM(
FILTER(
{
IFERROR('2005'!F2:F, 0);
IFERROR('2006'!F2:F, 0);
...
IFERROR('2039'!F2:F, 0);
IFERROR('2040'!F2:F, 0)
},
ISNUMBER(
{
IFERROR('2005'!F2:F, 0);
IFERROR('2006'!F2:F, 0);
...
IFERROR('2039'!F2:F, 0);
IFERROR('2040'!F2:F, 0)
}
),
REGEXMATCH(
{
IFERROR('2005'!C2:C, 0);
IFERROR('2006'!C2:C, 0);
...
IFERROR('2039'!C2:C, 0);
IFERROR('2040'!C2:C, 0)
},
"(?i)^TOTAL$"
),
REGEXMATCH(
{
IFERROR('2005'!E2:E, 0);
IFERROR('2006'!E2:E, 0);
...
IFERROR('2039'!E2:E, 0);
IFERROR('2040'!E2:E, 0)
},
"(?i)^" & IF(F19 = "Condition 1 Count", "Condition 1", "Condition 2") & "$"
)
)
)
Шаг 4
Вручную поместите полученную формулу в какую-нибудь ячейку.
Он делает то, что должен делать, выпадающие ссылки работают, несуществующие листы допускаются.
Например, 2021 листа нет, но когда он будет в ящике нет необходимости изменять формулу, будут использоваться данные из этого нового листа.
Вам нужно будет повторить процесс в двух случаях: формулу нужно изменить в logi c или почти 2040 год, и вы хотите добавить к этому периоду еще 50 лет. Тем не менее, этот процесс генерации быстрее, чем внесение изменений в получившегося монстра вручную.
Несколько примечаний к исходной формуле:
YEAR(TODAY() - 365)
➡ YEAR(TODAY()) - 1
. При вашем подходе будет ошибка из-за високосных лет. Зависит от числа лет, но в начале года обязательно появится. "select Col2 label Col2' ' "
➡ "select Col2 label Col2 ''"
. Вам действительно нужен столбец с названием заголовка ' '
(просто пробел)? Я предполагаю, что это должно было быть пустым. - Не нужно
TO_TEXT
.