Excelに日本の祝日を判定する関数はない。土日はWEEKDAYで分かるが、祝日は分からない。やり方は1つで、祝日の一覧をシートに持たせてCOUNTIFで突き合わせる。その一覧は内閣府が配っているCSVから作れる。
以下の式と数字は、2026年9月20日にMicrosoft 365のExcel(バージョン16)で実際に計算させた結果だ。CSVも同じ日に取得した。
祝日の一覧は内閣府のCSVにある
配布元は内閣府の「国民の祝日について」のページで、ファイル名はsyukujitsu.csv。中身は2列で、1列目が日付、2列目が名称になっている。
取得した時点で1,067行あり、1955年1月1日から2027年11月23日までが入っていた。年ごとの行数は2025年が19、2026年が18、2027年が17。文字コードはShift_JISで、UTF-8を前提にした道具で開くと文字化けする。Pythonでutf-8として読むと、1バイト目でinvalid start byteになった。Excelで開くぶんには問題なく日本語が出る。
シートに貼るときは、日付の列が文字列ではなく日付として入っているかを確かめる。セルを選んで右下の合計欄に日付の合計が出れば数値として入っている。左寄せのまま表示されているなら文字列で、この後の式が効かない。
1日ぶんの判定はCOUNTIFで足りる
祝日シートのA列に日付が並んでいるとして、ある日が休みかどうかはこの式で出る。
=IF(OR(WEEKDAY(A2,2)>5,COUNTIF(祝日!$A:$A,A2)>0),"休","営業")
WEEKDAYの第2引数に2を渡すと、月曜が1、日曜が7になる。だから>5が土日にあたる。祝日はCOUNTIFで一覧に当たるかを見る。2026年5月6日で試すと「休」、5月7日は「営業」と出た。
祝日の名前まで出したいならINDEXとMATCHで引く。
=IFERROR(INDEX(祝日!$B:$B,MATCH(A2,祝日!$A:$A,0)),"祝日ではない")
2026年5月6日でこれを計算させたら「休日」と返ってきた。振替休日という名前ではなく、CSVの2列目がそのまま出る。この点は後で書く。
列全体を渡すとWORKDAYが#VALUE!になる
営業日の計算はWORKDAYとNETWORKDAYSを使う。ここで最初につまずいた。COUNTIFと同じつもりで祝日の列全体を渡したら、エラーになった。
| 祝日に渡した範囲 | 2026/4/28の3営業日後 |
|---|---|
祝日!$A$2:$A$36(データだけ) |
2026/05/07 |
祝日!$C:$C(見出しのない列全体) |
2026/05/07 |
祝日!$A:$A(1行目に見出しがある列全体) |
#VALUE! |
| 文字列で入れた日付の範囲 | 2026/05/07 |
原因は1行目の見出しだ。「日付」という文字がWORKDAYの休日リストに混ざると、日付に変換できずにエラーになる。COUNTIFは文字が混ざっていても無視するので通る。同じ範囲指定でも、関数によって結果が変わる。
面白いのは4行目で、日付を文字列として入れた一覧でもWORKDAYは正しく計算した。Excelが文字列を日付に変換してくれる。つまりエラーの原因は文字列そのものではなく、日付に見えない文字が混ざっていることだった。
対処は単純で、見出しの行を含まない範囲を指定する。祝日!$A$2:$A$100のように、余裕を持った終端にしておけば行を足しても直さずに済む。
祝日を渡すかどうかで、年間17日変わる
同じNETWORKDAYSでも、祝日の一覧を渡すかどうかで結果が変わる。2026年で計算させた。
| 期間 | 土日だけ除く | 土日と祝日を除く |
|---|---|---|
| 2026年5月 | 21日 | 18日 |
| 2026年(通年) | 261日 | 244日 |
| GW 4/29〜5/6 | 6日 | 2日 |
| 年末年始12/29〜1/3 | 4日 | 3日 |
通年で17日の差になる。月平均にすると1.4日だ。人月で見積もりを出している職場なら、この17日は無視できない。納期の計算でも同じで、2026年4月28日の3営業日後は、祝日を渡すと5月7日、渡さないと5月1日になった。4日ずれる。
WORKDAYは期日の計算に、NETWORKDAYSは日数の集計に使う。月末が土日祝のときに「その前の営業日」を出したいなら、翌日から1営業日戻す書き方がある。
=WORKDAY(EOMONTH(A2,0)+1,-1,祝日!$A$2:$A$100)
2026年5月で計算させると5月29日が返った。5月31日は日曜、30日は土曜なので、金曜まで戻っている。締め日の計算にそのまま使える。
土日以外が休みの職場はWORKDAY.INTL
土日休みでない職場ではWORKDAY.INTLとNETWORKDAYS.INTLを使う。第3引数に週末のパターンを渡す。数字のコードか、7文字の文字列で指定できる。
文字列は月曜から日曜の順で、休みの曜日を1、働く曜日を0にする。水曜と日曜が休みなら"0010001"になる。この指定で2026年4月28日の3営業日後を計算させたら5月2日と出た。土曜に働く前提なので、土日休みの5月7日より早くなる。
日曜だけが休みの店なら、数字のコード11を渡す。2026年5月の営業日数は23日と出た。土日休みの18日より5日多い。
この一覧は2027年11月で切れる
取得したCSVの最後の行は2027年11月23日の勤労感謝の日だった。2028年の行は0件だ。
ここが静かに効いてくる。祝日リストが切れた先の日付を計算させても、エラーは出ない。祝日がないものとして営業日を数えるだけだ。2028年2月11日は建国記念の日で金曜にあたるが、今の一覧には入っていない。2月7日から12日の営業日数を数えさせたら5日と出た。正しくは4日だ。
なぜ2027年までしかないかというと、祝日が毎年決まるものだからだ。内閣府のページには、春分の日と秋分の日は法律で日付が決まっておらず、国立天文台が前年の2月に官報で発表する、と書かれている。だから数年先の祝日は、まだ存在しない。
対策は運用でしかない。私は毎年2月にCSVを取り直して、祝日シートの行を足している。テンプレートに埋め込む場合は、シートの隅に取得日と「どこまで入っているか」を書いておく。配布している勤怠管理のテンプレートとガントチャートのテンプレートも、この形で祝日シートを持たせてある。
振替休日と国民の休日は、名前では区別できない
CSVの2列目を見ると、「休日」とだけ書かれた行がある。取得した全期間で118行あった。この「休日」には2種類が混ざっている。
1つは振替休日だ。祝日が日曜と重なったとき、その後のいちばん近い平日が休みになる。2026年5月3日の憲法記念日は日曜で、曜日を計算させると7(日曜)と出た。翌日の5月4日はみどりの日、5日はこどもの日なので、振替は5月6日まで送られる。CSVに5月6日の「休日」が入っているのはこのためだ。
もう1つは国民の休日で、前後の両方が祝日である平日が休みになる。2026年9月22日がこれにあたる。前日の21日は敬老の日で月曜、翌日の23日は秋分の日で水曜だった。あいだの火曜が自動的に休みになる。
集計でこの2つを分けたいときは、名前では分けられない。日付の前後を見て判定する式を自分で書くことになる。私の表では分けていない。給与計算でも工程表でも、休みかどうかだけが要るからだ。
土日と祝日に色を付ける
条件付き書式に入れる式は、判定の式からIFを外したものになる。A列に日付が並ぶ表で、行全体に色を付けるなら、範囲を選んでから新しいルールの「数式を使用して」にこの式を入れる。
=OR(WEEKDAY($A2,2)>5,COUNTIF(祝日!$A:$A,$A2)>0)
列だけを固定して行は固定しない。$A2の形にする。ここを$A$2にすると、全部の行が2行目の日付で判定されて、表全体が同じ色になる。私はこれを何度もやった。
日曜と祝日を赤、土曜を青に分けるなら、ルールを2つ作る。祝日を含む赤いほうを上に置く。条件付き書式は上のルールから順に当たるので、祝日の土曜を赤にしたいならこの順番になる。2026年の祝日18日のうち、土日と重なるのは1日だけだった。月曜は7日ある。ハッピーマンデーの影響で、祝日は月曜に寄っている。
自分の表に入れるとき
必要なのは祝日シート1枚と、判定の列1つだ。CSVを貼り付けて、日付の列が日付になっていることを確かめる。判定の式で参照する範囲は、見出しの行を外した$A$2:$A$200のような形にする。
式が効かないときに見る場所は3つある。判定がすべて「営業」になるなら、祝日の列が文字列になっている。#VALUE!が出るなら、WORKDAYに渡した範囲に見出しか空白以外の文字が混ざっている。特定の年だけ判定が外れるなら、その年の行がCSVに入っていない。
シフト表を作るなら、祝日の判定は必要人数の切り替えにも使える。平日と土日祝で必要な人数が違う職場が多いので、判定の列を必要人数の式に渡す。その仕組みはシフト表の関数の記事に書いた。
出典: 内閣府「国民の祝日について」および同ページで配布されているsyukujitsu.csv(2026年9月20日取得、1,067行、1955年1月1日から2027年11月23日まで)。式の結果はすべて同日にMicrosoft 365のExcel(バージョン16)で計算させたもの。



