excel 綜合案例解析:使用多函數快速從高到低分提取科目成績中前N名的姓名
????今天一起來學習一個小案例:根據選擇的科目,提取該科目前N名(以前3名為例)的學生姓名。
????最終結果是這樣的

????要注意的是:從高到低提取科目成績的前三名,而且科目成績中有并列的情況。解題思路是這樣的:
????1.?獲取科目對應列的數值;
????2.找出科目第三名的數值;
????3.篩選出科目前三名的數據;
????4.對篩選后的科目成績執(zhí)行排序;
????5.提取、合并姓名。
????公式會比較繁雜,可以先分步寫公式,最后再合并,慢慢練習,自能駕輕就熟。

????第一步:獲取選擇科目的成績。使用CHOOSECOLS獲取科目所有成績,在O5單元中輸入,=CHOOSECOLS (C3:J20,2)。C3:J20是包括姓名和各科目成績在內的數據區(qū)域,2是語文成績在數據區(qū)域的第2列。
????這時,選擇其它科目時,數值不會變化,所以第2個參數不能寫死,要根據選擇的科目而動態(tài)變化,需要使用Match函數函數動態(tài)獲取科目位于數據區(qū)域第幾列。
????接下來,把2改成MATCH(L5,C2:J2,0),L5是選擇的科目,C2:J2是表頭區(qū)域,0是精確匹配模式。

????完整公式=CHOOSECOLS(C3:J20,MATCH(L5,C2:J2,0)。

第二步:找出科目第三名的數值。LARGE函數找出數組中第k個最大值。
????在Q5單元中輸入,=LARGE(O5:O21,3)。O5:O21是第一步獲取的科目成績,3是第3個。
????但有些科目成績中有并列成績的情況,所以需要先去重復值再提取K個最大值,把公式修改為=LARGE(UNIQUE(O5:O21),3)。

????第三步:篩選出科目前三名的數據。篩選肯定要使用FILTER,在S5單元中輸入,=FILTER(C3:J20, O5:O21>=Q5)。篩選區(qū)域C3:J20,包含整個數據表區(qū)域;條件區(qū)域O5:O21是第一步獲取的科目成績;篩選條件是>=Q5;Q5是LARGE計算出來的科目中第三名成績。

????第四步,對篩選后的科目成績執(zhí)行排序。使用Sort函數對篩選出來的結果進行排序,對第幾列排序不是固定的,不能寫死,要與選擇的科目位于第幾列一致,一樣是使用Match函數。
????在U9單元格中輸入,=SORT(S5:Z7,MATCH(L5,C2:J2,0),-1)。S5:Z7,是篩選出科目前三名的數據區(qū)域,MATCH(L5,C2:J2,0)是依據第幾列進行排序,-1是降序排列。

????第五步,提取、合并姓名。先用CHOOSECOLS提取出姓名,再用TEXTJOIN合并姓名。
????在W14單元格中輸入=TEXTJOIN("、",True,CHOOSECOLS(U9:AB11,1))。U9:AB11是執(zhí)行排序后的數據區(qū)域,1是提取數據區(qū)域中第1列,也就是姓名;用"、"做分隔符,True是忽略空單元格,也可以省略。

????到這里分步公式已經寫好,驗證一下,下拉選擇任一科目,結果在同步變化;同時與科目成績驗證,結果也是正確的。

????接下來,把分步公式一步一步的合并起來。

????首先,把最后一步公式中的U9:AB11替換為SORT(S5:Z7,MATCH(L5,C2:J2,0),-1),公式變成= TEXTJOIN("、",,CHOOSECOLS(SORT(S5:Z7,MATCH(L5,C2:J2,0),-1),1));
????接著,再把公式中的S5:Z7,替換為FILTER(C3:J20, O5:O21>=Q5),公式變成=TEXTJOIN("、",,CHOOSECOLS(SORT(FILTER(C3:J20, O5:O21>=Q5),MATCH(L5,C2:J2,0),-1),1));
????接著再把公式中的Q5和O5:O21替換為對應的公式。
????最終公式成為:=TEXTJOIN("、",,CHOOSECOLS(SORT(FILTER(C3:J20,CHOOSECOLS(C3:J20,MATCH(L5,C2:J2,0))>=LARGE(UNIQUE(CHOOSECOLS(C3:J20,MATCH(L5,C2:J2,0))),3)),MATCH(L5,C2:J2,0),-1),1))。
????下次分享本案例的簡化寫法,敬請關注!