「第2月曜日」「第3月曜日」「次の水曜日」「最終金曜日」のように何番目の曜日かを指定して日付を求めるExcel関数はありませんが、関数を組み合わせて計算する方法は何通りかあります。
他のサイトでも様々な数式が紹介されていますが、FLOOR関数またはCEILING関数を使って計算するのが最もシンプルな方法であり、数式が最も短くなるようです。
そこで、今回は、特定の月や日を基準として、第1、第2、最終、次回、前回などの指定した曜日の日付を求める方法をまとめて解説します。
目次
- 1.土曜日=7の倍数
- 2.TODAYを基準として次回の土曜日を求める
- 3.CEILING関数とFLOOR関数
- 4.TODAYを基準として次回の*曜日を求める
- 5.先月末、今月末、来月末
- 6.第1土曜日の求め方
- 7.第1*曜日の求め方
- 8.第2、第3、第4、第5の曜日の求め方
- 9.TODAYを基準として前回の土曜日を求める
- 10.TODAYを基準として前回の*曜日を求める
- 11.最終土曜日の求め方
- 12.最終*曜日の求め方
- 13.何回目の何曜日か
- 14.先週、今週、翌週、週番号の日付を求める
- 15.さいごに:日付に時刻を含む場合の注意点
1.土曜日=7の倍数
問題
2020年1月1日~31日の日付を入力した。シリアル値を求め、土曜日のシリアル値を7で割りなさい。
解説
Excelの日付は1900年1月1日からの経過日数であるシリアル値(整数値)で管理されています。日付の表示形式になっているものは、表示形式を標準にすることによってシリアル値にすることができます(参考:【Excel】日付の「シリアル値」を本気で理解するには何を練習するべきか?)。
土曜日のシリアル値を7で割ると、割り切れます。1900年3月1日以降の日付については「土曜日が7の倍数」であることが知られています。したがって、曜日を考えるときには土曜日を基準として考えます。
2.TODAYを基準として次回の土曜日を求める
問題
今日の日付(TODAY関数)を用いて、次回の土曜日の日付を求めなさい。
解説
(1)7の倍数で切り上げるだけ
前述の通り、日付は連番で管理されていて、1日経つとシリアル値が1増えます。そして、土曜日は必ず7の倍数になることが分かっています。
この図は、日曜から土曜の日付を斜めに並べたイメージ図です。必ず土曜日は7の倍数です。
今日(TODAY)が日曜日~金曜日の場合、シリアル値は7の倍数ではありませんが、その整数を7の倍数で切り上げる(=7の倍数になるように日付を増やすという意味です)と、直近の土曜日になります。
Excelで倍数で切り上げる関数はCEILINGです。したがって、「=CEILING(TODAY(),7)」とすれば、次の土曜日を求めることができます(表示形式が標準の場合は日付の表示形式にする。以下、同じ)。
しかし、TODAYが土曜日だった場合、TODAY自身が7の倍数なので切り上げても日付は変わりません。当日が土曜日だった場合は、当日の日付を返します。
(2)次回の土曜日に当日は含まれるか?
例えば、会議が毎週土曜日である場合、会議の当日(土曜)に表示すべき次回会議の日付は翌週の土曜日(7日後)です。
しかし、提出締め切りが毎週土曜日の午後5時と決められている課題レポートの場合、その締め切り当日(土曜)に表示すべき日付は当日であって、翌週の土曜日ではありません。
ここで、日付に1を足します。この図では右に1日ずらします。
その後、7の倍数で切り上げると、土曜日は翌週の土曜日(7日後)になります。これで、日曜~金曜については直近の土曜日、土曜については7日後の土曜日を求めることができます。
数式では「=CEILING(TODAY()+1,7)」となります。
このように「次回の土曜日」には2つの意味があり、当日が土曜日だったら当日のままにするのか、翌週の土曜日にするのかによって数式が変わるので注意しなければなりません。
3.CEILING関数とFLOOR関数
CEILING関数は切り上げる関数であり、FLOOR関数は切り捨てる関数ですが、特に第2引数を7にすると7の倍数になります。日付の場合は必ず土曜日になります。
- =CEILING(日付,7)・・・土曜日
- =FLOOR(日付,7)・・・土曜日
4.TODAYを基準として次回の*曜日を求める
問題
今日の日付(TODAY関数)を用いて、次回の水曜日の日付を求めなさい。
解説
指定した日付の3日後を求めたとします。下の図では3日分右にずれます。
その日付を7の倍数で切り上げると、直近の土曜日になります(土曜日の場合は変わらない)。
3日前の日付を求めます。つまり3日分左にずらします。
これを元の日付と比較すると、直近の水曜日になっています。
つまり、7の倍数で切り上げる前にあらかじめ3日足しておき、切り上げた後で3日を引けば、次回の水曜日となります。数式では「=CEILING(日付+3,7)-3」です。今日(TODAY)を基準とする場合は「日付」のところを「TODAY()」にします(以下、同じ)。
- =CEILING(TODAY()+3,7)-3
ただし、当日が水曜日の場合は翌週ではなく当日の日付を返します。
当日が水曜日の場合に翌週の日付にするには、7の倍数で切り上げる前に1を足します。数式では「=CEILING(日付+4,7)-3」です。
水曜日以外でも同じことが言えます。日付にNを足し、7の倍数で切り上げてからNを引きます。なお、Nの値は「7-WEEKDAY(日付)」と一致します。
- 当日が*曜日の場合、当日とする・・・CEILING(日付+N,7)-N
- 当日が*曜日の場合、翌週とする・・・CEILING(日付+N+1,7)-N
(当日がその曜日の場合、当日とする)
- 次回日曜:=CEILING(日付+6,7)-6
- 次回月曜:=CEILING(日付+5,7)-5
- 次回火曜:=CEILING(日付+4,7)-4
- 次回水曜:=CEILING(日付+3,7)-3
- 次回木曜:=CEILING(日付+2,7)-2
- 次回金曜:=CEILING(日付+1,7)-1
- 次回土曜:=CEILING(日付,7)
(当日がその曜日の場合、翌週とする)
- 次回日曜:=CEILING(日付+7,7)-6 (※)
- 次回月曜:=CEILING(日付+6,7)-5
- 次回火曜:=CEILING(日付+5,7)-4
- 次回水曜:=CEILING(日付+4,7)-3
- 次回木曜:=CEILING(日付+3,7)-2
- 次回金曜:=CEILING(日付+2,7)-1
- 次回土曜:=CEILING(日付+1,7)
(※)次回日曜は「=CEILING(日付+7,7)-6」ですが、7の倍数で切り上げる前に7を加算するのと、切り上げた後に7を加算するのは同じなので「=CEILING(日付,7)+1」としても良いです。
5.先月末、今月末、来月末
問題
(1)今日の日付(TODAY)を用いて、先月末、今月末、来月末の日付を求めなさい。
(2)セルD1に西暦を4桁の整数で入力し、セルD2に月を1~12の整数で入力した。この年月の先月末、今月末、来月末の日付を求めなさい。
解説
月末を求める関数はEOMONTH関数です。
- =EOMONTH(日付,月)
EOMONTH関数の第2引数は今月を0としたときの月であり、先月、今月、来月はそれぞれ-1、0、1となります。
- 先月末:=EOMONTH(日付,-1)
- 今月末:=EOMONTH(日付,0)
- 来月末:=EOMONTH(日付,1)
年と月が与えられている場合、前月末の日付はDATE関数を用いて「DATE(年,月,0)」と表すことができます。DATE関数で日付を0にすると前月の最終日(末日)を表します。今月は月に1を足し、翌月は2を足します。
- 先月末:=DATE(年,月,0)
- 今月末:=DATE(年,月+1,0)
- 来月末:=DATE(年,月+2,0)
6.第1土曜日の求め方
問題
(1)今日の日付(TODAY)を用いて、今月の第1土曜日を求めなさい。また、翌月の第1土曜日を求めなさい。
(2)セルD1に西暦を4桁の整数で入力し、セルD2に月を1~12の整数で入力した。この年月の第1土曜日を求めなさい。
解説
ある月の末日が日曜日~土曜日だった場合を考えてみましょう。
このとき、7の倍数で切り上げ、次回の土曜日を求めると第1土曜日の日付となります。ただし、月末が土曜日の場合は翌週の土曜日(7日)が第1土曜日となります。
さきほどの次回土曜を求める数式「=CEILING(日付+1,7)」に当てはめると、第1土曜は「=CEILING(前月末+1,7)」となります。前月末の日付は「EOMONTH(日付,-1)」です(前述)。
- =CEILING(EOMONTH(日付,-1)+1,7)
翌月の場合はEOMONTHの第2引数を「0」にしたらよいです。翌々月なら「1」です。
- =CEILING(EOMONTH(日付,0)+1,7)
年と月が与えられている場合、前月末の日付は「DATE(年,月,0)」なので(前述)、「=CEILING(DATE(D1,D2,0)+1,7)」となります。なお、日付の0とその直後の「+1」の部分は足してもよいので、「=CEILING(DATE(D1,D2,1),7)」とすることができます。
7.第1*曜日の求め方
問題
(1)今日の日付(TODAY)を用いて、今月の第1日曜日を求めなさい。また、翌月の第1日曜日を求めなさい。
(2)セルA1に西暦を4桁の整数で入力し、セルA2に月を1~12の整数で入力した。この年月の第1水曜日を求めなさい。
解説
さきほど第1土曜日を求めましたが、曜日をずらせば考え方は同じです。要するに、前月末の日付から見て、次回の日曜日~金曜日を求めたらよいのです。
例えば、次回の日曜日は「=CEILING(日付,7)+1」なので、今月の第1日曜日は「=CEILING(前月末,7)+1」です。
- =CEILING(EOMONTH(TODAY(),-1),7)+1
翌月の場合はEOMONTHの第2引数を「0」にしたらよいです。翌々月なら「1」です。
- =CEILING(EOMONTH(TODAY(),0),7)+1
年と月が与えられている場合、前月末の日付は「DATE(年,月,0)」なので(前述)、次回水曜日を求める数式「=CEILING(日付+4,7)-3」にあてはめると、「=CEILING(DATE(年,月,0)+4,7)-3」となります。そして、日付の0とその直後の「+4」の部分は足してもよいので、「=CEILING(DATE(年,月,4),7)-3」となります。
次回の*曜日を求める数式は「CEILING(日付+N+1,7)-N」なので、第1*曜日は「CEILING(前月末+N+1,7)-N」となります。
- 第1*曜日・・・CEILING(前月末+N+1,7)-N
- TODAYの前月末・・・EOMONTH(TODAY(),-1)
- 第1日曜日:=CEILING(前月末+7,7)-6 (※)
- 第1月曜日:=CEILING(前月末+6,7)-5
- 第1火曜日:=CEILING(前月末+5,7)-4
- 第1水曜日:=CEILING(前月末+4,7)-3
- 第1木曜日:=CEILING(前月末+3,7)-2
- 第1金曜日:=CEILING(前月末+2,7)-1
- 第1土曜日:=CEILING(前月末+1,7)
(※)第1日曜日は「=CEILING(前月末,7)+1」としても良いです。
年と月が与えられている場合、第1*曜日は「CEILING(DATE(年,月,0)+N+1,7)-N」となります。そして、日付の0とその直後の「+N+1」の部分は足してもよいので、「CEILING(DATE(年,月,N+1),7)-N」となります。
- 第1*曜日・・・CEILING(DATE(年,月,N+1),7)-N
- 第1日曜日:=CEILING(DATE(年,月,7),7)-6 (※)
- 第1月曜日:=CEILING(DATE(年,月,6),7)-5
- 第1火曜日:=CEILING(DATE(年,月,5),7)-4
- 第1水曜日:=CEILING(DATE(年,月,4),7)-3
- 第1木曜日:=CEILING(DATE(年,月,3),7)-2
- 第1金曜日:=CEILING(DATE(年,月,2),7)-1
- 第1土曜日:=CEILING(DATE(年,月,1),7)
(※)第1日曜日は「=CEILING(DATE(年,月,0),7)+1」としても良いです。
8.第2、第3、第4、第5の曜日の求め方
問題
(1)今日の日付(TODAY)を用いて、今月の第2月曜日を求めなさい。
(2)セルA1に西暦を4桁の整数で入力し、セルA2に月を1~12の整数で入力した。この年月の第3月曜日を求めなさい。
解説
第1月曜日が「=CEILING(前月末+6,7)-5」なので、その7日後が第2月曜日です。7を加算すると「=CEILING(前月末+6,7)+2」になります。
- =CEILING(EOMONTH(TODAY(),-1)+6,7)+2
第1月曜日が「=CEILING(DATE(年,月,6),7)-5」なので、その14日後が第3月曜日です。
- =CEILING(DATE(年,月,6),7)+9
第1*曜日を求めることができたら、その7日後が第2*曜日、14日後が第3*曜日、21日後が第4*曜日、28日後が第5*曜日です。
- 第2日曜日:=CEILING(前月末,7)+8
- 第2月曜日:=CEILING(前月末+6,7)+2
- 第2火曜日:=CEILING(前月末+5,7)+3
- 第2水曜日:=CEILING(前月末+4,7)+4
- 第2木曜日:=CEILING(前月末+3,7)+5
- 第2金曜日:=CEILING(前月末+2,7)+6
- 第2土曜日:=CEILING(前月末+1,7)+7
- 第3日曜日:=CEILING(前月末,7)+15
- 第3月曜日:=CEILING(前月末+6,7)+9
- 第3火曜日:=CEILING(前月末+5,7)+10
- 第3水曜日:=CEILING(前月末+4,7)+11
- 第3木曜日:=CEILING(前月末+3,7)+12
- 第3金曜日:=CEILING(前月末+2,7)+13
- 第3土曜日:=CEILING(前月末+1,7)+14
- 第4日曜日:=CEILING(前月末,7)+22
- 第4月曜日:=CEILING(前月末+6,7)+16
- 第4火曜日:=CEILING(前月末+5,7)+17
- 第4水曜日:=CEILING(前月末+4,7)+18
- 第4木曜日:=CEILING(前月末+3,7)+19
- 第4金曜日:=CEILING(前月末+2,7)+20
- 第4土曜日:=CEILING(前月末+1,7)+21
- 第5日曜日:=CEILING(前月末,7)+29
- 第5月曜日:=CEILING(前月末+6,7)+23
- 第5火曜日:=CEILING(前月末+5,7)+24
- 第5水曜日:=CEILING(前月末+4,7)+25
- 第5木曜日:=CEILING(前月末+3,7)+26
- 第5金曜日:=CEILING(前月末+2,7)+27
- 第5土曜日:=CEILING(前月末+1,7)+28
9.TODAYを基準として前回の土曜日を求める
問題
今日の日付(TODAY関数)を用いて、前回の土曜日の日付を求めなさい。
解説
土曜日は必ず7の倍数になることが分かっています。今日(TODAY)が日曜日~金曜日の場合、シリアル値は7の倍数ではありませんが、その整数を7の倍数で切り捨てる(=7の倍数になるように日付を減らすという意味です)と、直前の土曜日になります。
Excelで倍数で切り上げる関数はFLOORです。したがって、「=FLOOR(TODAY(),7)」とすれば、前回の土曜日を求めることができます。
しかし、TODAYが土曜日だった場合、TODAY自身が7の倍数なので切り捨てても日付は変わりません。当日が土曜日だった場合は、当日の日付を返します。
土曜日当日に先週の土曜日(7日前)を表示したい場合は、1を引きます。
その後、7の倍数で切り捨てます。これで、日曜~金曜については直前の土曜日、土曜については7日前の土曜日を求めることができます。
数式では「=FLOOR(TODAY()-1,7)」となります。
10.TODAYを基準として前回の*曜日を求める
問題
今日の日付(TODAY関数)を用いて、前回の水曜日の日付を求めなさい。
解説
例えば、指定した日付の3日後を求めたとします。
その日付を7の倍数で切り捨てると、直前の土曜日になります(土曜日の場合は変わらない)。
3日前の日付を求めます。
これを元の日付と比較すると、直前の水曜日になっています。
つまり、7の倍数で切り捨てる前にあらかじめ3日足しておき、切り捨てた後で3日を引けば、前回の水曜日となります。数式では「=FLOOR(日付+3,7)-3」です。
- =FLOOR(TODAY()+3,7)-3
ただし、当日が水曜日の場合は翌週ではなく当日の日付を返します。
当日が水曜日の場合に先週の日付にするには、7の倍数で切り上げる前に1を引きます。数式では「=FLOOR(日付+2,7)-3」です。
このことは、水曜日以外でも同じことが言えます。日付にNを足し、7の倍数で切り捨ててからNを引きます。
- 当日が*曜日の場合、当日とする・・・FLOOR(日付+N,7)-N
- 当日が*曜日の場合、翌週とする・・・FLOOR(日付+N-1,7)-N
(当日がその曜日の場合、当日とする)
- 前回日曜日:=FLOOR(日付+6,7)-6
- 前回月曜日:=FLOOR(日付+5,7)-5
- 前回火曜日:=FLOOR(日付+4,7)-4
- 前回水曜日:=FLOOR(日付+3,7)-3
- 前回木曜日:=FLOOR(日付+2,7)-2
- 前回金曜日:=FLOOR(日付+1,7)-1
- 前回土曜日:=FLOOR(日付,7)
(当日がその曜日の場合、先週とする)
- 前回日曜日:=FLOOR(日付+5,7)-6
- 前回月曜日:=FLOOR(日付+4,7)-5
- 前回火曜日:=FLOOR(日付+3,7)-4
- 前回水曜日:=FLOOR(日付+2,7)-3
- 前回木曜日:=FLOOR(日付+1,7)-2
- 前回金曜日:=FLOOR(日付,7)-1
- 前回土曜日:=FLOOR(日付-1,7)
11.最終土曜日の求め方
問題
(1)今日の日付(TODAY)を用いて、今月の最終土曜日を求めなさい。
(2)セルD1に西暦を4桁の整数で入力し、セルD2に月を1~12の整数で入力した。この年月の最終土曜日を求めなさい。
解説
ある月の月末が日曜日~土曜日だった場合を考えてみましょう。
このとき、7の倍数で切り捨てて、前回の土曜日を求めると第1土曜日の日付となります。ただし、月末が土曜日の場合はその日が最終土曜日となります。
さきほどの前回土曜を求める数式「=FLOOR(日付,7)」に当てはめると、最終土曜は「=FLOOR(今月末,7)」となります。今月末の日付は「EOMONTH(日付,0)」です(前述)です。
- =FLOOR(EOMONTH(TODAY(),0),7)
年と月が与えられている場合、今月末の日付は「DATE(年,月+1,0)」です。
- =FLOOR(DATE(D1,D2+1,0),7)
12.最終*曜日の求め方
問題
(1)今日の日付(TODAY)を用いて、今月の最終木曜日を求めなさい。
(2)セルD1に西暦を4桁の整数で入力し、セルD2に月を1~12の整数で入力した。この年月の最終金曜日を求めなさい。
解説
さきほど最終土曜日を求めましたが、曜日をずらせば考え方は同じです。要するに、今月末の日付から見て、前回の日曜日~金曜日を求めたらよいのです。
例えば、前回の木曜日の式は「=FLOOR(日付+2,7)-2」なので、今月の最終木曜日は「=FLOOR(今月末+2,7)-2」となります。
- =FLOOR(EOMONTH(TODAY(),0)+2,7)-2
他の曜日も同様です。
- 最終日曜日:=FLOOR(今月末+6,7)-6
- 最終月曜日:=FLOOR(今月末+5,7)-5
- 最終火曜日:=FLOOR(今月末+4,7)-4
- 最終水曜日:=FLOOR(今月末+3,7)-3
- 最終木曜日:=FLOOR(今月末+2,7)-2
- 最終金曜日:=FLOOR(今月末+1,7)-1
- 最終土曜日:=FLOOR(今月末,7)
年と月が与えられている場合、今月末の日付は「DATE(年,月+1,0)」なので(前述)、今月の最終木曜日は「=FLOOR(DATE(年,月+1,0)+1,7)-1」となります。DATE関数の0とその直後の+1を足して、「=FLOOR(DATE(年,月+1,1),7)-1」となります。
13.何回目の何曜日か
問題
A列の日付が、その月で何回目の何曜日か(第N*曜日)を求めなさい。
解説
何回目かは日にちに6を足して7で割ります。
- =INT((DAY(A1)+6)/7)
曜日はTEXT関数を用いてTEXT(A1,"aaaa")です(参考:【Excel】TEXT関数で数値を文字列に変換するときの注意点と練習問題)。回数と曜日を連結します。
- ="第"&INT((DAY(A1)+6)/7)&TEXT(A1,"aaaa")
14.先週、今週、翌週、週番号の日付を求める
先週、今週、翌週の曜日の日付は、「日曜始まり」か「月曜始まり」かによって異なります。また、週番号から日付を求めたり、同じ週かを判定するにはWEEKNUM関数を使います。「週」単位で日付を計算する方法については別の記事で解説しています。
15.さいごに:日付に時刻を含む場合の注意点
問題
2020年9月26日は土曜日である。セルA1に「2020/9/26」、セルA2に「2020/9/26 18:00」と入力して、7の倍数で切り上げなさい。また、切り上げの計算結果が一致するようにするにはどうすればよいか。
解説
シリアル値が整数値の場合、午前0時を表します。そして、日付に時刻が含まれる場合、シリアル値は小数になります(参考:【Excel】時刻のシリアル値と時間計算の基本を理解するための練習問題)。例えば、2020年9月26日(土)のシリアル値は44100で、土曜日なので7で割り切れます。しかし、同じ日の午後6時は44100.75です。
日付の表示形式(yyyy/m/d)にします。セルA1は午前0時、セルA2は午後6時が入力されていますが、見た目は分かりません。
CEILINGを用いて、7の倍数で切り上げます。土曜日の日付を7の倍数で切り上げても変わりませんが、小数部分が含まれる場合はその部分が切り上げられるため、7日後の午前0時になってしまいます。
このように、日付に時刻(小数部分)が含まれる可能性がある場合は、INTで切り捨ててから上記の計算を行うようにしてください。
解説は以上です。