別の列のキーを持つ関数で列を完了するにはどうすればよいですか

別の列のキーを持つ関数で列を完了するにはどうすればよいですか

何千人もの学生の加重平均を計算しようとしています。

これを個々の学習者に対して順番に実行できます (SUM PRODUCTS)。

問題は、何千人もの生徒に同時にこれをどうやって行うのか分からないことです。

生徒ごとに成績の数が異なり、成績ごとの重みも異なります。

私が見つけたのは、学生コードに従ってデータを並べ替えることだけでした。そして、キーが同じである限り、指定された数式をカウントしようとすると、それが繰り返されます。

どうすればいいか教えてください

ここに画像の説明を入力してください

答え1

少なくとも 2 つの簡単な方法があります。どちらも、必要な値を「フィルタリング」してから、計算を実行します。

1 つは簡単で、SUMPRODUCT()満足できるものを使用しますが、作業する適切な項目を選択するために値のリストに対してフィルタリングを実行します。 を使用して適格なFILTER()行を選択し、もう一度 を使用して内部の結果FILTER()から列を選択します。FILTER()

=SUMPRODUCT(  FILTER(  FILTER(B1:D12, B1:B12=I1),  {0,1,0}),  FILTER(  FILTER(B1:D12, B1:B12=I1),  {0,0,1}))

提示されている数式では、学生が参照する参照エントリ セルが I1 であると想定されています。そしてもちろん、列の範囲は 12 ではなく、1000 になります。

ただし、「THOUSANDS」を扱う場合は、アドレスを範囲に変更するだけで、列 I を必要なだけ使用できます。または、(おそらく)「thousands」と言うときに「All」も意味する場合は、UNIQUE()3 番目のパラメータを に設定して を使用し、FALSEそれらの「thousands」に含まれる各学生名の単一インスタンスのリストを抽出できます。ただし、その配列を作成した場合でも、 を使用してI1#結果全体を取得することはできないようです。これは、検索範囲の長さが異なることと、 の出力が短いことが原因であると考えていますUNIQUE()

FILTER()実際には、含まれる行の TRUE/FALSE 結果のリストを作成します。ここでの「コツ」は、そのリストを直接入力することで必要な列を取得することです (たとえば、2 番目の列を選択するには {0,1,0})。ハードコーディングが実際に役立つときですが、数式を動的にする方法でこれらの配列を作成することは間違いなく可能です。ただし、ここでは必要ありません。

INDEX()の配列に使用する列を選択するには を使用できることに注意してくださいSUMPRODUCT()。個人的には、この方が簡単だと思いますが、大きな違いはありません。

凝ったことはここまでです。かなり古いバージョンの Excel でも機能する、より昔ながらの方法で、範囲比較を行ってデータを「フィルター」し、次のように表示しますSUMPRODUCT()

=SUMPRODUCT(  IF(B1:B12=I1, C1:C12, 0),  IF(B1:B12=I1, D1:D12, 0)  )

関数内の各配列は、IF()ルックアップ範囲を行の列 I セルと比較するだけの によって提供され (はい、どちらのアプローチもSPILL数式ではないので、列 I が拡張する限り下にコピーする必要がありますUNIQUE())、2 つの列のデータを関数のパラメータに返します。

直接的、明確、かつシンプルで、理解しやすく、長年にわたって維持できます。関数ではなく単純な TRUE/FALSE テストを使用するため、高速になるはずです。どちらのアプローチも列SPILLで機能を使用しないSUMPRODUCT()ため、どちらにも優位性はありません。

しかし、これは明らかに使い慣れている機能のみを使用しているので、なぜそうしないのでしょうか?

そして実際、ユニークな生徒のリストを作成するという厄介な部分も、SPILLそのタスクがうまく機能するように使用されます。

関連情報