答え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
そのタスクがうまく機能するように使用されます。