Excel上級者

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

しんたろ。

Excelで日付を扱う業務では、「祝日を自動で判定して色を変えたい」「祝日を除いた営業日数を計算したい」というニーズが頻繁に発生します。

しかし、Excelには祝日を自動判定する専用関数がないため、正しい方法を知らないと手動対応になりがちです。

本記事では、祝日リストの作成方法から、関数による祝日判定、条件付き書式での自動色付け、WORKDAY/NETWORKDAYS関数による営業日計算、さらにVBAによる完全自動化まで、段階的に解説します。

この記事でわかること
  • Excel用の祝日リストの効率的な作り方(2024〜2026年対応)
  • COUNTIF・MATCH関数で祝日を自動判定する方法
  • 条件付き書式で祝日セルに自動で色を付ける方法
  • WORKDAY関数・NETWORKDAYS関数で営業日を計算する方法
  • VBAマクロで祝日処理を完全自動化する方法
この操作、VBAで一瞬で自動化できます
まずは関数の使い方を解説し、最後に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
下のデモで実行結果を確認できます
📅 祝日カレンダー.xlsx – Excel
AB
1 日付祝日名
2 2026/1/1 元日
3 2026/1/12 成人の日
4 2026/2/11 建国記念の日
5 2026/2/23 天皇誕生日
6 2026/3/20 春分の日
準備完了 100%
2026年の祝日一覧(5件)が自動生成されました!
☝ 年を変更すれば任意の年の祝日を生成できます

Excelで祝日を扱うための基礎知識

Excelには「祝日を自動取得する機能」はありません。そのため、祝日を扱うには祝日リスト(テーブル)を自分で用意し、関数で参照する必要があります。

なぜExcelに祝日機能がないのか

  • 祝日は国によって異なる(日本固有の祝日を自動判別する機能はない)
  • 祝日は法改正で変わることがある(例: 2016年「山の日」追加、2020年東京五輪特別移動)
  • 会社独自の休日(創立記念日等)も考慮が必要

祝日処理で使う3つのアプローチ

方法難易度用途
関数(COUNTIF/MATCH)+ 条件付き書式★☆☆カレンダーの祝日色付け
WORKDAY / NETWORKDAYS関数★☆☆営業日数・納期計算
VBAマクロ★★★祝日リスト自動更新・大量処理

祝日リストの作り方|3つの方法

祝日判定の基盤となる「祝日リスト」を作成します。

祝日処理3アプローチ(手動入力・関数・VBA)の判断フロー
祝日処理の方法選択フロー

方法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形式で公開されています。

手順:

  1. 内閣府「国民の祝日について」ページにアクセス
  2. 「国民の祝日」のCSVファイルをダウンロード
  3. Excelで開き、日付列を日付形式に変換
  4. 「祝日リスト」シートに貼り付け

方法3: Excelの名前付き範囲で管理する

祝日リストを名前付き範囲として定義すると、数式がわかりやすくなります。

手順:

  1. 祝日リストのA列(日付)を選択
  2. 「数式」タブ → 「名前の定義」をクリック
  3. 名前に「祝日リスト」と入力 → OK
  4. 以降の数式で「祝日リスト」という名前で参照可能

関数で祝日を判定する方法|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の日付が祝日リストにあれば、対応する祝日名を表示
  • 該当しなければ空白を返す

条件付き書式で祝日に自動で色を付ける方法

基本設定:祝日セルの背景色を変更する

手順:

  1. 色を変更したいセル範囲を選択(例: B2:B32)
  2. 「ホーム」→「条件付き書式」→「新しいルール」
  3. 「数式を使用して、書式設定するセルを決定」を選択
  4. 数式に =COUNTIF(祝日リスト,$A2)>0 と入力
  5. 「書式」→ フォントの色を赤、背景をピンク等に設定
  6. 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マクロの実行結果は記事冒頭のインタラクティブデモで確認できます。ボタンを押すとアニメーションで動作をシミュレーションします。

💻 操作を体験してみよう!

実際の操作手順をクリックして体験できます。各ステップをクリックしてみましょう。

X
祝日カレンダー.xlsx – Excel
① 祝日リスト ② 新しいルール ③ 数式入力 ④ 書式設定 ⑤ 結果
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 憲法記念日
祝日リスト カレンダー
◆ 祝日リストを作成したら次へ
新しい書式ルール

ルールの種類を選択してください:

  • セルの値に基づいてすべてのセルを書式設定
  • 指定の値を含むセルだけを書式設定
  • 数式を使用して、書式設定するセルを決定
  • 一意の値または重複する値
数式を入力
次の数式を満たす場合に書式設定:
=COUNTIF(祝日リスト!$A:$A, A1)>0
数式の意味:
・祝日リスト!$A:$A = 祝日日付の列(絶対参照)
・A1 = カレンダー上の日付セル
→ 祝日リストにその日付があればTRUE(色付け)
祝日セルの塗りつぶし色を選択
祝日の背景色を選択してください:
プレビュー: 祝日セルの見え方
3/19
3/20
3/21
✅ 祝日の自動色付けが完成しました
2026年 3月
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

※ 土曜=青、日曜=赤、祝日=選択した色

準備完了 条件付き書式
1 別シートに祝日リスト(日付 + 祝日名)を作成
2 条件付き書式 → 新しいルール → 「数式を使用」を選択
3 数式: =COUNTIF(祝日リスト!$A:$A, A1)>0 を入力
4 書式 → 塗りつぶし色を選択(ピンク/赤/オレンジ)
5 OK → カレンダー上の祝日に自動で色が付く

まとめ

Excelでの祝日処理方法をまとめます。

目的使用する機能難易度
祝日かどうか判定COUNTIF / MATCH関数★☆☆
祝日に自動で色付け条件付き書式 + COUNTIF★☆☆
祝日名を表示VLOOKUP / XLOOKUP関数★☆☆
営業日数を計算NETWORKDAYS関数★☆☆
営業日後の日付を算出WORKDAY関数★☆☆
休日パターンをカスタムWORKDAY.INTL / NETWORKDAYS.INTL★★☆
祝日処理の完全自動化VBAマクロ★★★

まず祝日リストを作成し、COUNTIF関数で判定するのが最もシンプルで実用的です。営業日計算が必要ならWORKDAY/NETWORKDAYS関数を、大量データの処理にはVBAを活用しましょう。

Excel業務の自動化
その手作業、自動化しませんか?

VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。

1,600部ツール販売実績
15年製造業の業務経験
無料で相談する →
初回相談無料・お見積りだけでもOK
期間限定でChatGPT✖︎Googleスプレットシートのコンテンツ配布中!

LINEでExcelを気軽に学べる

しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
Profile
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
プロフィールを読む

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました