「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Excelを使えば、自分専用のカレンダーを簡単に作れます。この記事では、年間・月間・週間の3種類のカレンダーを順に作成し、最後に祝日を自動反映するマクロを組み込みます。

旧バージョン(Excel 2010〜2021)でも動作するよう、関数は基本的なものだけを使用しています。


ステップ1:年間カレンダーを作る

  1. 年入力セルを用意

    • B1セルに「2025」など西暦年を入力

  2. 日付列を生成

    • A3セルに次の数式を入力し、365行コピー

      =DATE($B$1,1,1)+ROW(A1)-1

  3. 曜日を表示

    • B3セルに

      =TEXT(A3,"aaa")
  4. 条件付き書式で土日を色分け

    • 土曜:=WEEKDAY($A3,2)=6

    • 日曜:=WEEKDAY($A3,2)=7

    • 祝日:=COUNTIF(祝日!$A:$A,$A3)>0


ステップ2:月間カレンダーを作る

  1. 入力セル

    • B1=年、D1=月

  2. 月初を算出

    • B3セルに

      =DATE($B$1,$D$1,1)-WEEKDAY(DATE($B$1,$D$1,1),2)+1
  3. カレンダー枠を埋める

    • 各セルに =$B$3+オフセット を入力

  4. 条件付き書式

    • 他月の日付はグレー表示

    • 土日を色分け


ステップ3:週間カレンダーを作る

  1. 週の開始日を指定

    • B1セルに「週の開始日」(例: 2025/9/29)を入力

  2. 見出し表示

    • B2以降に

      =TEXT($B$1+列番号,"m/d(aaa)")
  3. 条件付き書式

    • 列ごとに「土曜」「日曜」「祝日」を判定して色付け


ステップ4:祝日を自動反映する

仕組み

  • 固定祝日(元日、建国記念日など)

  • ハッピーマンデー制度(成人の日、海の日、敬老の日、スポーツの日)

  • 春分・秋分(1980〜2099年は近似式で計算)

  • 振替休日(日曜の祝日→翌平日)

  • 国民の休日(祝日で挟まれた平日)

このルールをVBAで計算し、「祝日」シートに一覧化 → 他シートが COUNTIF で参照して色分けします。
※ネットから取得しているわけではありません。


VBAコード全文(標準モジュールに貼り付け)

Option Explicit

' 祝日シートB1に年を入力 → ボタンで実行
Public Sub FetchHolidays()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("祝日")
    
    Dim y As Long
    y = CLng(ws.Range("B1").Value)
    If y < 1949 Or y > 2099 Then
        MsgBox "Year is out of range (1949-2099).", vbExclamation, "Error"
        Exit Sub
    End If
    
    Dim hol As Collection
    Set hol = BuildJapaneseHolidays(y)
    
    ws.Range("A2:A1000").ClearContents
    Dim i As Long
    For i = 1 To hol.Count
        ws.Range("A" & (i + 1)).Value = hol(i)
    Next i
    ws.Range("A2:A" & (hol.Count + 1)).NumberFormatLocal = "yyyy/mm/dd"
    
    MsgBox CStr(y) & "年の祝日を更新しました (" & hol.Count & "日)", vbInformation, "更新完了"
End Sub

' 指定年の祝日リストを作成
Private Function BuildJapaneseHolidays(ByVal Y As Long) As Collection
    Dim c As New Collection

    ' 固定日
    AddUnique c, DateSerial(Y, 1, 1)   ' 元日
    AddUnique c, DateSerial(Y, 2, 11)  ' 建国記念の日
    If Y >= 2020 Then AddUnique c, DateSerial(Y, 2, 23) ' 天皇誕生日
    AddUnique c, DateSerial(Y, 4, 29)  ' 昭和の日
    AddUnique c, DateSerial(Y, 5, 3)   ' 憲法記念日
    AddUnique c, DateSerial(Y, 5, 4)   ' みどりの日
    AddUnique c, DateSerial(Y, 5, 5)   ' こどもの日
    AddUnique c, DateSerial(Y, 8, 11)  ' 山の日
    AddUnique c, DateSerial(Y, 11, 3)  ' 文化の日
    AddUnique c, DateSerial(Y, 11, 23) ' 勤労感謝の日

    ' ハッピーマンデー
    AddUnique c, NthWeekday(Y, 1, vbMonday, 2)   ' 成人の日
    AddUnique c, NthWeekday(Y, 7, vbMonday, 3)   ' 海の日
    AddUnique c, NthWeekday(Y, 9, vbMonday, 3)   ' 敬老の日
    AddUnique c, NthWeekday(Y, 10, vbMonday, 2)  ' スポーツの日

    ' 春分・秋分
    AddUnique c, DateSerial(Y, 3, VernalDay(Y))
    AddUnique c, DateSerial(Y, 9, AutumnDay(Y))

    ' 振替休日・国民の休日
    AddSubstituteHolidays c
    AddCitizensHoliday c

    SortCollection c
    Set BuildJapaneseHolidays = c
End Function

' 月内の第N・曜日を返す
Private Function NthWeekday(ByVal Y As Long, ByVal M As Long, ByVal FirstWeekday As VbDayOfWeek, ByVal N As Long) As Date
    Dim d As Date
    d = DateSerial(Y, M, 1)
    Do While Weekday(d, vbMonday) <> (FirstWeekday - 0)
        d = d + 1
    Loop
    NthWeekday = d + (N - 1) * 7
End Function

' 春分日(近似)
Private Function VernalDay(ByVal Y As Long) As Integer
    VernalDay = Int(20.8431 + 0.242194 * (Y - 1980)) - Int((Y - 1980) / 4)
End Function

' 秋分日(近似)
Private Function AutumnDay(ByVal Y As Long) As Integer
    AutumnDay = Int(23.2488 + 0.242194 * (Y - 1980)) - Int((Y - 1980) / 4)
End Function

' コレクションに重複なく追加
Private Sub AddUnique(ByRef c As Collection, ByVal d As Date)
    On Error Resume Next
    c.Add d, Format$(d, "yyyy-mm-dd")
    On Error GoTo 0
End Sub

' 振替休日
Private Sub AddSubstituteHolidays(ByRef c As Collection)
    Dim i As Long
    Dim arr() As Date
    arr = ToArray(c)
    For i = LBound(arr) To UBound(arr)
        If Weekday(arr(i), vbSunday) = vbSunday Then
            Dim dd As Date: dd = arr(i) + 1
            Do While IsHoliday(c, dd)
                dd = dd + 1
            Loop
            AddUnique c, dd
        End If
    Next i
End Sub

' 国民の休日
Private Sub AddCitizensHoliday(ByRef c As Collection)
    Dim i As Long
    Dim arr() As Date
    arr = ToArray(c)
    For i = LBound(arr) To UBound(arr) - 1
        Dim mid As Date: mid = arr(i) + 1
        If mid = arr(i + 1) - 1 Then
            If Weekday(mid, vbMonday) <= 5 Then
                AddUnique c, mid
            End If
        End If
    Next i
End Sub

Private Function IsHoliday(ByRef c As Collection, ByVal d As Date) As Boolean
    On Error Resume Next
    Dim tmp As Date: tmp = c(Format$(d, "yyyy-mm-dd"))
    IsHoliday = (Err.Number = 0)
    Err.Clear
    On Error GoTo 0
End Function

' 昇順ソート
Private Sub SortCollection(ByRef c As Collection)
    Dim arr() As Date: arr = ToArray(c)
    Dim i As Long, j As Long, t As Date
    For i = LBound(arr) To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(j) < arr(i) Then
                t = arr(i): arr(i) = arr(j): arr(j) = t
            End If
        Next j
    Next i
    Dim c2 As New Collection
    For i = LBound(arr) To UBound(arr)
        AddUnique c2, arr(i)
    Next i
    Set c = c2
End Sub

' Collection → 配列
Private Function ToArray(ByRef c As Collection) As Date()
    Dim arr() As Date
    ReDim arr(1 To c.Count)
    Dim i As Long
    For i = 1 To c.Count
        arr(i) = c(i)
    Next i
    ToArray = arr
End Function

ステップ5:完成版テンプレート

上記の手順をすべてまとめた「サンプルExcelカレンダー.xlsm」を用意しました。

  • 年間/月間/週間カレンダー

  • 祝日シートに年を入力 → [最新の祝日を取得] ボタン

  • 祝日・土日が自動で色分け

📂 ダウンロード:Excelサンプルをダウンロード


まとめ

  • Excel標準機能(DATE、TEXT、WEEKDAY、COUNTIF)で年間・月間・週間カレンダーを作成

  • VBAマクロで祝日リストを自動生成 → 条件付き書式で色分け

  • 配布テンプレートを使えばすぐに利用可能

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x