所以就順便整理了幾個較常遇到的狀況,
把一些 Excel 函數利用多重套用的方式介紹給大家,
一方面讓自己方便查詢,
也能讓更多人學習這方面的技巧!
個人所使用的公式並不見得完美,
如有更好的方式可提出來一起研究,
有疑問者也歡迎提出討論!
Data 工作表:自動套用萬年曆
只需輸入年&月,所有日期及星期會自動帶入!

B3:
=DATE($C$2+1911, $G$2, COLUMN()-1)
利用 DATE 函數將該欄變成日期!
C3:
=IF(B3="", "",
IF(DAY(DATE($C$2+1911, $G$2, COLUMN()-2))=
DAY(EOMONTH(DATE($C$2+1911, $G$2, 1), 0)), "",
DATE($C$2+1911, $G$2, COLUMN()-1)))
說明:
IF(B3="", "", 副條件)
若前一天的日期為空白,代表已超過月底,故不顯示內容!
副條件:IF(DAY(DATE($C$2+1911, $G$2, COLUMN()-2))=
DAY(EOMONTH(DATE($C$2+1911, $G$2, 1), 0)),
"", DATE($C$2+1911, $G$2, COLUMN()-1))
因為有大小月,所以利用此方式隱藏不適合的日期,
此公式亦可由 AD3 再開始(因為超過 28 天才有可能超過月底)
注意,該列儲存格格式要設定如下:

B4:
=RIGHT(TEXT(B3,"aaa"),1)
取得 B3 欄日期是星期幾!
範圍 B3:AF4 設定格式化條件(如下圖),
遇到六、日底色會自行變色!

List 工作表:陣列查詢
LOOKUP 家族及 MATCH 函數僅能針對單一結果查詢,
若結果可能有多筆,則需使用陣列函數!

B4:
=IFERROR(OFFSET(Data!$A$6,
SMALL(IF(LEFT(OFFSET(Data!$B$6, 0, DAY($A$2)-1,
COUNTA(Data!$A$6:$A$15), 1), LEN($B$3))=B$3,
ROW(OFFSET(Data!$B$1, 0, DAY($A$2)-1,
COUNTA(Data!$A$6:$A$15), 1)), FALSE),
INT((ROW(1:1)+1)/2))-1, COLUMN($A:$A)-1), "")
上述陣列公式輸入完成後,
需以 Ctrl + Shift + Enter 結束,
此時公式最外層會自動加上大括號,代表是陣列公式,
剩下需顯示資料的欄位則依一般複製欄位方式複製!
說明:
首先要了解 OFFSET 的用法,
OFFSET(基準欄位, 偏移列數, 偏移欄數, [高度], [寬度])
前三項為必要,後兩項可省略(省略時代表 1),
基準欄位:Data!$A$6
因為最後顯示的姓名在『Data』的 A 欄,
所以用此欄位當作基準起始點!
偏移列數:SMALL(IF(範圍=B$3, ROW(範圍), FALSE), n)-1
用 SMALL 函數分別取得第 n 小的列數,
若改為 LARGE,則查詢結果會以相反順序顯示!
IF(範圍=B$3, ROW(範圍), FALSE)
找出範圍中與 B3 相同的有哪幾列!
範圍:
LEFT(OFFSET(Data!$B$6, 0, DAY($A$2)-1,
COUNTA(Data!$A$6:$A$15), 1), LEN($B$3))
利用 OFFSET 及 DAY 取得要查詢的班別範圍!
加入 LEFT 函數可查詢範圍內左側指定長度符合的項目,
否則僅查詢完全符合者(亦可視需求使用 RIGHT 或 MID 函數),
例如:若不使用 LEFT 函數,Data 工作表中的 B6 將不會顯示!
n:INT((ROW(1:1)+1)/2))-1
因為是每隔一行顯示下一筆資料,
所以利用 INT 函數來達成目的,
如果是每行一筆則改為 ROW(1:1)-1
偏移欄數:COLUMN($A:$A)-1
若只顯示單一欄位,此處可直接用 0 取代,
但考慮到不同情況下,查詢出來的結果可能有數個欄位要顯示,
所以使用此方式,僅需去掉 $ 然後向右複製即可!