2021年9月11日土曜日

表計算の数式で複数行複数列から検索する方法について

 あまプロでは表計算アプリの関数(数式)の授業を行う事が有ります。
先日の授業でちょっとハマったんであメログ。

 例えば、部門毎の列が有りまして、各行に人が入っているシート(部門シート)が有るとします。

別のシートで、人がどの部門に入っているかを数式で取得したいとします。

vlookupやhlookupやmatch等の検索系の関数は1行1列の範囲内からしか検索できなくて、今回の様な複数行複数列からの検索ができません。
で、どないするかというとsumproduct( )column( )index( )(とif( ))を使います。

これには行列式の知識が要るのですが、簡単に説明すると、行と列の範囲に比較を行います。
今回は検索したい人で比較します。
すると、論理値(TrueFalse)の行列(表みたいなの)が返ります。
数式はデバックできないので…頭の中で想像するしかないんですが、まぁ行列が返されます。

返された論理値の行列に、columnで取得した部門の行列をかける(乗算)と、該当する部門がTrueの論理値の行列が返ります。

該当する部門がTrueの論理値の行列をsumproductに渡すと、行列の積の和である部門の列番号が返ります。

最後にindexで列番号を指定して、人が所属する部門を取得する…こんな流れになります。

=IF(
  SUMPRODUCT( 部門.$A$2:$C$5 = A2) = 1,
    INDEX(
      部門.$A$1:$C$1,
      1,
      SUMPRODUCT(
        ( 部門.$A$2:$C$5 = A2) * COLUMN( 部門.$A$1:$C$1)
      )
    ),
  "なし"
)

仕上げに該当部門無しの場合のifを加えて完成です。

意外と使える場面が有ると考えますので、試してみて下さい。
環境はUbuntu21.04+Libreoffice7.1で確認しました。