Попытка завершить СУММУ, используя индекс / совпадение - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь суммировать несколько строк и столбцов в таблице, в зависимости от того, к какой неделе и региону они относятся:

Я хотел бы сложить все числа, которые все в WK-8, а затем по регионам, E N S W

На рисунке ниже приведен небольшой образец таблицы данных

enter image description here

1 Ответ

1 голос
/ 14 июня 2019

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

См. Изображение ниже, чтобы использовать используемые диапазоны и настроить их в соответствии с вашими потребностями.

Чтобы сделать это, следующее решение потребует использования следующих формул:

  • ОБЩИЙ
  • 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)))

POC

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