Excelで祝日を自動判定・計算する方法|関数・条件付き書式・VBAを完全解説

Excelで日付を扱う業務では、「祝日を自動で判定して色を変えたい」「祝日を除いた営業日数を計算したい」というニーズが頻繁に発生します。
しかし、Excelには祝日を自動判定する専用関数がないため、正しい方法を知らないと手動対応になりがちです。
本記事では、祝日リストの作成方法から、関数による祝日判定、条件付き書式での自動色付け、WORKDAY/NETWORKDAYS関数による営業日計算、さらにVBAによる完全自動化まで、段階的に解説します。
- Excel用の祝日リストの効率的な作り方(2024〜2026年対応)
- COUNTIF・MATCH関数で祝日を自動判定する方法
- 条件付き書式で祝日セルに自動で色を付ける方法
- WORKDAY関数・NETWORKDAYS関数で営業日を計算する方法
- VBAマクロで祝日処理を完全自動化する方法
Sub 祝日一覧生成()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range(“A1:B1”).Value = Array(“日付”, “祝日名”)
ws.Range(“A2”).Value = “2026/1/1”
ws.Range(“B2”).Value = “元日”
ws.Range(“A3”).Value = “2026/1/12”
ws.Range(“B3”).Value = “成人の日”
ws.Range(“A4”).Value = “2026/2/11”
ws.Range(“B4”).Value = “建国記念の日”
ws.Range(“A5”).Value = “2026/2/23”
ws.Range(“B5”).Value = “天皇誕生日”
ws.Range(“A6”).Value = “2026/3/20”
ws.Range(“B6”).Value = “春分の日”
End Sub
| A | B | |
|---|---|---|
| 1 | 日付 | 祝日名 |
| 2 | 2026/1/1 | 元日 |
| 3 | 2026/1/12 | 成人の日 |
| 4 | 2026/2/11 | 建国記念の日 |
| 5 | 2026/2/23 | 天皇誕生日 |
| 6 | 2026/3/20 | 春分の日 |
☝ 年を変更すれば任意の年の祝日を生成できます
Excelで祝日を扱うための基礎知識
Excelには「祝日を自動取得する機能」はありません。そのため、祝日を扱うには祝日リスト(テーブル)を自分で用意し、関数で参照する必要があります。
なぜExcelに祝日機能がないのか
- 祝日は国によって異なる(日本固有の祝日を自動判別する機能はない)
- 祝日は法改正で変わることがある(例: 2016年「山の日」追加、2020年東京五輪特別移動)
- 会社独自の休日(創立記念日等)も考慮が必要
祝日処理で使う3つのアプローチ
| 方法 | 難易度 | 用途 |
|---|---|---|
| 関数(COUNTIF/MATCH)+ 条件付き書式 | ★☆☆ | カレンダーの祝日色付け |
| WORKDAY / NETWORKDAYS関数 | ★☆☆ | 営業日数・納期計算 |
| VBAマクロ | ★★★ | 祝日リスト自動更新・大量処理 |
祝日リストの作り方|3つの方法
祝日判定の基盤となる「祝日リスト」を作成します。
方法1: 手動で入力する(最もシンプル)
| A列(日付) | B列(祝日名) |
|---|---|
| 2026/1/1 | 元日 |
| 2026/1/13 | 成人の日 |
| 2026/2/11 | 建国記念の日 |
| 2026/2/23 | 天皇誕生日 |
| 2026/3/20 | 春分の日 |
| 2026/4/29 | 昭和の日 |
| 2026/5/3 | 憲法記念日 |
| 2026/5/4 | みどりの日 |
| 2026/5/5 | こどもの日 |
| 2026/5/6 | 振替休日 |
| 2026/7/20 | 海の日 |
| 2026/8/11 | 山の日 |
| 2026/9/21 | 敬老の日 |
| 2026/9/23 | 秋分の日 |
| 2026/10/12 | スポーツの日 |
| 2026/11/3 | 文化の日 |
| 2026/11/23 | 勤労感謝の日 |
ポイント:
- A列は必ず「日付形式(yyyy/m/d)」で入力
- テーブル化(Ctrl+T)しておくと、行追加時に自動拡張される
- 振替休日も忘れずに追加
方法2: 内閣府の公開データを利用する
内閣府のWebサイトで祝日データがCSV形式で公開されています。
手順:
- 内閣府「国民の祝日について」ページにアクセス
- 「国民の祝日」のCSVファイルをダウンロード
- Excelで開き、日付列を日付形式に変換
- 「祝日リスト」シートに貼り付け
方法3: Excelの名前付き範囲で管理する
祝日リストを名前付き範囲として定義すると、数式がわかりやすくなります。
手順:
- 祝日リストのA列(日付)を選択
- 「数式」タブ → 「名前の定義」をクリック
- 名前に「祝日リスト」と入力 → OK
- 以降の数式で「祝日リスト」という名前で参照可能
関数で祝日を判定する方法|COUNTIF・MATCH
COUNTIF関数で祝日を判定する
数式: =COUNTIF(祝日リスト,A1)>0
- 結果がTRUE → A1の日付は祝日
- 結果がFALSE → A1の日付は祝日ではない
使用例(IF関数と組み合わせ):
=IF(COUNTIF(祝日リスト,A1)>0,"祝日","")MATCH関数で祝日を判定する
数式: =ISNUMBER(MATCH(A1,祝日リスト,0))
- MATCH関数は祝日リスト内で一致する値の位置を返す
- 一致しない場合は#N/Aエラー → ISNUMBERでTRUE/FALSEに変換
VLOOKUP関数で祝日名を取得する
数式: =IFERROR(VLOOKUP(A1,祝日テーブル,2,FALSE),"")
- A1の日付が祝日リストにあれば、対応する祝日名を表示
- 該当しなければ空白を返す
条件付き書式で祝日に自動で色を付ける方法
基本設定:祝日セルの背景色を変更する
手順:
- 色を変更したいセル範囲を選択(例: B2:B32)
- 「ホーム」→「条件付き書式」→「新しいルール」
- 「数式を使用して、書式設定するセルを決定」を選択
- 数式に
=COUNTIF(祝日リスト,$A2)>0と入力 - 「書式」→ フォントの色を赤、背景をピンク等に設定
- OK → 祝日の行が自動で色付けされる
注意点:
- $A2のように列を絶対参照にする(行は相対参照のまま)
- 適用範囲の先頭行に合わせて数式の行番号を調整
土日+祝日を一括で色分けする
土曜日・日曜日・祝日をそれぞれ異なる色で表示する方法です。
ルール1(日曜日): =WEEKDAY($A2,2)=7 → 赤
ルール2(土曜日): =WEEKDAY($A2,2)=6 → 青
ルール3(祝日): =COUNTIF(祝日リスト,$A2)>0 → ピンク
適用の優先順位: 祝日 > 日曜 > 土曜(祝日ルールを最上位に配置)
月間カレンダーで祝日を自動表示する
カレンダー形式のシートで祝日名を自動表示する数式:
=IF(COUNTIF(祝日リスト,A2)>0,VLOOKUP(A2,祝日テーブル,2,FALSE),"")WORKDAY関数・NETWORKDAYS関数で営業日を計算する
WORKDAY関数:営業日後の日付を求める
構文: =WORKDAY(開始日, 日数, [祝日])
| 数式 | 説明 |
|---|---|
=WORKDAY(A1,5,祝日リスト) | A1から5営業日後の日付(土日祝除外) |
=WORKDAY(A1,-3,祝日リスト) | A1から3営業日前の日付 |
=WORKDAY(A1,10) | 祝日考慮なし(土日のみ除外) |
実務活用例:
- 納期計算:
=WORKDAY(受注日,10,祝日リスト)→ 受注から10営業日後 - 支払期日:
=WORKDAY(EOMONTH(請求日,0)+1,0,祝日リスト)→ 翌月初営業日
NETWORKDAYS関数:営業日数を数える
構文: =NETWORKDAYS(開始日, 終了日, [祝日])
| 数式 | 説明 |
|---|---|
=NETWORKDAYS(A1,B1,祝日リスト) | A1〜B1間の営業日数(土日祝除外) |
=NETWORKDAYS(A1,B1) | 祝日考慮なし(土日のみ除外) |
実務活用例:
- 稼働日数計算:
=NETWORKDAYS(月初日,月末日,祝日リスト) - プロジェクト日数:
=NETWORKDAYS(開始日,終了日,祝日リスト)→ 実作業日数
WORKDAY.INTL / NETWORKDAYS.INTL:休日パターンをカスタマイズ
土日以外を休日にする場合(例: 水曜定休)
構文: =WORKDAY.INTL(開始日, 日数, 休日パターン, [祝日])
| 休日パターン | 意味 |
|---|---|
| 1(デフォルト) | 土日休み |
| 2 | 日月休み |
| 11 | 日曜のみ休み |
| “0010000” | 水曜のみ休み(カスタム) |
VBAマクロで祝日処理を自動化する方法
基本:VBAで祝日を判定する関数
Function IsHoliday(targetDate As Date, holidayRange As Range) As Boolean
Dim cell As Range
For Each cell In holidayRange
If cell.Value = targetDate Then
IsHoliday = True
Exit Function
End If
Next cell
IsHoliday = False
End Function使い方: セルに =IsHoliday(A1,祝日リスト!A:A) と入力
応用:祝日を含むカレンダーを自動生成するVBA
Sub CreateCalendar()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim startDate As Date
startDate = DateSerial(Year(Date), Month(Date), 1) '当月1日
Dim endDate As Date
endDate = DateSerial(Year(Date), Month(Date) + 1, 0) '当月末日
Dim currentDate As Date
Dim row As Long
row = 2
'見出し
ws.Range("A1").Value = "日付"
ws.Range("B1").Value = "曜日"
ws.Range("C1").Value = "祝日名"
ws.Range("D1").Value = "区分"
For currentDate = startDate To endDate
ws.Cells(row, 1).Value = currentDate
ws.Cells(row, 2).Value = Format(currentDate, "aaa")
'祝日判定
Dim holidayName As String
holidayName = GetHolidayName(currentDate)
ws.Cells(row, 3).Value = holidayName
'区分(営業日/休日)
If Weekday(currentDate, vbMonday) >= 6 Then
ws.Cells(row, 4).Value = "休日"
ws.Cells(row, 4).Interior.Color = RGB(200, 200, 255)
ElseIf holidayName <> "" Then
ws.Cells(row, 4).Value = "祝日"
ws.Cells(row, 4).Interior.Color = RGB(255, 200, 200)
Else
ws.Cells(row, 4).Value = "営業日"
End If
row = row + 1
Next currentDate
'書式設定
ws.Columns("A:D").AutoFit
End Sub
Function GetHolidayName(targetDate As Date) As String
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("祝日リスト")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row
Dim i As Long
For i = 1 To lastRow
If ws.Cells(i, 1).Value = targetDate Then
GetHolidayName = ws.Cells(i, 2).Value
Exit Function
End If
Next i
GetHolidayName = ""
End Function祝日リストを翌年分に自動更新するVBA
Sub UpdateHolidayList()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("祝日リスト")
'翌年の固定祝日を追加
Dim nextYear As Integer
nextYear = Year(Date) + 1
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row + 1
'固定祝日(日付が毎年同じ)
Dim fixedHolidays As Variant
fixedHolidays = Array( _
Array(1, 1, "元日"), _
Array(2, 11, "建国記念の日"), _
Array(2, 23, "天皇誕生日"), _
Array(4, 29, "昭和の日"), _
Array(5, 3, "憲法記念日"), _
Array(5, 4, "みどりの日"), _
Array(5, 5, "こどもの日"), _
Array(8, 11, "山の日"), _
Array(11, 3, "文化の日"), _
Array(11, 23, "勤労感謝の日") _
)
Dim h As Variant
For Each h In fixedHolidays
ws.Cells(lastRow, 1).Value = DateSerial(nextYear, h(0), h(1))
ws.Cells(lastRow, 2).Value = h(2)
lastRow = lastRow + 1
Next h
'※ハッピーマンデー(成人の日・海の日・敬老の日・スポーツの日)と
' 春分の日・秋分の日は毎年異なるため、手動確認が必要
MsgBox "固定祝日を追加しました。" & vbCrLf & _
"以下は手動で確認・追加してください:" & vbCrLf & _
"・成人の日(1月第2月曜)" & vbCrLf & _
"・春分の日(3月20日頃)" & vbCrLf & _
"・海の日(7月第3月曜)" & vbCrLf & _
"・敬老の日(9月第3月曜)" & vbCrLf & _
"・秋分の日(9月23日頃)" & vbCrLf & _
"・スポーツの日(10月第2月曜)" & vbCrLf & _
"・振替休日"
End Subよくあるトラブルと対処法
COUNTIF関数で祝日が判定されない
- 原因1: 祝日リストの日付がテキスト形式になっている
- 対処: 祝日リストの日付列を選択 → 「データ」→「区切り位置」→「完了」で日付形式に変換
- 原因2: セルの表示形式が「文字列」
- 対処: セルの書式を「日付」に変更し、再入力
WORKDAY関数の結果がシリアル値で表示される
- 原因: 結果セルの書式が「標準」になっている
- 対処: セルの書式を「日付」に変更(Ctrl+1 → 「日付」を選択)
振替休日が祝日として判定されない
- 原因: 祝日リストに振替休日を登録していない
- 対処: 振替休日も手動で祝日リストに追加する(Excelには振替休日の自動判定機能なし)
条件付き書式で祝日の色が反映されない
- 原因1: 数式の参照がずれている(絶対参照・相対参照の設定ミス)
- 対処:
=COUNTIF(祝日リスト,$A2)>0のように列を$で固定 - 原因2: 他のルールが優先されている
- 対処: 「条件付き書式ルールの管理」でルールの優先順位を確認・変更
VBAマクロの実行結果をデモで確認
上記のVBAマクロがどのように動作するか、下のインタラクティブデモで確認できます。
VBAマクロの実行結果は記事冒頭のインタラクティブデモで確認できます。ボタンを押すとアニメーションで動作をシミュレーションします。
実際の操作手順をクリックして体験できます。各ステップをクリックしてみましょう。
| A (日付) | B (祝日名) | |
|---|---|---|
| 1 | 祝日日付 | 祝日名 |
| 2 | 2026/1/1 | 元日 |
| 3 | 2026/1/12 | 成人の日 |
| 4 | 2026/2/11 | 建国記念の日 |
| 5 | 2026/2/23 | 天皇誕生日 |
| 6 | 2026/3/20 | 春分の日 |
| 7 | 2026/4/29 | 昭和の日 |
| 8 | 2026/5/3 | 憲法記念日 |
ルールの種類を選択してください:
- セルの値に基づいてすべてのセルを書式設定
- 指定の値を含むセルだけを書式設定
- 数式を使用して、書式設定するセルを決定
- 一意の値または重複する値
・祝日リスト!$A:$A = 祝日日付の列(絶対参照)
・A1 = カレンダー上の日付セル
→ 祝日リストにその日付があればTRUE(色付け)
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20春分の日 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
※ 土曜=青、日曜=赤、祝日=選択した色
まとめ
Excelでの祝日処理方法をまとめます。
| 目的 | 使用する機能 | 難易度 |
|---|---|---|
| 祝日かどうか判定 | COUNTIF / MATCH関数 | ★☆☆ |
| 祝日に自動で色付け | 条件付き書式 + COUNTIF | ★☆☆ |
| 祝日名を表示 | VLOOKUP / XLOOKUP関数 | ★☆☆ |
| 営業日数を計算 | NETWORKDAYS関数 | ★☆☆ |
| 営業日後の日付を算出 | WORKDAY関数 | ★☆☆ |
| 休日パターンをカスタム | WORKDAY.INTL / NETWORKDAYS.INTL | ★★☆ |
| 祝日処理の完全自動化 | VBAマクロ | ★★★ |
まず祝日リストを作成し、COUNTIF関数で判定するのが最もシンプルで実用的です。営業日計算が必要ならWORKDAY/NETWORKDAYS関数を、大量データの処理にはVBAを活用しましょう。
VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。
LINEでExcelを気軽に学べる
