Excelで祝日を自動計算(春分/秋分の日)。勤務表サンプルファイル有(ダウンロード可能)

この記事は約6分で読めます。

Excelでカレンダー計算をすることは意外と多いです。

一般的には「勤怠表」などの作成と思いますが、システム開発の現場では「タスク管理(予定・実績)」が一番多いのではないでしょうか。

現場が変わると(セキュリティの都合上)毎回作り直すことになるのですが、その都度ググるのが面倒なんですよ。
日付・時刻の計算や祝日自動計算は基本なのに、全然記憶できないんですよね…。


祝日計算は年に一度カレンダーを見ながら手打ちするとか、Excel向けに祝日一覧をコピーできるサイトも存在しますが、完全メンテナンスフリー希望。
目指すは「万年カレンダー」ですよ!
(自他共に認めるズボラ派です)

祝日の計算式だけ知りたい人は、記事の後半「祝日の計算式(全パターンに対応)」まで飛ばしてください。

時刻の変換

説明文に出てくる「A1」は、A1セルに計算対象の値が入っているものという仮定です。

数値90(分) ⇒ 1:30 にする方法

「90(表示形式=G/標準)」の場合、
「1:30(表示形式=h:mm)」で表示するには、A1/24/60 もしくは A1/1440 と計算式に入れます。

計算式一覧

時=「1/24」。5時は「5*(1/24)」「5/24」
分=「1/24 さらに 1/60」つまり「1/1440」。15分は「15*(1/1440)」「15/1440」
秒=「1/24 さらに 1/60 さらに 1/60」つまり「1/86400」。45秒は「45*(1/86400)」「45/86400」

900,1800入力方式から時刻にする

Excel機能で時刻入力するときは「:(コロン)」を毎回打ち込む必要があるのですが、正直面倒です。
そのため自作の管理表は「900」で「09:00」、「1800」で「18:00」と表示されるようにセルの書式設定を弄っています

数値入力だけ(コロン無し)で時間入力できるのはとても便利なのですが、
時刻計算する場合は、時刻として扱えるように変換する必要があります。

文字列の時刻を、時刻書式で扱えるように変換する方法

=INT(A1/100)/24 + (A1-INT(A1/100)*100)/24/60

前半の「INT(A1/100)/24」が「時」、後半の「(A1-INT(A1/100)*100)/24/60」が「分」です。

例えば「0915」の場合、
時:
INT(A1/100) = 9
9 / 24 =「09:00」

分:
INT(A1/100) = 9
INT(A1/100)*100 = 900
A1 – 900 = 15
15 / 24 / 60 = 「0:15」

「09:00」+「0:15」=「09:15」 という結果になります。

祝日の計算式(全パターンに対応)

祝日は計算式で求められます(春分の日、秋分の日も計算可能です)

A1セルは年(「2021」など)が入っている想定の計算式を列記します。
計算式内では「$A$1」としています(コピーで参照位置が変わるのを避けるため)

下図のように一年の祝日をまとめて、VLOOKUP関数で呼ぶのも良いですし、
「名前の管理」対象にしてしまうのもおススメです(詳細は後述「祝日の使い方」参照)。

今年はオリンピックで、海の日・スポーツの日・山の日(8/11)が移動してしまっています。
カレンダー業界も振り回されて大変そうですね。

祝日の計算式(○月の第○月曜日方式の祝日)

年に4回だけなのですね。もっと多いと思っていました。

成人の日(1月第2月曜日)
=DATE($A$1,1,14-MOD(WEEKDAY(DATE($A$1,1,1))+4,7))
海の日(7月第3月曜日)
=DATE($A$1,7,21-MOD(WEEKDAY(DATE($A$1,7,1))+4,7))
敬老の日(9月第3月曜日)
=DATE($A$1,9,21-MOD(WEEKDAY(DATE($A$1,9,1))+4,7))
スポーツの日(10月第2月曜日)
=DATE($A$1,10,14-MOD(WEEKDAY(DATE($A$1,10,1))+4,7))

祝日の計算式(日付固定の祝日)

建国記念日
=DATE($A$1,2,11)
天皇誕生日
=DATE($A$1,2,23)

分かりやすいと思いますので、3月以降は割愛します。

振替休日の計算式(基本)

建国記念日の振替休日
=IF(WEEKDAY(B7)=1,B7+1,B7) ※B7は建国記念日の計算式のセル
天皇誕生日の振替休日
=IF(WEEKDAY(B9)=1,B9+1,B9) ※B9は天皇誕生日の計算式のセル

祝日が日曜日なら、計算結果は翌日の日付になります。
日曜日ではない場合、計算結果には同じ日付が入ります。

振替休日の計算式(特殊)

ゴールデンウィーク、シルバーウィークのみ振替休日の計算が特殊になります

ゴールデンウィークの振替休日
=IF(OR(WEEKDAY(B15)=1,WEEKDAY(B16)=1,WEEKDAY(B17)=1),B17+1,B17)
B15, B16, B17 には、憲法記念日(5/3)・みどりの日(5/4)・こどもの日(5/5)が入っている想定です。

5/3~5/5のいずれかが日曜日なら、5/6が休日になるという計算式です。

祝日法第3条は『祝日と祝日にはさまれた平日は「国民の休日」とする』という趣旨の内容です。
1985年以前は5月4日は平日でしたが、法改正で5月4日は「国民の休日」になりました。
2007年に「みどりの日」として正式な祝日になった経緯があります。


シルバーウィーク計算
=IF(WEEKDAY(TEXT(B25,”YYYY/MM/DD”),1)=4,B25-1,B25)
B25には秋分の日が入っている想定です。

敬老の日は月曜日なので、秋分の日が水曜日ならシルバーウィーク休日が(火曜日に)発生することになります。


今では、国民の休日が発生するのはシルバーウィークのみです。
2003年に敬老の日が「9月15日」⇒「9月第3月曜日」になって以降、シルバーウィークの回数を数えてみました(←暇人)

「国民の休日」で、土日月火水の5連休になる年(だいたい5~6年毎)
2009年、2015年、2026年、2032年、2037年、2043年、2049年

秋分の日が火曜日で、土日月火の4連休になる年
2020年、2048年

春分の日、秋分の日

ハッキリ言って呪文です。私も理解していません(笑)。秘伝のタレ状態です。
20年以上前に先輩に教えてもらって以来、一度もずれたことが無いので使い続けています(一応、毎年カレンダーで確認してます)。

秋分の日の計算式は、2107年頃までは正しく使えそうですね。

春分の日
=DATE($A$1,3,INT(20.8431+0.242194*($A$1-1980)-INT(($A$1-1980)/4)))
秋分の日
=IF(MOD($A$1,4)=0,IF($A$1<=2008,DATE($A$1,9,23),DATE($A$1,9,22)),IF(MOD($A$1,4)=1,IF($A$1<=2041,DATE($A$1,9,23),DATE($A$1,9,22)),IF(MOD($A$1,4)=2,IF($A$1<=2074,DATE($A$1,9,23),DATE($A$1,9,22)),DATE($A$1,9,23))))


記事書くのにググってたら春分の日と同じパターンの計算式を発見。

春分の日 再掲
=DATE($A$1,3,INT(20.8431+0.242194*($A$1-1980)-INT(($A$1-1980)/4)))
秋分の日
=DATE($A$1,9,INT(23.2488+0.242194*($A$1-1980)-INT(($A$1-1980)/4)))

1980-2099年(現在の値)
20.8431(春分の日)
23.2488(秋分の日)

2100-2150年になったら
21.8510(春分の日)
24.2488(秋分の日)

に置き換えればOKです。
謎の数値は、使える期間が限定のようですね。天文学方面は全く分かりません。この数値を算出した学者さんスゲー。

ちなみに、0.242194 は固定です

祝日の使い方

使い方は、大きく分けて2つあります。

  1. VLOOKUP関数の引数として使う
  2. 「名前の管理」対象にする

個人的には2番がシンプルに処理できるのでお勧めです。
VLOOKUP関数の場合、祝日以外の日付は「#N/A」エラーになるので、ここを非表示にするとか計算対象外にするとかの制御が面倒なのです。
(IF関数とISERROR関数を駆使して、計算式を組み立てることになります)


「名前の管理」の使い方
「数式」タブ ⇒ 「名前の管理」で、『祝祭日』を参照範囲(セル範囲)で登録します。
(参照範囲の「祝日」はシート名なので、皆さんの環境では異なる場合があります)

上図のように『祝祭日』を登録した場合、計算式は次のようになります。
=IF(COUNTIF(祝祭日,B4)>0,IF(AND(WEEKDAY(B4)>=2,WEEKDAY(B4)<=6),1,0),0)

月曜~金曜祝日に該当する場合は1を、それ以外は0にする
という処理です。
B4は計算対象の日付が入っている想定です(例:2021/05/03 などの日付の値)


COUNTIFで「今日の日付(B4セル)」と『祝祭日』の日付一覧を比較して、一致するものが1件以上あれば [値が真の場合]の処理を実行する。

[値が真の場合]の処理:
曜日が2(月曜)以上、6(金曜)以下の場合は「1」、それ以外は「0」

勤怠表サンプル(Excel)

勤怠表のサンプルファイルを作りました。

勤務表サンプル
クリックすると、ファイルダウンロードできます。

IFS関数をF列で使用しています。
Excel2016以降なら使えると思いますが、万一使えなかった場合は代替用の計算式を欄外に書いておきましたので、コピーして置換えてください。
Excel2013以前でも使えるようになります。

(買切り型のExcelで使えない事例があるようです。月々払いのサブスクなら問題ありません)


サンプルファイルは、祝日シートを参照していただく他にも、参考になる箇所がいくつかあると思います。

日付セルの色
「ホーム」⇒「条件付き書式(ルールの管理)」
日付表示(曜日の表示方法)
「セルの書式設定」⇒「表示形式」⇒種類「d(aaa)」
ゼロを非表示にする
「セルの書式設定」⇒「表示形式」⇒種類「[hh]:mm;;;@」

「[hh]:mm;;;@」は便利です。
書式を4パターンで設定できて、「;(半角セミコロン)」で区切ります。

A;B;C;D という表現を行い、詳細は

A:正の値のときの書式
B:負の値のときの書式
C:ゼロのときの書式
D:文字列のときの書式

です。なので「[hh]:mm;;;@」は「負とゼロの時は非表示」「文字列はそのまま表示」という意味になります。

これを知らない頃は、
=IF(A1>0,A1*8,””)
のように「””」で空文字列にしていました。

計算式が(処理分岐で)長く見辛くなるのが嫌なので、書式で非表示にできると知ってからは非表示にしたい時はゼロを入れるようになりました。計算式もシンプルになりました。

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