概要
「指定した曜日の日付」を見つける王道は、WEEKDAYで“曜日番号”を取り、ずれ日数を計算して加減算する方法です。コツは「月曜=1〜日曜=7(種類=2)」を使うこと。これなら「次の◯曜日」「前の◯曜日」「今月の第n◯曜日」「その月の最終◯曜日」まで、短い式で安定して求められます。
基本の考え方
WEEKDAY(日付,2)は「月=1, …, 日=7」を返します。求めたい曜日を“ターゲット番号”として、差分を7で割った余り(MOD)で「何日進める/戻すか」を作れば、到達日が一発で出せます。
- 次の指定曜日: 日付 + MOD(ターゲット − WEEKDAY(日付,2), 7)
- 前の指定曜日: 日付 − MOD(WEEKDAY(日付,2) − ターゲット, 7)
基本の使い方
次の指定曜日(今日が該当なら“今日”を返す)
=基準日 + MOD(ターゲット - WEEKDAY(基準日,2), 7)
例:次の「月曜(1)」を取りたい
=A2 + MOD(1 - WEEKDAY(A2,2), 7)
次の指定曜日(必ず“次回”=今日が該当でも翌週を返す)
=基準日 + MOD(ターゲット - WEEKDAY(基準日,2) + 7, 7)
例:必ず“次の月曜”
=A2 + MOD(1 - WEEKDAY(A2,2) + 7, 7)
前の指定曜日(今日が該当なら“今日”を返す)
=基準日 - MOD(WEEKDAY(基準日,2) - ターゲット, 7)
例:前の「金曜(5)」
=A2 - MOD(WEEKDAY(A2,2) - 5, 7)
具体例
今月の第n◯曜日
「当月の月初」から“最初の◯曜日”を見つけて、7日刻みでn−1回進めます。
=LET(
d, A2, /* A2に対象の任意の日付(当月を示す) */
n, B2, /* B2に欲しい順番(1=第1, 2=第2 …) */
tgt, 3, /* 例:水曜=3(月=1 … 日=7) */
mstart, EOMONTH(d,-1)+1,
first, mstart + MOD(tgt - WEEKDAY(mstart,2), 7),
first + 7*(n-1)
)
LETが使えない環境なら1行で:
=EOMONTH(A2,-1)+1 + MOD(3 - WEEKDAY(EOMONTH(A2,-1)+1,2), 7) + 7*(B2-1)
今月の“最終”◯曜日
「当月の月末」から逆算します。
=LET(
d, A2, /* A2で当月を指定 */
tgt, 5, /* 例:金曜=5 */
mend, EOMONTH(d,0),
mend - MOD(WEEKDAY(mend,2) - tgt, 7)
)
1行版:
=EOMONTH(A2,0) - MOD(WEEKDAY(EOMONTH(A2,0),2) - 5, 7)
“今週の◯曜日”(週の基準が月曜始まり)
「今週の月曜」を起点にオフセットします。
=LET(
today, TODAY(),
tgt, 2, /* 例:火曜=2 */
monday, today - WEEKDAY(today,2) + 1,
monday + (tgt-1)
)
応用テンプレート
指定範囲から“◯曜日だけ”抽出(Microsoft 365)
=FILTER(A2:A100, WEEKDAY(A2:A100,2)=ターゲット)
例:水曜(3)だけ
=FILTER(A2:A100, WEEKDAY(A2:A100,2)=3)
指定曜日を連番で並べる(当月の全◯曜日)
=LET(
d, A2, tgt, 1, /* 例:月曜=1 */
mstart, EOMONTH(d,-1)+1,
mend, EOMONTH(d,0),
first, mstart + MOD(tgt - WEEKDAY(mstart,2), 7),
k, SEQUENCE(6,1,0,1), /* 最大6回分用意 */
FILTER(first + 7*k, first + 7*k <= mend)
)
指定曜日の“次回通知日”と“直前準備日”(営業日ベース)
“曜日指定”ではなく“営業日でn日前/後”が欲しいときはWORKDAYを併用。
次回◯曜日: (上の式で到達日)
準備日(2営業日前): =WORKDAY(到達日, -2, 祝日範囲)
よくあるつまずきと対策
種類=2を使う
種類を省略すると「日=1 … 土=7」になり、意図した条件(>=6が土日など)とズレます。曜日計算は“種類=2(月=1 … 日=7)”が最も扱いやすいです。
ターゲット番号の間違い
月=1, 火=2, 水=3, 木=4, 金=5, 土=6, 日=7。表の“見た目の曜日”ではなく、この番号で指定します。
今日がすでにターゲット曜日の扱い
「今日も可」なら基本式でOK。「必ず次回にしたい」なら +7 を足してMODする版を使います(前述の“必ず次回”式)。
月内に“第5◯曜日”が存在しない
第5を要求しても月末を超える場合があります。SEQUENCE+FILTERで“月末を超えた分”は落とす設計にすると安全です。
文字列日付・時刻混在
“YYYY/MM/DD”の文字列は誤解釈の原因。日付は正しく入力するかDATEで生成。時刻付きでもWEEKDAYは日付部分を見ますが、比較ロジックではINTで日付に丸めると安心です。
例題
問題1: A2を基準に「次の月曜(今日が月曜なら今日)」の日付をB2に表示してください。
=B2: =A2 + MOD(1 - WEEKDAY(A2,2), 7)
問題2: A2を基準に「必ず次回の月曜(今日が月曜でも翌週)」をB2に表示してください。
=B2: =A2 + MOD(1 - WEEKDAY(A2,2) + 7, 7)
問題3: A2の属する“今月の第3水曜”をB2に表示してください。
=B2: =EOMONTH(A2,-1)+1 + MOD(3 - WEEKDAY(EOMONTH(A2,-1)+1,2), 7) + 7*(3-1)
問題4: A2の属する“今月の最終金曜”をB2に表示してください。
=B2: =EOMONTH(A2,0) - MOD(WEEKDAY(EOMONTH(A2,0),2) - 5, 7)
問題5: 今日の“今週の火曜”の日付をB2に表示してください(月曜始まりで定義)。
=B2: =LET(today, TODAY(), monday, today - WEEKDAY(today,2) + 1, monday + (2-1))
まとめ
指定曜日の探索は「WEEKDAY(日付,2)で番号化」→「MODでずれ日数」→「加減算」の三手で完了します。これで“次/前の◯曜日”“今月の第n/最終◯曜日”“今週の◯曜日”まで一貫して組めます。月内の存在判定や翌週強制などの微調整は、MODの扱い(+7の付加)とEOMONTHの併用で柔軟に対応できます。
