如何活用WEEKDAY,找出每月的第一個週四以及15日之前的週四

這幾天同事在工作上有一個需求,需要在資料庫中新增10年份的排程資料,所以要找出每個月的第一個以及15日之前的週四,不過前者若是遇到1日時,要改為取下一週的週四,而後者則是不包括15日本身。

若用人工方式取出10年份的資料實在有點蠢,程式設計師做這種事情會被人笑死,寫程式的人應該都聽過某個偏執設計師花了一下午時間來寫程式,結果只為了取出10筆資料的故事吧😵,有時設計師無謂的尊嚴真的會害死人,但通常死的不是設計師自己而是PM😂。寫程式取出日期是OK,也花不了多少時間,不過取出後最好再輸出成CSV格式,這樣資料會比較好運用。既然要輸出成CSV,倒不如直接在用Excel裡面寫公式並取用資料,可以省掉撰寫輸出資料的時間。

要如何在Excel中做出這個需求呢?首先,準備10年份的年月資料放在第一欄,作為取用計算的基準。第一欄就輸入今年的開始日期,2019/01/01,第二列則輸入=DATE(YEAR(A2),MONTH(A2)+1,DAY(A2)),然後複製到第120列,這樣取用計算的基準就準備好了。

現在我們有兩個日期,1日與15日。就先做後面那個需求好了,找出15日前的那個週四,但是若15日剛好是週四的話,就要取前一個週四。首先我們要知道要判斷的那個月份的15號是星期幾,這樣才能繼續後面的動作,要知道某天是星期幾,就要用上WEEKDAY這個函數了。WEEKDAY的第一個參數是日期,二個參數則是決定傳回值的類型。根據說明文件,共有以下10種格式。

1 或省略
數字 1 (星期日) 到 7 (星期六)。與舊版 Microsoft Excel 的性質相同。
2
數字 1 (星期一) 到 7 (星期日)。
3
數字 0 (星期一) 到 6 (星期六)。
11
數字 1 (星期一) 到 7 (星期日)。
12
數字 1 (星期二) 到 7 (星期一)。
13
數字 1 (星期三) 到 7 (星期二)。
14
數字 1 (星期四) 到 7 (星期三)。
15
數字 1 (星期五) 到 7 (星期四)。
16
數字 1 (星期六) 到 7 (星期五)。
17
數字 1 (星期日) 到 7 (星期六)。
那到底是要指定成那一種咧?首先,先思考一下,若15日是週四,要取前一個週四,所以減去7天後是8日。若是週三,減去6天後是9日。若是週二,減去5天後是10日。以此類推,若是週五,減去1天後是14日。依照上述規律,是否有看出一個端倪。

週四 -7
週三 -6
週二 -5
週一 -4
週日 -3
週六 -2
週五 -1

要減去的數字是否與第二個參數內容為15時,回傳的數值相同,所以公式可以寫成這樣。
=DATE(YEAR(A1),MONTH(A1),15)-WEEKDAY(DATE(YEAR(A1),MONTH(A1),15),15)
同樣的,複製到第120列,這樣「15日前的週四」這欄的內容就搞定了。

至於要找出每個月的第一個週四,但若是1日時則取下一個週四,這個需求同樣可以採用類似上面的思考方式來設計公式。

首先,一樣去判斷該月1日是星期幾,若是週四,則要取下一個週四,加上7天後是8日。若是週五,加上6天後是7日。以此類推,資料規律如下。

週四 +7
週五 +6
週六 +5
週日 +4
週一 +3
週二 +2
週三 +1

再回去看一下說明,會發現沒有符合這種規律的傳回值可以直接取用,不過沒關係,山不轉路轉,再仔細觀察一下資料的規律。傳回值型態為15時,傳回的數字是數字 1 (星期五) 到 7 (星期四)。若用7減去傳回值,傳回的數字是不是就變成6,5,4,3,2,1,0了?直接用該月1日加上這個數字,就得到了該月份第一個週四的日期。

不過這樣沒辦法濾掉1日為週四的狀況,因此要針對這情況特別判斷處理。所以公式可以寫成這樣。
=IF(7-WEEKDAY(A1,15)=0,A1+7,A1+7-WEEKDAY(A1,15))
同樣的,複製到第120列,這樣「不含1日的第一個週四」這欄的內容就搞定了。

準備10年份的年月資料放在第一欄,作為取用計算的基準。
10年份的年月資料

不含1日的第一個週四

15日前的週四

留言