いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)直近のx曜日の日付を求める

 Excelで、基準となる日付に最も近いx曜日の日付を求める方法についてです。
 基準日の曜日に基づき一定の日数を加える方法がメジャーですが、式の意味がつかみにくい難点がありますので、ここでは別のアプローチを紹介します。

  • WEEKDAY.INTL関数を使って、基準日に最も近いx曜日の日付を求めることができます。
  • SEQUENCE関数やFILTER関数等を使う方法もあります。手法は独特ですが式がやや複雑で長くなります。
  • どちらの方法でも、基準日を含めて検索することができます。基準日の直前のx曜日を求めるのも容易です。

手順

基準日を結果に含めない場合

WEEKDAY.INTL関数を使う例

f:id:accs2014:20200922100103p:plain:right:w450

 次の画像では、C2セルに「2020/9/15」という日付が入力されています。この日は火曜日ですのでご留意ください。

 この日からみて直近の(ただし基準日当日を含まないものとします)各曜日を求めるため、C5からC11の各セルにそれぞれ次のような式を入力しています。

 C5~C11セル(直近の日曜~土曜の日付)

=WORKDAY.INTL(C2,1,"1111110")
=WORKDAY.INTL(C2,1,"0111111")
=WORKDAY.INTL(C2,1,"1011111")
=WORKDAY.INTL(C2,1,"1101111")
=WORKDAY.INTL(C2,1,"1110111")
=WORKDAY.INTL(C2,1,"1111011")
=WORKDAY.INTL(C2,1,"1111101")

 WORKDAY.INTL関数はWORKDAY関数と同様に平日(営業日)を求めるための関数ですが、何曜日が休日なのかを第3引数で指定することができます。この引数は数値で指定することもできますが、このように月~日曜日の各曜日が0(平日)か1(休日)かを一括して表す文字列として指定することもがきます。
 これを利用して、求めたい曜日だけを平日とみなして直近の日付を求めるというわけです。
 

f:id:accs2014:20200922100107p:plain:right:w400

 確定すると結果はこうなります。
 日付のシリアル値が表示されますので、セルの書式設定で表示形式を「日付」に変更すると……

 

f:id:accs2014:20200922100111p:plain:right:w400

 日付の形で結果を得ることができました。
 直近の火曜日は基準日の7日後であり(基準日当日ではない)、その他の曜日についても正しい結果が得られていることが確認できます。

SEQUENCE関数やFILTER関数等を使う例

f:id:accs2014:20200920140921p:plain:right:w600

 ここでもC2セルに「2020/9/15」という日付が入力されています。
 この日は火曜日です

 この日からみて直近の(ただし基準日当日を含まない)各曜日を求めるため、C5からC11の各セルにそれぞれ次のような式を入力しています。

 C5~C11セル(直近の日曜~土曜の日付)

=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=1))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=2))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=3))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=4))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=5))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=6))
=LET(週間,SEQUENCE(7,,C2+1),FILTER(週間,WEEKDAY(週間)=7))

 「SEQUENCE(7,,C2+1)」の部分で基準日の翌日から7日間の日付を生成しています。そしてFILTER関数とWEEKDAY関数を使い、7日間の日付の中で目的の曜日に該当するものを抽出しています。
 LET関数を使って「SEQUENCE(7,,C2+1)」の部分に「週間」という名前を与えることで同じ式を繰り返し入力せずに済み、長さも若干短縮しています。
 

f:id:accs2014:20200920140929p:plain:right:w450

 確定すると日付のシリアル値が表示されますので、セルの書式設定で表示形式を「日付」に変更して日付の形で結果を得ることができました。
 上記の例と全く同じく、正しい結果が得られていることが確認できます。

基準日を結果に含める場合

WEEKDAY.INTL関数を使う例

f:id:accs2014:20200922100116p:plain:right:w450

 ここでもC2セルに記録された「2020/9/15」(火曜日)の直近の各曜日を求めます。
 ただしここでは「直近」に当日を含むものとします。

 C5からC11の各セルにそれぞれ次のような式を入力しています。

=WORKDAY.INTL(C2-1,1,"1111110")
=WORKDAY.INTL(C2-1,1,"0111111")
=WORKDAY.INTL(C2-1,1,"1011111")
=WORKDAY.INTL(C2-1,1,"1101111")
=WORKDAY.INTL(C2-1,1,"1110111")
=WORKDAY.INTL(C2-1,1,"1111011")
=WORKDAY.INTL(C2-1,1,"1111101")

 WORKDAY.INTL関数の第1引数を「C2-1」つまり基準日の前日とすることで、基準日当日を含む日付を検索しています。
 第2引数が「1」(次の平日)ですので基準日の前日がそのまま返ってくることはありません。
 

f:id:accs2014:20200922100121p:plain:right:w400

 こちらも式を確定後、セルの書式設定で表示形式を「日付」に変更すると完成です。
 直近の火曜日は基準日当日で、その他の曜日についても正しい結果が得られていることが確認できます。

SEQUENCE関数やFILTER関数等を使う例

f:id:accs2014:20200920140933p:plain:right:w600

 上記の例と同じくC2セルに記された基準日「2020/9/15」の直近の各曜日を求めます。
 「直近」には当日を含むものとします。

 C5からC11の各セルには次のように入力しています。

 C5~C11セル(直近の日曜~土曜の日付)

=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=1))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=2))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=3))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=4))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=5))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=6))
=LET(週間,SEQUENCE(7,,C2),FILTER(週間,WEEKDAY(週間)=7))

 「SEQUENCE(7,,C2)」の部分により、基準日当日を含む7日間の日付を生成しています。
 あとはFILTER関数とWEEKDAY関数を使ってを使って目的の曜日に該当するものを抽出しています。
 

f:id:accs2014:20200920140938p:plain:right:w450

 式を確定後、セルの書式設定で表示形式を「日付」に変更して完成です。
 直近の火曜日は基準日当日で、その他の曜日についても正しい結果となっています。

基準日の直前のx曜日を求める場合

WEEKDAY.INTL関数を使う例

 画像は省略しますが、上記の式中、WORKDAY関数の第2引数を「-1」にすれば直前のx曜日が求められます。

SEQUENCE関数やFILTER関数等を使う例

 上記の式中、SEQUENCE関数の第3引数を「C2-7」に変えれば当日を含まない直前のx曜日が求められます。
 同様に「C2-6」に変えれば当日を含む直前のx曜日を求めることができます。