Немного отличается от большинства вопросов по индексному сопоставлению массивов
У меня есть таблица перемещений из точки А в точку Б. У меня могут быть перемещения типа 1, типа 2, типа 3 или типа 4.
Каждое из этих движений соответствует разному набору "шагов скатывания". Это будет Шаг 1, Шаг 2 или Шаг 3.
Эта взаимосвязь отражена в наглядной таблице, например:
Step Type Relationship
Step 1 - Type 1 - 1
Step 2 - Type 1 - 0
Step 3 - Type 1 - 0
Step 1 - Type 2 - 1
Step 2 - Type 2 - 1
Step 3 - Type 2 - 0
Step 1 - Type 3 - 0
Step 2 - Type 3 - 0
Step 3 - Type 3 - 1
Step 1 - Type 4 - 1
Step 2 - Type 4 - 1
Step 3 - Type 4 - 1
Где 1 означает «Да, они родственники», а 0 — «Нет, они не родственники».
Теперь есть таблица подшагов для шагов, которая выглядит так:
SubStep --- Step
1 1
2 1
3 1
4 1
5 1
6 1
7 2
8 2
9 2
10 3
11 3
12 3
Теперь у меня есть таблица подшагов и сколько подшагов мне нужно сделать. У меня есть таблица движений и сколько единиц движений перемещается из точки А в точку В. Я пытаюсь вычислить, сколько единиц нужно добавить к каждому подшагу.
Например:
Если у меня есть тип движения 1 для 100 юнитов, мне нужно будет добавить 100 юнитов к подшагам 1–6. Если у меня есть тип движения 2 для 200 юнитов, мне нужно будет добавить еще 200 юнитов к подшагам 1–6, чтобы в общей сложности переместить 300 юнитов, а затем 200 юнитов добавить к подшагам 7–9.
Я выяснил, что суммирование — это, вероятно, лучший способ сделать это. В настоящее время первая часть выглядит так:
=SUMPRODUCT(UnitMovementWorksheetCurrent[Units],--(UnitMovementWorksheetCurrent[Month]=[@Month]),--(UnitMovementWorksheetCurrent[Year]=[@Year]),--(UnitMovementWorksheetCurrent[From]=[@[Lab Abbr]]),--(INDEX(MovementToStepLookup[Roll up Step],MATCH(UnitMovementWorksheetCurrent[Movement Type],MovementToStepLookup[Movement Number],0))=[@[Roll up Step]]))
Однако часть, которая не работает, это (INDEX(MovementToStepLookup[Roll up Step],MATCH(UnitMovementWorksheetCurrent[Movement Type],MovementToStepLookup[Movement Number],0))=[@[Roll up Step]]))
- я ожидал получить массив TRUE/FALSE, но вместо этого я просто получаю ошибку #VALUE. Index правильно дает мне массив, Match правильно генерирует массив, при слиянии двух (при пошаговом выполнении) он дает мне только одно число в качестве результата, вместо массива чисел, затем он дает мне (например) {1} = 1, затем одно TRUE.
Это работает, когда я прохожу по формуле, но когда я выделяю все, что нужно вычислить, оно просто выдает мне #ЗНАЧЕНИЕ. Так что, полагаю, у меня два вопроса (на самом деле, единственный вопрос в том, как вытащить мои данные, но если немного их разбить...):
1) Как мне заставить мой индекс-соответствие возвращать результат массива?
2) Что я делаю неправильно в своей формуле?
решение1
Итак, после МНОГОГУЧЕГО гугления ответ оказался странным и нелогичным, и на момент написания статьи я на самом деле не знал всех причин, ПОЧЕМУ это работает, просто то, что это (кажется!) работает.
Ранее я допустил ошибку, когда вытаскивал шаг сворачивания, а затем сравнивал его. Это было неправильно, мне нужно было вытаскивать, использовался он или нет. Соответствие немного изменилось, чтобы отразить это.
Способ принуждения Index к возврату нескольких результатов, по-видимому, двоякий: 1) использовать условный оператор, 2) использовать функцию N, например:
INDEX(MovementToStepLookup[Использовано?],N(IF(TRUE,MATCH(UnitMovementWorksheetCurrent[Тип движения],MovementToStepLookup[Номер движения]*(MovementToStepLookup[Шаг свертывания]=[@[Шаг свертывания]]),0))))
Для моего условного выражения я просто указал значение TRUE. Зачем заморачиваться с чем-то более сложным? Для N просто передайте ему массив.
Я ПОНЯТИЯ НЕ ИМЕЮ, почему это работает. В (гораздо лучшей статье), объясняющей, как это сделать, говорится, что они тоже не уверены, почему. Больше информации можно найти здесь:https://excelxor.com/2014/09/05/index-returning-an-array-of-values/. Однако это работает, так что я доволен.