EXCEL VBA Weekday関数・WeekdayName関数・日付から曜日を取得・祝日判定
EXCEL VBA Weekday関数・WeekdayName関数・日付から曜日を取得・祝日判定
今回説明するのは、WeekDay関数・WeekDayName関数の説明をいたします。まず、WeekDay関数は、日付に対応する曜日コードを返します。指定した日付に対して戻り値として1は、日・2は、月・・・として数値を返します。日付から曜日を取得する際に利用する関数です。次に、WeekDayName関数は、曜日コードから曜日を返す関数です。指定した曜日コード1は、日曜日・曜日コード2は、月曜日・・となります。WeekDay関数・WeekDayName関数共に、併せて利用する機会があるので共に覚えると便利な関数です。それでは、サンプルプログラムを交えて順番に説明いたします。
● WeekDay関数を利用するには、下記の通りに設定を行います。
WeekDay(日付)
戻り値 1~7
定数 | 値 | 説明(内容) |
---|---|---|
vbSunday | 1 | 日曜 |
vbMonday | 2 | 月曜 |
vbTuesday | 3 | 火曜 |
vbWednesday | 4 | 水曜 |
vbThursday | 5 | 木曜 |
vbFriday | 6 | 金曜 |
vbSaturday | 7 | 土曜 |
【使用例】
1 2 3 4 5 6 7 8 9 10 11 12 |
' ' 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:土を返します。
【使用例】:曜日の表示(曜日の省略無し)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' ' 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日の曜日は、木曜日なので「木曜日」を返します。
【使用例】:曜日の表示(曜日の省略あり)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
' ' 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日の曜日は、木曜日なので「木」(省略)を返します。
指定した範囲の日付に対して曜日を表示します。(土日・平日色分け)
下記のサンプルプログラムは、指定した日付に対して、曜日を表示するサンプルプログラムです。
【プログラム説明】
①A列の日付に対して曜日を表示します。
②曜日表示する際に、日曜日は、赤、土曜日は、青、その他平日は黒で色分けを行います。
【プログラム実行条件】
・A列に日付を入力します。(連続)セルA2以降
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
' ''******** 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 ' |
(画面クリックして拡大)
指定した範囲の日付に対して曜日を表示します。(土日・平日色分け)
下記のサンプルプログラムは、指定した日付に対して、曜日を表示するサンプルプログラムです。サンプル①のSelect Caseを使うより、Chooseを利用した方がシンプルにプログラムを作成する事が出来ます。
【プログラム説明】
①A列の日付に対して曜日を表示します。
②曜日表示する際に、曜日ごとに色分け(7色)を行いました。
【プログラム実行条件】
・A列に日付を入力します。(連続)セルA2以降
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
' ''******** 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 ' |
(画面クリックして拡大)
指定した日付から31日分の日付を表示し、曜日ごとに日付の色分けを行います。
下記のサンプルプログラムは、指定した日付(開始日:セルF2)、この開始日から31日分・日付と平日・土日の色分けを行います。31日分表示する様に作成しております。今回は、2021年10月16~11月15日まで表示します。
【プログラム説明】
①セル「F2」に開始日を指定します。(※いつでも良い)
②開始日を元に、31日分A列に日付を表示します。
③表示した日付に対して、日曜日は赤・土曜日は、青・平日は黒で日付を表示します。
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 |
' ''******** 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 ' |
(画面クリックして拡大)
指定した日付から一か月分の土日・祝日・平日の判定を行い色分け表示します。(曜日の取得は、WeekdayNameを利用・別シートで管理・祝日判定)
下記のサンプルプログラムは、指定した日付(セル:B1)、この指定日から31日分・日付と曜日には、平日・土日・祝日の色分けを行います。31日分表示する様に作成しております。今回は、2021年5月1~5月31日まで表示します。また、祝日についても、ワークシートの「祝日」を参照しながら祝日の場合は、日付・曜日を【赤】色に表示します。
【プログラム説明】
①セル「B1」に指定日を設定します。(※いつでも良い)
②指定日を元に、31日分表示します。*日付は3行目:曜日は4行目に表示します。
③表示した日付に対して、日曜日と祝日は赤・土曜日は、青・平日は黒で日付を表示します。
※祝日判定は、ワークシート「祝日」から登録されている日付と一致した場合は、祝日と判定されます。また、このワークシートに会社の創立記念日や会社独自の休日を指定しても祝日と判定されます。
※祝日の判定は、ワークシート「祝日」のA列を元に判定いたします。祝日以外にも会社の創立記念日や独自の休日を祝日として日付として入力する事で判定する事が出来ます。
【プログラム実行条件】
・ワークシート「勤務表」・・3列目に日付・4列目に曜日が表示されます。
・ワークシート「祝日」・・A列に日付・B列に祝日名を入力します。
・セルB1に指定日付を入力します。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
' ''******** 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 |
(画面クリックして拡大)
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。