作業列を作って対応するのがよいでしょう。
A1セルからF1セルにかけては氏名、国語、数学、・・と科目名が2文字で入力されているとしてその下方にそれぞれのデータが入力されているとします。
そこで上位20名の点数のランクをそれぞれの教科について調べ、それをN列からR列までに表示させます。
N1セルからR1セルにはB1セルからF1セルまでの教科名をコピーして貼り付けます。
N2セルには次の式を入力してR2セルまでドラッグコピーしたのちに下方にもドラッグコピーします。
=IF(B2="","",IF(RANK(B2,B:B)<=20,RANK(B2,B:B),""))
これで最上位から20番目の方のランクの番号が表示されます.。同じランク(点数)の方が多くいる場合には20人よりも多くの方に番号が付くこともあります。
このような作業列はその方のランクが直視できることで有意義であると思います。
この作業列のデータを使ってお求めの該当の方の氏名を表示させるわけですが例えばH1セルには英語と国語でランクが20位以内の方を表示させるためには 英語1国語 のように入力します。ここで間の1の数値は半角英数文字にしてください。
H2セルには次の式を入力して下方にドラッグコピーします。
=IF(AND(INDEX($N:$R,ROW(),MATCH(LEFT(H$1,2),$N$1:$R$1,0))<>"",INDEX($N:$R,ROW(),MATCH(MID(H$1,FIND("1",H$1)+1,2),$N$1:$R$1,0))<>""),$A2,"")
H1セルに書かれた教科についてともに20位以下になっている方が表示されます。
次に3つの教科について20位以下の方についてI列に表示させます。
I1セルにはH1セルにならって 英語1国語2数学 のように入力します。
I2セルには次の式を入力して下方にドラッグコピーします。
=IF(AND(INDEX($N:$R,ROW(),MATCH(LEFT(I$1,2),$N$1:$R$1,0))<>"",INDEX($N:$R,ROW(),MATCH(MID(I$1,FIND("1",I$1)+1,2),$N$1:$R$1,0))<>"",INDEX($N:$R,ROW(),MATCH(MID(I$1,FIND("2",I$1)+1,2),$N$1:$R$1,0))<>""),$A2,"")
H列やI列ではとびとびになって該当者が表示されますね。それらの氏名をまとめて表示させるためにK列とL列を使用します。
H1セルとI1セルの科目名をK1からL1セルに貼り付けます。
K2セルには次の式を入力し式を確定する段階でCtrlキーとShiftキーを同時に押しながらEnterキーを押します。
=INDEX(H:H,SMALL(IF(H$2:H$50<>"",ROW(H$2:H$50),1000),ROW(A1)))&""
その後にK2セルの式をL2セルまでドラッグコピーしたのちに下方にもドラッグコピーします。
K列とL列にはお望みの教科についてともに1位から20位以下となる方の氏名がまとめて表示されることになります。
なお、式をできるだけ簡単にするために教科名は必ず2文字で入力することとしています。
教科名を変えた場合でも即座に対応した表が得られます。
お礼
系統ごとに優秀な人を数値でマークして、 そのマークを基に条件に適合する人を探すという方法ですね。 確かにこれなら手作業でも手間なくできそうです。 回答ありがとうございました。