インデックスマッチから配列の結果を取得する

インデックスマッチから配列の結果を取得する

ほとんどのインデックスマッチ配列の質問とは少し異なります

A から B への移動の表があります。移動のタイプは、タイプ 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

今、サブステップの表と、実行する必要があるサブステップの数があります。動きの表と、A から B に移動される動きの単位数があります。各サブステップに追加する必要がある単位数を計算しようとしています。

例えば:

移動タイプ 1 に 100 ユニットがある場合は、サブステップ 1 ~ 6 に 100 ユニットを追加する必要があります。次に、移動タイプ 2 に 200 ユニットがある場合は、サブステップ 1 ~ 6 にさらに 200 ユニットを追加して、合計 300 ユニットを移動し、サブステップ 7 ~ 9 に 200 ユニットを追加する必要があります。

私は、sumproduct がおそらくこれを行う最良の方法であると考えました。現在、その最初の部分は次のようになります。

=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 は配列を適切に生成しますが、2 つをマージすると (ステップ実行時)、結果として数値の配列ではなく 1 つの数値のみが返され、(たとえば) {1} = 1 が返され、その後に 1 つの TRUE が返されます。

これは、数式をステップ実行しているときには機能しますが、計算するために全体をハイライト表示すると、#VALUE が表示されるだけです。そこで、2 つの質問があると思います (実際には、唯一の質問は、データをどのように取得するかですが、少し詳しく説明します...)。

1) インデックス マッチで配列の結果を返すにはどうすればよいですか?
2) 数式のどこが間違っているのでしょうか?

答え1

それで、さらにグーグルで検索してみたところ、答えは奇妙で直感に反するものでした。この記事を書いている時点では、なぜそれが機能するのかすべての理由が実際にわかっているわけではなく、ただ機能している(ように見える)ということだけがわかっています。

先ほど、ロールアップ ステップを取り出し、それを比較するというミスがありました。これは間違っていました。ロールアップ ステップが使用されているかどうかを取り出す必要がありました。これを反映して、一致が少し変更されました。

Index を強制的に複数の結果を返すようにする方法は 2 つあるようです: 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/しかし、それは機能するので、私は満足しています

関連情報