Categories: VBA基礎

EXCEL VBA Weekday関数・WeekdayName関数・日付から曜日を取得・祝日判定

 

 

EXCEL VBA Weekday関数・WeekdayName関数・日付から曜日を取得・祝日判定

 

 

●はじめに

今回説明するのは、WeekDay関数・WeekDayName関数の説明をいたします。まず、WeekDay関数は、日付に対応する曜日コードを返します。指定した日付に対して戻り値として1は、日・2は、月・・・として数値を返します。日付から曜日を取得する際に利用する関数です。次に、WeekDayName関数は、曜日コードから曜日を返す関数です。指定した曜日コード1は、日曜日・曜日コード2は、月曜日・・となります。WeekDay関数・WeekDayName関数共に、併せて利用する機会があるので共に覚えると便利な関数です。それでは、サンプルプログラムを交えて順番に説明いたします。

 

 

●書式の説明  (WeekDay関数・WeekDayName関数)

● WeekDay関数を利用するには、下記の通りに設定を行います。

  WeekDay(日付)

戻り値 1~7

定数
説明(内容)
vbSunday1日曜
vbMonday月曜
vbTuesday火曜
vbWednesday4水曜
vbThursday5木曜
vbFriday6金曜
vbSaturday7土曜

【使用例】

'
'
Sub Weekady00A()

    Dim Setday As String
    
    Setday = "2020/12/31" '日付を設定

    MsgBox WeekDay(Setday) '日付から戻り値を表示

End Sub
'

【実行後】
 
2020年12月31日は、木曜日なので【5】を返します。

● WeekDayName関数を利用するには、下記の通りに設定を行います。

  WeekDayName(日付の戻り値)

※WeekDayの戻り値(1~7)に対して、1:日曜日・2:月曜日・3:火曜日・4:水曜日・5:木曜日・6:金曜日・7:土曜日を返します。


WeekDayName(日付の戻り値,True)

※引数:曜日の省略「True ⇒省略する Falseまた設定なし ⇒ 省略しない」
※WeekDayの戻り値(1~7)に対して、1:日・2:月・3:火・4:水・5:木・6:金・7:土を返します。

【使用例】:曜日の表示(曜日の省略無し)

 

'
'
Sub WeekdayName00A()

    Dim Sday As Long
    Dim Setday As String
    
    Setday = "2020/12/31" '日付を設定
    
    Sday = WeekDay(Setday) '日付から戻り値を代入

    MsgBox WeekdayName(Sday) '日付の戻り値から曜日を表示

End Sub
'


【実行後】

 ※2020年12月31日の曜日は、木曜日なので「木曜日」を返します。

【使用例】:曜日の表示(曜日の省略あり)

 

'
'
Sub WeekdayName00B()

    Dim Sday As Long
    Dim Setday As String
    
    Setday = "2020/12/31" '日付を設定
    
    Sday = WeekDay(Setday) '日付から戻り値を代入

    MsgBox WeekdayName(Sday, True) '日付の戻り値から曜日を表示'(曜日を省略)

End Sub
'


【実行後】

※2020年12月31日の曜日は、木曜日なので「木」(省略)を返します。

 

 

指定した範囲の日付に対して曜日を表示します。(土日・平日色分け)

 

 

●プログラム説明 (サンプル①) WeekDay関数

下記のサンプルプログラムは、指定した日付に対して、曜日を表示するサンプルプログラムです。

【プログラム説明】
①A列の日付に対して曜日を表示します。
②曜日表示する際に、日曜日は、赤、土曜日は、青、その他平日は黒で色分けを行います。

【プログラム実行条件】
・A列に日付を入力します。(連続)セルA2以降

 

'
''******** AKIRA55.COM *******  https://akira55.com/weekdayname/
'
Sub WeekDay01()    '指定した範囲の日付に対して曜日を表示します。
    
    Dim Setday, SetWeek As String
    Dim I, lRow, Wcolor As Long
    
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得します。
        
    For I = 2 To lRow 'A列の最終行まで繰り返します。
        
        Setday = Cells(I, "A")    'A列の日付を取得します。

        Select Case WeekDay(Setday) '日付から整数の戻り値を取得します。
            
            Case vbSunday
                SetWeek = "日曜日-Sunday"
                Wcolor = 3 '赤
            Case vbMonday
                SetWeek = "月曜日-Monday"
                Wcolor = 1  '黒
            Case vbTuesday
                SetWeek = "火曜日-Tuesday"
                Wcolor = 1  '黒
            Case vbWednesday
                SetWeek = "水曜日-Wednesday"
                Wcolor = 1  '黒
            Case vbThursday
                SetWeek = "木曜日-Thursday"
                Wcolor = 1  '黒
            Case vbFriday
                SetWeek = "金曜日-Friday"
                Wcolor = 1  '黒
            Case vbSaturday
                SetWeek = "土曜日-Saturday"
                Wcolor = 5  '青
        End Select
        
        Cells(I, "B") = SetWeek  '曜日をB列に転記します。
        Cells(I, "B").Font.ColorIndex = Wcolor  '日曜日は、「赤」・土曜日は、「青」・それ以外は「黒」
 
    Next I

End Sub
'

 

●実行前~実行後 ※プログラム実行後、A列に指定した日付に対して、B列に曜日が表示されました。今回は、Select Caseを使って曜日(個別入力した)を表示しました。
(画面クリックして拡大)

 

 

指定した範囲の日付に対して曜日を表示します。(土日・平日色分け)

 

 

●プログラム説明 (サンプル②) WeekDay関数

下記のサンプルプログラムは、指定した日付に対して、曜日を表示するサンプルプログラムです。サンプル①のSelect Caseを使うより、Chooseを利用した方がシンプルにプログラムを作成する事が出来ます。

【プログラム説明】
①A列の日付に対して曜日を表示します。
②曜日表示する際に、曜日ごとに色分け(7色)を行いました。

【プログラム実行条件】
・A列に日付を入力します。(連続)セルA2以降

 

 

'
''******** AKIRA55.COM *******  https://akira55.com/weekdayname/
'
Sub WeekDay02()   '指定した範囲の日付に曜日を取得します。
    
    Dim Setday, SetWeek As String
    Dim I, lRow As Long
    
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得します。
    
    For I = 2 To lRow 'A列の最終行まで繰り返します。
        
        Setday = WeekDay(Cells(I, "A"))  ' '日付から整数の戻り値を取得します。
        
            SetWeek = Choose(Setday, "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日") '
        
        Cells(I, "B") = SetWeek
        Cells(I, "B").Font.ColorIndex = WeekDay(Setday) + 40 '文字列に色を付けます。
    Next I

End Sub
'

 

 

●実行前~実行後 ※プログラム実行後、A列に指定した日付に対して、B列に曜日が表示されました。今回は、Chooseを使って曜日(個別入力した)を表示して曜日別日に色分けを行いました。
(画面クリックして拡大)

 

 

 

 

指定した日付から31日分の日付を表示し、曜日ごとに日付の色分けを行います。

 

 

●プログラム説明 (サンプル③)  WeekDay関数

下記のサンプルプログラムは、指定した日付(開始日:セルF2)、この開始日から31日分・日付と平日・土日の色分けを行います。31日分表示する様に作成しております。今回は、2021年10月16~11月15日まで表示します。

 

【プログラム説明】
①セル「F2」に開始日を指定します。(※いつでも良い)
②開始日を元に、31日分A列に日付を表示します。
③表示した日付に対して、日曜日は赤土曜日は、青・平日は黒で日付を表示します。

 

 

'
''******** AKIRA55.COM *******  https://akira55.com/weekdayname/
'
Sub WeekDay04()  '指定した日付から31日分の曜日を取得します。

    Dim Setday, SetWeek As String
    Dim I, lRow, Wcolor As Long
    Dim SetDate As Date
    
    SetDate = Range("F2") '開始日をセルF2から取得します。
        
    For I = 2 To 32  '一ヵ月を繰り返す。
        
        Cells(I, "A") = Format(DateAdd("D", I - 2, SetDate), "yyyy/mm/dd") 'A列に開始日より一日ずつ加算して、日付表示で転記します。
        Setday = WeekDay(Cells(I, "A")) 'A列の日付から整数の戻り値を取得します。
        
        If Setday = 1 Then    '日曜日は、赤字(3)に表示する。
            Wcolor = 3
        ElseIf Setday = 7 Then  '土曜日は、青字(7)に表示する。
            Wcolor = 5
        Else
            Wcolor = 1  'それ以外の曜日は、黒字に表示する。
        End If
        
        Cells(I, "A").Font.ColorIndex = Wcolor  '曜日ごとに色を表示させます。
    
    Next I

End Sub
'

 

 

●実行前~実行後  ※セル「F2」の指定した開始日からA列に日付を表示して、表示して曜日ごとに、土日・平日と日付に色分けを行いました。(日曜日:赤・土曜日:青・平日:黒)
(画面クリックして拡大)

 

 

 

指定した日付から一か月分の土日・祝日・平日の判定を行い色分け表示します。(曜日の取得は、WeekdayNameを利用・別シートで管理・祝日判定)

 

 

●プログラム説明 (サンプル④) WeekDay関数・WeekDayName関数

下記のサンプルプログラムは、指定した日付(セル:B1)、この指定日から31日分・日付と曜日には、平日・土日・祝日の色分けを行います。31日分表示する様に作成しております。今回は、2021年5月1~5月31日まで表示します。また、祝日についても、ワークシートの「祝日」を参照しながら祝日の場合は、日付・曜日を【赤】色に表示します。

 

【プログラム説明】
①セル「B1」に指定日を設定します。(※いつでも良い)
②指定日を元に、31日分表示します。*日付は3行目:曜日は4行目に表示します。
③表示した日付に対して、日曜日と祝日は赤土曜日は、青・平日は黒で日付を表示します。
祝日判定は、ワークシート「祝日」から登録されている日付と一致した場合は、祝日と判定されます。また、このワークシートに会社の創立記念日や会社独自の休日を指定しても祝日と判定されます。


※祝日の判定は、ワークシート「祝日」のA列を元に判定いたします。祝日以外にも会社の創立記念日や独自の休日を祝日として日付として入力する事で判定する事が出来ます。

【プログラム実行条件】
・ワークシート「勤務表」・・3列目に日付・4列目に曜日が表示されます。
・ワークシート「祝日」・・A列に日付・B列に祝日名を入力します。
・セルB1に指定日付を入力します。

 

'
''******** AKIRA55.COM *******  https://akira55.com/weekdayname/
'
Sub WeekDay05()   '指定した日付から一か月分の土日・祝日・平日の判定を行い色分け表示します。(曜日の取得は、WeekdayNameを利用)
    
    Dim ws01, ws02 As Worksheet
    Dim Setday, SetWeek As String
    Dim I, xRow, mRow, Wcolor As Long
    Dim SetDate As Date
    
    Set ws01 = Worksheets("勤務表") 'シート「勤務表」をセット
    Set ws02 = Worksheets("祝日") 'シート「祝日」をセット
    
    If Not IsDate(ws01.Range("B1")) Then  'セルB1の日付が正しいか判定します。
            MsgBox "正しい日付を入力して下さい。"
            Exit Sub
        Else
            SetDate = ws01.Range("B1") '開始日を代入します。
    End If

    mRow = ws02.Cells(Rows.Count, "A").End(xlUp).Row 'シート「祝日」A列の最終行を取得します。
    
    For I = 2 To 32 '一ヵ月を繰り返す。(31日分)
    
        ws01.Cells(3, I) = Format(DateAdd("D", I - 2, SetDate), "mm/dd") '3行名に開始日より一日ずつ加算して、日付表示で転記します。
        ws01.Cells(4, I) = WeekdayName(WeekDay(ws01.Cells(3, I)), True) '4行名に曜日を代入する。(一文字)
        Setday = WeekDay(ws01.Cells(3, I))  '
        
        xRow = 0
        
        On Error Resume Next  'エラーが発生しても続行プログラム実行を続行させる。
        xRow = WorksheetFunction.Match(ws01.Cells(3, I), ws02.Range("A2:A" & mRow), 0) '
        On Error GoTo 0  '比較データが無い場合に、エラーでも続行させる。
        
        If xRow <> 0 Then
                Wcolor = 3    '祝日は、赤字(3)に表示する。
           Else
                If Setday = 1 Then
                        Wcolor = 3    '日曜日は、赤字(3)に表示する。
                    ElseIf Setday = 7 Then
                        Wcolor = 5   '土曜日は、青字(7)に表示する。
                    Else
                        Wcolor = 1  'それ以外の曜日は、黒字に表示する。
                End If
        End If
        ws01.Range(ws01.Cells(3, I), ws01.Cells(4, I)).Font.ColorIndex = Wcolor '日曜日/祝日は、「赤」・土曜日は、「青」・それ以外は「黒」
    
    Next I

End Sub

 

 

●実行前~実行後 ※プログラム実行後、シート「勤務表」セル「B1」に入力された日付より、3列目に日付・4列目に曜日が表示されました。祝日判定もされているので、祝日も赤文字で表示されました。
(画面クリックして拡大)

 

 

最後まで、ご覧いただきまして誠に有難うございました。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。

 

AKIRA