Excel関数 逆引き集 | 指定曜日の日付を探す → WEEKDAY+計算

Excel
スポンサーリンク

概要

「指定した曜日の日付」を見つける王道は、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の併用で柔軟に対応できます。

タイトルとURLをコピーしました