【Functionメモ】自動祝日(土日)判定ロジック(100年分ぐらいOK)

2020年6月6日土曜日

Excel Functionメモ スケジュール ツール 休日自動設定マクロ 日付

t f B! P L

2023.07.15更新:振替休日(秋分の日)が誤って、振替休日(春分の日)と出力されるのを修正。


指定された日付が祝日か土日か(独自に作った休日か)を判断します。
以下、取り込み済です(^^)/
※「春分の日」及び「秋分の日」については、今後100年分ぐらいずれない計算です。

この関数を、カレンダーやスケジュール系のExcelに組み込めば、とっても簡単に作れるようになります!!

使いかたは、Excelシート上でA1に日付を入力し、関数として「 =fnc祝日判定(A1)」と別のセルに入力すると、その日が祝日等の場合は、その祝日の名称等を返却します。


以下も取り込み済です。!!

国民の祝日について(追加変更分)

●令和3年(2021年)に限り、「海の日」は7月22日に、「スポーツの日」は7月23日に、「山の日」は8月8日(※)になります。

平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法等の一部を改正する法律の施行に伴い、改正後の令和三年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法(平成27年法律第33号)第32条第2項の規定に基づき、令和3年(2021年)における海の日、スポーツの日及び山の日は上記の通りとなります。

(※)国民の祝日に関する法律(昭和23年法律第178号)第3条第2項の規定に基づき、8月9日は休日となります。


●「スポーツの日」について
令和2年(2020年)以降、「体育の日」は「スポーツの日」になります。


●国民の祝日に関する法律(昭和23年法律第178号)の特例について
令和2年(2020年)に限り、「海の日」は7月23日に、「スポーツの日」は7月24日に、「山の日」は8月10日になります。



'-------------------------------------
'0.1UpExcel(エクセルでテンワンナップ)
'https://www.tenoneup.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 年 <> 2021 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
        '---●令和3年(2021年)に限り、「海の日」は7月22日に、「スポーツの日」は7月23日に、「山の日」は8月8日(※)になります。
        If 年 = 2021 And 日 = 22 Then
            祝日判定_間祝日なし = "海の日"
        End If
        If 年 = 2021 And 日 = 23 Then
            祝日判定_間祝日なし = "スポーツの日"
        End If
    Case 8
        '---●[山の日](8月11日)山に親しむ機会を得て、山の恩恵に感謝する。
        '---<固定判定>
        If 年 <> 2020 And 年 <> 2021 And 日 = 11 Then
            祝日判定_間祝日なし = "山の日"
        End If
        '---<振替休日判定>
        If 年 <> 2020 And 年 <> 2021 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
        '---●令和3年(2021年)に限り、「海の日」は7月22日に、「スポーツの日」は7月23日に、「山の日」は8月8日(※)になります。
        If 年 = 2021 And 日 = 8 Then
            祝日判定_間祝日なし = "山の日"
        End If
        If 年 = 2021 And 日 = 9 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日になります。
        '---●令和3年(2021年)に限り、「海の日」は7月22日に、「スポーツの日」は7月23日に、「山の日」は8月8日(※)になります。
        '2020,2021は10月ではなく7月
        
        '---●[スポーツの日](10月の第2月曜日)スポーツにしたしみ、健康な心身をつちかう。
        '---※平成32年(2020年)以降、「体育の日」は「スポーツの日」になります。
        '---<ハッピーマンデー>
        If 年 > 2021 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


何か気になったらGoogle検索で!

このサイトについて


【テンワンナップ】
普段の生活、仕事などでちょっと効率的に、ちょっと便利に、作業等を効率的にできる様な事をまとめていきます。 1Upまではいきませんが、0.1Upで生産性向上といったところですかね。Excel作業も0.1UPして生産性向上を図る為の小技も紹介していきます。

注目の投稿

【Gmailとスプレッドシート】AIのGeminiを使って、条件に合ったメールを一瞬で抽出するスクリプトを作成してもらった過程を紹介(自分では1行もプログラミングせずにGeminiに作ってもらうための具体的なプロンプトの入力内容を紹介。)

はじめに:Gmailとスプレッドシートの連携を簡単に実現したい 日々、メールがどんどん溜まっていき、重要な情報を取り出すのが面倒になったことはありませんか?特に、Gmail内で過去のメールから特定の情報を抽出したり、スプレッドシートに整理したりする作業は時間がかかりますよね。 今...

人気の投稿

このブログを検索

カウンター

連絡フォーム

名前

メール *

メッセージ *

rakuten

QooQ