休日判定(100年先まで)ロジック

100年分の休日を判定可能なVBAを作成しました。また、独自の日等も設定可能です。カレンダー等を作る際にとても便利です!!

即位礼正殿の儀が行われる日の平成31年(2019年)10月22日 や 平成32年(2020年)に限り、「海の日」は7月23日に、「体育の日(スポーツの日)」は7月24日に、「山の日」は8月10日になる事も取り込み済です。

サンプルのエクセルもダウンロード可能です。


使い方は、エクセルシートの関数として=fnc祝日判定(セルアドレス)と指定するだけ。

祝日の名前、土曜日、日曜日、VBAに追加した独自の休みを返却します。

 

文字列が返却されたら、上記のどれかに該当するという事です。

 

(VBAの作り)

入力された日付を年月日で分割し、月毎に日付を判定してきます。

休みに該当したらその名前を返却します。

ハッピーマンデー等も対応しています。

 

2020年のオリンピックの為に、スポーツの日等が移動してうくるのも対応済です!!

 

 

'-------------------------------------

'0.1UpExcel(エクセルテンワンナップ)

'https://tenoneupexcel.jimdo.com/

'-------------------------------------

Function fnc祝日判定(年月日 As Date) As String

    '---日付の分割

    年 = Year(年月日)

    月 = Month(年月日)

    日 = Day(年月日)

 

 

    fnc祝日判定 = 祝日判定_間祝日なし(年月日)

 

    '---●祝日にはさまれたら国民の休日

 

    If 祝日判定 = "" Then

        If 祝日判定_間祝日なし(DateAdd("d", -1, 年月日)) <> "" And 祝日判定_間祝日なし(DateAdd("d", 1, 年月日)) <> "" Then

 

            fnc祝日判定 = "国民の休日"

 

        End If

    End If

    '---個別休みの指定

    '---【年末年始】

    If (月 = 12 And (日 = 29 Or 日 = 30 Or 日 = 31)) Or (月 = 1 And (日 = 2 Or 日 = 3)) Then

        fnc祝日判定 = "年末年始"

    End If

 

    '---【その他休みはココに記述】-----------------------------------------------------

    '---【●●●】

    'If 月 = xx And 日 = xx Then

    '    fnc祝日判定 = "●●●"

    'End If

    '---【その他休みはココに記述】-----------------------------------------------------

 

    '---祝日だったら処理終了

    If fnc祝日判定 <> "" Then

        Exit Function

    End If

 

    '---ここまできて何もなければ、土曜日or日曜日を設定

    If Weekday(年月日, vbSunday) = vbSunday Then

        fnc祝日判定 = "日曜日"

    End If

 

    If Weekday(年月日, vbSunday) = vbSaturday Then

        fnc祝日判定 = "土曜日"

    End If

End Function

 

Function 祝日判定_間祝日なし(年月日 As Date) As String

    '---日付の分割

    年 = Year(年月日)

    月 = Month(年月日)

    日 = Day(年月日)

 

    祝日判定_間祝日なし = ""

 

    '---月により判定を行う

    Select Case 月

    Case 1

        '--●[元日](1月1日)年のはじめを祝う。

        '---<固定判定>

        If 日 = 1 Then

            祝日判定_間祝日なし = "元旦"

        End If

        '---<振替休日判定>

        If 日 = 2 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(元旦)"

        End If

        '---●[成人の日](1月の第2月曜日)おとなになったことを自覚し、みずから生き抜こうとする青年を祝いはげます。

        '---<ハッピーマンデー>

        If 年月日 = 第nx曜日の日取得(年月日, 2, vbMonday) Then

            祝日判定_間祝日なし = "成人の日"

        End If

    Case 2

        '---●[建国記念の日](政令で定める日)建国をしのび、国を愛する心を養う。

        '---<固定判定>

        If 日 = 11 Then

            祝日判定_間祝日なし = "建国記念の日"

        End If

        '---<振替休日判定>

        If 日 = 12 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(建国記念の日)"

        End If

        '---●[天皇誕生日](2月23日)天皇の誕生日を祝う。

        '---<固定判定>

        If 年 >= 2020 And 日 = 23 Then

            祝日判定_間祝日なし = "天皇誕生日"

        End If

        '---<振替休日判定>

        If 年 >= 2020 And 日 = 24 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(天皇誕生日)"

        End If

    Case 3

        '---●[春分の日](春分日)自然をたたえ、生物をいつくしむ。

        '---<春分判定>1980~2099年対応

        春分日 = Int(20.8431 + 0.242194 * (年 - 1980) - Int((年 - 1980) / 4))

        If 日 = 春分日 Then

            祝日判定_間祝日なし = "春分の日"

        End If

        '---<振替休日判定>

        If 日 = 春分日 + 1 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(春分の日)"

        End If

    Case 4

        '---●[昭和の日](4月29日)     激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。

        '---<固定判定>

        If 日 = 29 Then

            祝日判定_間祝日なし = "昭和の日"

        End If

        '---<振替休日判定>

        If 日 = 30 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(昭和の日)"

        End If

    Case 5

        '---●[天皇の即位の日](2019年5月1日)

        '---<固定判定>

        If 年 = 2019 And 日 = 1 Then

            祝日判定_間祝日なし = "天皇の即位の日"

        End If

        '---●[憲法記念日](5月3日)    日本国憲法の施行を記念し、国の成長を期する。

        '---<固定判定>

        If 日 = 3 Then

            祝日判定_間祝日なし = "憲法記念日"

        End If

        '---<振替休日判定>

        '---3日の振替休日は5日にまとめて実施

        '---●[みどりの日](5月4日)    自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。

        '---<固定判定>

        If 日 = 4 Then

            祝日判定_間祝日なし = "みどりの日"

        End If

        '---4日の振替休日は5日にまとめて実施

        '---●[こどもの日](5月5日)    こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。

        '---<固定判定>

        If 日 = 5 Then

            祝日判定_間祝日なし = "こどもの日"

        End If

        '---<振替休日判定>

        If 日 = 6 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(こどもの日)"

        End If

        If 日 = 6 And Weekday(DateAdd("d", -2, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(みどりの日)"

        End If

        If 日 = 6 And Weekday(DateAdd("d", -3, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(憲法記念日)"

        End If

    Case 7

        '---●[海の日](7月の第3月曜日)海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。

        '---<ハッピーマンデー>

        If 年 <> 2020 And 年月日 = 第nx曜日の日取得(年月日, 3, vbMonday) Then

            祝日判定_間祝日なし = "海の日"

        End If

        '---●平成32年(2020年)に限り、「海の日」は7月23日に、「体育の日(スポーツの日)は7月24日に、「山の日」は8月10日になります。

        If 年 = 2020 And 日 = 23 Then

            祝日判定_間祝日なし = "スポーツの日"

        End If

        If 年 = 2020 And 日 = 24 Then

            祝日判定_間祝日なし = "体育の日"

        End If

    Case 8

        '---●[山の日](8月11日)山に親しむ機会を得て、山の恩恵に感謝する。

        '---<固定判定>

        If 年 <> 2020 And 日 = 11 Then

            祝日判定_間祝日なし = "山の日"

        End If

        '---<振替休日判定>

        If 年 <> 2020 And 日 = 12 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(山の日)"

        End If

        '---●平成32年(2020年)に限り、「海の日」は7月23日に、「体育の日(スポーツの日)は7月24日に、「山の日」は8月10日になります。

        If 年 = 2020 And 日 = 10 Then

            祝日判定_間祝日なし = "山の日"

        End If

    Case 9

        '---●[敬老の日](9月の第3月曜日)多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。

        '---<ハッピーマンデー>

        If 年月日 = 第nx曜日の日取得(年月日, 3, vbMonday) Then

            祝日判定_間祝日なし = "敬老の日"

        End If

        '---●[秋分の日](秋分日)祖先をうやまい、なくなった人々をしのぶ。

        '---<秋分判定>1980~2099年対応

        秋分日 = Int(23.2488 + 0.242194 * (年 - 1980) - Int((年 - 1980) / 4))

        If 日 = 秋分日 Then

            祝日判定_間祝日なし = "秋分の日"

        End If

        '---<振替休日判定>

        If 日 = 秋分日 + 1 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(春分の日)"

        End If

    Case 10

        '---●[体育の日](10月の第2月曜日)スポーツにしたしみ、健康な心身をつちかう。

        '---※平成32年(2020年)以降、「体育の日」は「スポーツの日」になります。

        '---<ハッピーマンデー>

        If 年 < 2020 And 年月日 = 第nx曜日の日取得(年月日, 2, vbMonday) Then

            祝日判定_間祝日なし = "体育の日"

        End If

        '---●平成32年(2020年)に限り、「海の日」は7月23日に、「体育の日(スポーツの日)は7月24日に、「山の日」は8月10日になります。

 

        '---●[スポーツの日](10月の第2月曜日)スポーツにしたしみ、健康な心身をつちかう。

        '---※平成32年(2020年)以降、「体育の日」は「スポーツの日」になります。

        '---<ハッピーマンデー>

        If 年 > 2020 And 年月日 = 第nx曜日の日取得(年月日, 2, vbMonday) Then

            祝日判定_間祝日なし = "スポーツの日"

        End If

        '---●即位礼正殿の儀が行われる日の平成31年(2019年)10月22日は、休日となります

        '---<固定判定>

        If 年 = 2019 And 日 = 22 Then

            祝日判定_間祝日なし = "即位礼正殿の儀"

        End If

    Case 11

        '---●[文化の日](11月3日)自由と平和を愛し、文化をすすめる。

        '---<固定判定>

        If 日 = 3 Then

            祝日判定_間祝日なし = "文化の日"

        End If

        '---<振替休日判定>

        If 日 = 4 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(文化の日)"

        End If

        '---●[勤労感謝の日](11月23日)勤労をたっとび、生産を祝い、国民たがいに感謝しあう。

        '---<固定判定>

        If 日 = 23 Then

            祝日判定_間祝日なし = "勤労感謝の日"

        End If

        '---<振替休日判定>

        If 日 = 24 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(勤労感謝の日)"

        End If

    Case 12

        '---●[天皇誕生日](12月23日)      天皇の誕生日を祝う。

        '---<固定判定>

        If 年 < 2019 And 日 = 23 Then   '---2018年まで

            祝日判定_間祝日なし = "天皇誕生日"

        End If

        '---<振替休日判定>

        If 年 < 2019 And 日 = 24 And Weekday(DateAdd("d", -1, 年月日), vbSunday) = vbSunday Then

            祝日判定_間祝日なし = "振替休日(天皇誕生日)"

        End If

    End Select

End Function

 

'-----------------------------------------

'関数名 :月の第n、x曜日の日取得

'機能  :指定された曜日と月の何番目かを指定して日付を取得する。

'入力項目:dt…基準となる日付。その月の日付を対象とする。

'    :n…第n週を指定する

'    :x…曜日を指定する

'    :1(vbSunday)日曜日

'    :2(vbMonday)月曜日

'    :3(vbTuesday)火曜日

'    :4(vbWednesday)水曜日

'    :5(vbThursday)木曜日

'    :6(vbFriday)金曜日

'    :7(vbSaturday)土曜日

'-----------------------------------------

Function 第nx曜日の日取得(dt As Date, n As Integer, x As Integer) As Date

    Dim wk1d As Date        '---対象年月の1日計算用WK

 

    '---入力チェック

    If x < 1 Or x > 7 Then

        MsgBox ("[x]の指定に誤りがあります。x=[" & x & "]")

        End

    End If

    '---対象年月の1日を取得

    wk1d = DateSerial(Year(dt), Month(dt), 1)

    '---その後のパラメータで指定された曜日になるまで日を後ろにシフト

    Do Until Weekday(wk1d, vbSunday) = x

        '---日を後にシフト

        wk1d = DateAdd("d", 1, wk1d)

    Loop

    '---パラメータで指定された週分後ろにシフト

    第nx曜日の日取得 = DateAdd("d", 7 * (n - 1), wk1d)

End Function

 

 

 

 

 

 

 

 

(修正履歴)

※2019/5/9修正:[2019/5/1]が休みになっていませんでした。修正しました。

 

 

エクセルファイルのダウンロードは以下のリンクからどうぞ。

(このサイトにExcelが置けないので、0.1UPツールサイト(kimamatool)からダウンロードできます。)