
Рассмотрим следующий вымышленный пример диапазона ячеек, которые представляют ежемесячные подсчеты чего-либо за ряд лет, и ведущий столбец со сводкой, например:
.|A |B |C |D |E |F |G |H |I |J |K |...
-+-----+-------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
1| |Most/3M|Jan19|Feb19|Mar19|Apr19|May19|Jun19|Jul19|Aug19|Sep19|...
2|Foo | 14| 1| 3| 7| 3| 4| 2| 1| 3| 1|...
3|Bar | 13| 3| 4| 1| 2| 2| 2| 9| 1| 1|...
4|Baz | 18| 2| 3| 8| 7| 3| 2| 3| 7| 1|...
Этот итоговый столбец B:B
представляет собой наивысшее количество за любой трехмесячный период, которое рассчитываетсянаивнос использованием:
=MAX(SUM($C2:$E2),SUM($D2:$F2),SUM($E2:$G2),
SUM($F2:$H2),SUM($G2:$I2),SUM($H2:$J2),
SUM($I2:$K2))
...а затем заполняются, но поддерживать это довольно раздражающе — поскольку значения добавляются в самую правую часть, например, L:L
, M:M
, формулу приходится обновлять с помощью SUM($J2:$L2)
и SUM($K2:$M2)
и т. д.
Одна из альтернатив:
={LARGE(($C2:$I2 + $D2:$J2 + $E2:$K2), 1)}
...что не такдовольнонастолько плохо, что изменение :$I2
на :$J2
, :$J2
на :$K2
и :$K2
на :$L2
является разумным для трехмесячного окна, и это само по себе может быть получено с ужасающим использованием INDIRECT
, как указано в:
={LARGE(INDIRECT("R[0]C3:R[0]C"&COUNTA(OFFSET($C2,0,0,1,2000)),FALSE)+
INDIRECT("R[0]C4:R[0]C"&COUNTA(OFFSET($C2,0,0,1,2000))+1,FALSE)+
INDIRECT("R[0]C5:R[0]C"&COUNTA(OFFSET($C2,0,0,1,2000))+2,FALSE), 1)}
Однако это становится проблематичным по мере увеличения размера окна (т. е. необходимости добавлять все больше и больше +
предложений) и/или если размер окна должен быть настраиваемым, например, на основе значения B1
(которое на самом деле является просто значением 3
с пользовательским числовым форматом "Most/"0"M"
).
Я подумал, что, возможно, есть один из вариантов:
={MAX(SUM(OFFSET($C2:$I2,0,0,1,3)))}
={LARGE(SUM(OFFSET($C2:$I2,0,0,1,3)), 1)}
...где мне нужно было бы только обновить диапазон и размер группы, заданные для OFFSET
, с намерением в конечном итоге динамически вывести это, например, используя другой ужасный INDIRECT
, такой как:
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C"&
(COUNTA(OFFSET($C2,0,0,1,2000))+COLUMN($C:$C)-B$1),
FALSE),
0,0,1,B$1)),
1)
Когда используешьОценить формулучтобы пройти через вышеуказанное чудовище внормальныйформе, я нахожу, что это действительно в конечном итоге сводится к следующему:
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C"&(9+3-B$1),FALSE),0,0,1,3)),1)
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C"&(12-3),FALSE),0,0,1,3)),1)
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C9",FALSE),0,0,1,3)),1)
=LARGE(SUM(OFFSET($C$2:$I$2,0,0,1,3)),1)
=LARGE(SUM($C$2:$E$2),1)
=LARGE(11,1)
=11
...поэтому, по-видимому, диапазон, указанный в , OFFSET
не расширяется как массив, а верхняя левая ячейка этого диапазона используется напрямую OFFSET
.
Вмножествоформа (т.е. CTRLENTER), вместо этого она в конечном итоге сводится к:
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C"&(9+{3}-B$1),FALSE),0,0,1,B$1)),1)
=LARGE(SUM(OFFSET(INDIRECT("R[0]C3:R[0]C"&({12}-3),FALSE),0,0,1,B$1)),1)
=LARGE(SUM(OFFSET(INDIRECT({"R[0]C3:R[0]C9"},FALSE),0,0,1,B$1)),1)
=LARGE(SUM(OFFSET({#VALUE!},0,0,1,B$1)),1)
=LARGE(SUM(OFFSET({#VALUE!},0,0,1,3)),1)
=LARGE(SUM({#VALUE!}),1)
=LARGE(1,1)
=1
...поэтому, по-видимому, расширение массива происходит слишком рано (т.е. в результате COLUMNS($C:$C)
), что впоследствии приводит к сбою INDIRECT
вызова.
(Оба метода LARGE
и MAX
возвращают одинаковые значения — я использовал его, LARGE
потому что в его документации указано, что он ожидает массив, тогда как MAX
ожидает неограниченный список параметров из отдельных значений.)
Учитывая предпочтения не использовать VBA и не менять макет листа, есть ли:
- какие-нибудь трюки, чтобысиларасширение массива в нужном месте, так что
SUM(OFFSET)
создается массив, который может быть использованLARGE
? - есть ли альтернативные подходы к моему, которые требуют внесения поправок в формулы от нуля до минимума, поскольку данные добавляются в правую часть листа?
(P.S. Я использую Excel 2019, а не O365/Insiders, поэтому у меня пока нет динамических массивов/ SEQUENCE
прочего, что, похоже, может стать актуальным. Ответы, которые опираются на это, могут быть полезны для потомков, но не удовлетворят мою непосредственную потребность...)
решение1
Я хотел бы предложить следующий метод для получения суммы за любые 3 квартала, которые являются самыми высокими в году, включающий вспомогательные данные и значение суммы за большие 3 квартала.
Как это работает:
- Введите даты соответствующих месяцев
Row 1
и примените формат ячейкиmmm-yy
. - Вставьте название квартала в Rnage
T9:T12
. Формула в ячейке
U9
, заполните ее.=IF(ROW(A1)>=5,"",(SUMPRODUCT((ROUNDUP(MONTH(T$1:AE$1)/3,0)=ROW(A1))*(T$2:AE$2))))
Примечание.
ROUNDUP(MONTH(T$1:AE$1)/3,0)=Row(A1)
возвращается1
и0s
,1
когда месяц принадлежитQ1а0
когда нет и так далее для других кварталов, таких как2
,3
&4
.SUMPRODUCT
, обрабатывает все эти диапазоны данных, не моргнув глазом.=ROW(A1))
возвращает 1, представляетQ1
и так далее2, 3 & 4
.=IF(ROW(A1)>=5,""
возвращаетсяBlank
, когда формула не может получить значение квартала после 4.
После получения данных за каждый квартал введите в ячейку формулу U14
для СУММИРОВАНИЯ 3 наибольших значений.
{=SUM(LARGE(U$9:U$12,{1,2,3}))}
Примечание.
- Лучше использовать формулу в виде массива (CSE), поэтому нужно закончить сCtrl+Shift+Enter, в противном случае она также работает как формула, не являющаяся массивом.
При необходимости измените ссылки на ячейки в формуле.