Это решение работает при условии, что ваши регионы и ваши недели отсортированы. Это приведет к тому, что все одинаковые области будут находиться в соседних столбцах, а все те же недели - в соседних строках. Исходя из этого предположения, все, что нужно сделать, это определить углы вашего диапазона (или поля выбора, если вы предпочитаете) и вывести его в функцию суммы.
См. Изображение ниже, чтобы использовать используемые диапазоны и настроить их в соответствии с вашими потребностями.
Чтобы сделать это, следующее решение потребует использования следующих формул:
- ОБЩИЙ
- ROW
- КОЛОННА
- ИНДЕКС
- SUM
AGGREGATE - это целая куча различных формул, объединенных в одну функцию. Он принимает следующий формат:
AGGREGATE(formula #, Option#,ARRAY/RANGE, Parameter)
Формулы, используемые для этого решения: 14 и 15. Эти две конкретные формулы заставляют AGGREGATE выполнять вычисления, подобные массиву, внутри функции AGGREGATE. В результате этого избегайте использования полных ссылок на столбцы / строки, таких как A: A или 2: 2, в AGGREGATE, иначе вы можете получить много лишних вычислений. Формулы 14 сортируют массив от наибольшего к наименьшему, а 15 сортируют от наименьшего к наибольшему.
Существует несколько доступных вариантов #, которые могут указывать AGGREGATE игнорировать определенные условия, такие как скрытая информация или значения ошибок. Для этого решения будет использоваться 6, которое говорит AGGREGATE игнорировать все ошибки.
Часть массива / диапазона - это место, где будет составлен список номеров строк или столбцов, соответствующих нашим критериям.
Параметр для формулы, которую мы используем, сообщит AGGREGATE, с какой позиции в массиве возвращать значение.
На основании приведенной выше информации данное решение будет использовать AGGREGATE для определения числа ПЕРВОЙ и ПОСЛЕДНЕЙ СТРОКИ и КОЛОННЫ. Будут использованы 4 различные формулы, но они будут очень похожи друг на друга.
Таким образом, базовая настройка формулы будет:
Last ROW/COL
=AGGREGATE(14,6,ARRAY,1)
or
First ROW/COL
=AGGREGATE(15,6,ARRAY,1)
Так что сложная часть будет разрабатывать ARRAY. Давайте начнем со столбца, затем следуем тому же методу и получим строку. Чтобы получить список возможных номеров столбцов, вам понадобится следующая формула:
COLUMN(D4:G4)
Это даст вам все номера столбцов. Теперь вам нужно добавить свои критерии, в этом случае мы будем использовать критерии, где столбец равен чему-то. Это может отличаться для других сценариев, в которых все столбцы могут быть больше определенной даты или не равны значению. в этих случаях вам просто нужно изменить оператор сравнения в соответствии с вашими потребностями. Итак, ключевой момент здесь - когда мы сопоставляем что-то, что хотим, мы получаем значение ИСТИНА, а когда что-то не совпадает, вы получаете значение ЛОЖЬ. Что еще более важно, когда на TRUE и FALSE действуют математические операторы, такие как +, -, *, /, ^ и т. Д., Они будут преобразованы в 1 для TRUE и 0 для FALSE. Отправка их через такую функцию, как SUM, не всегда выполняет преобразование. Поэтому причина этого важна в том, что мы хотим исключить все вещи, которые не соответствуют тому, что мы ищем. Они вернут значение False. Мы разделим номера потенциальных столбцов по их истинному и ложному. Это означает, что мы будем делить на 1 и 0. Если вы разделите на 0, вы получите ошибку. Поскольку мы выбрали 6 в AGGREGATE, чтобы игнорировать ошибки, эти номера столбцов будут исключены из отсортированного списка, и у вас останутся только те номера столбцов, которые вы хотите. Таким образом, часть формулы ARRAY становится:
COLUMN(D4:G4)/(D4:G4=C14)
Теперь добавьте это в формулу AGGREGATE, и вы получите:
=AGGREGATE(15,6,COLUMN(D4:G4)/(D4:G4=C14),1)
Это даст вам номер первого столбца. Чтобы получить первый номер строки, нам просто нужно изменить часть массива на следующие операции:
ROW(C5:C8)/(C5:C8=C13)
и затем сбросьте это в функцию AGGREGATE, чтобы получить:
=AGGREGATE(15,6,COLUMN(D4:G4)/(D4:G4=C14),1)
Итак, используя две вышеупомянутые функции AGGREGATE, вы получите первый столбец и первый ряд. Чтобы получить последний столбец и последнюю строку, нужно просто изменить порядок сортировки части массива, что можно сделать, изменив AGGREGATE с формулы 15 на формулу 14. Соответствующими формулами станут:
=AGGREGATE(14,6,COLUMN(D4:G4)/(D4:G4=C14),1)
=AGGREGATE(14,6,COLUMN(D4:G4)/(D4:G4=C14),1)
Итак, теперь у вас есть расположение в верхнем левом и нижнем правом углу области, которую вы хотите суммировать. Вы можете использовать некоторые другие методы для определения вашего диапазона, например, используя OFFSET, но это изменчивая функция. Изменчивые функции заставят лист пересчитывать в любое время, когда что-либо в рабочей таблице / рабочей книге изменяется. Это может привести к большому количеству ненужных расчетов. Вместо этого будет использоваться INDEX, который является обычной функцией. Он только пересчитывает, когда что-то, что влияет на это изменяется
Большинство людей предполагают, что результатом индекса является значение ячейки, которую он возвращает. В действительности индекс возвращает адрес ячейки. этот адрес ячейки в свою очередь выбирает значение в этой ячейке. Это означает, что вы можете написать адрес диапазона двумя функциями индекса следующим образом:
INDEX(...):INDEX(...)
Теперь вам просто нужно заставить INDEX просмотреть все столбцы и строки на листе и определить столбец и строку, в которой вы заинтересованы. Какой AGGREGATE определит для нас. поэтому формула INDEX для верхней левой ячейки:
=INDEX(1:1048576,C18,C16)
и ИНДЕКС для нижней правой ячейки:
=INDEX(1:1048576,C19,C17)
Если вы введете их в виде формул, вы увидите не адрес, как обсуждалось ранее, а значение по этому адресу. Потенциально хороший способ убедиться, что он выбирает правильные значения, хотя
Чтобы определить диапазон, в котором вы хотите взять сумму, возьмите приведенные выше формулы и поместите между ними следующее:
INDEX(1:1048576,C18,C16):INDEX(1:1048576,C19,C17)
Вышеописанное не будет работать в отдельной ячейке, но, поскольку это диапазон, в котором вы хотите получить сумму, вы можете поместить этот диапазон в функцию SUM, получив следующую формулу:
SUM(INDEX(1:1048576,C18,C16):INDEX(1:1048576,C19,C17))
Таким образом, если разбить формулу на части, где это возможно, формула будет короткой и относительно простой для чтения, и, следовательно, более легкой в обслуживании. Если вам действительно нужно хранить все это в одной ячейке, вы можете заменить отдельные формулы друг на друга, чтобы получить следующую длинную, уродливую, трудно читаемую формулу:
=SUM(INDEX(1:1048576,AGGREGATE(15,6,ROW(C5:C8)/(C5:C8=C11),1),AGGREGATE(15,6,COLUMN(D4:G4)/(D4:G4=C12),1)):INDEX(1:1048576,AGGREGATE(14,6,ROW(C5:C8)/(C5:C8=C11),1),AGGREGATE(14,6,COLUMN(D4:G4)/(D4:G4=C12),1)))