如下圖,在 Excel 的工作表裡,如何依日期在資料表中篩選指定對象(隊長和和第1,2,3隊員)?
在下圖中,是依日期和姓名列出每天值班的代碼,也列出職務是隊長者,現在要依指定日期日和當班代號來篩選人員。其中要注意:
第1人要是隊長、第1,2,3人為隊員,並且分別是當日和當班除了隊長以外依序的第1,2,3人。
【設計與解析】
定義儲存格名稱
選取儲存格A3:L25,按 Ctrl+Shift+F3 鍵,勾選「頂端列」,定義名稱:職務、姓名、1日、2日、3日、4日、5日、6日、7日、8日、9日、10日。
當定義名稱時,因為第一個字是數字,則系統會自動加上「_」。
1. 篩選當日當班的隊長
隊長:=FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務="隊長"))
(1) INDIRECT("_"&O3)
先利用串接 "_" 儲存格O3,可以形成定義名稱所有的名稱。
再利用 INDIRECT 函數將名稱字串轉換為儲存格範圍。例如:儲存格O3為「5日」,先轉為「_5日」,即代表儲存格G4:G25。
(2) LEFT(INDIRECT("_"&O3),1)
利用 LEFT 函數取出第(1)式傳回值的第一個字元。因為本例是為值班代號的第一碼為篩選依據。
(3) FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務="隊長"))
在 FILTER 函數中利用雙條件來篩選:
LEFT(INDIRECT("_"&O3),1)=O4 和 職務="隊長"
其中運算式「*」,相當於執行邏輯 AND 運算。
最後,在 FILTER 函數中利用條件篩選並列出符合的「姓名」。
2. 篩選當日當班的第1隊員
第1隊員:=INDEX(FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務<>"隊長")),1)
(1) FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務<>"隊長"))
在此要篩選不是隊長者,因為條件變為「職務<>"隊長"」
(2) INDEX(第(1)式,1)
藉由 INDEX 指定第1列資料,即為第1隊員。
同理:
第2隊員:=INDEX(FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務<>"隊長")),2)
藉由 INDEX 指定第2列資料,即為第2隊員。
第3隊員:=INDEX(FILTER(姓名,(LEFT(INDIRECT("_"&O3),1)=O4)*(職務<>"隊長")),3)
藉由 INDEX 指定第3列資料,即為第3隊員。
【參考資料】
留言列表