みなさん、こんにちは!
フジタニ(@libartweb)です。
エクセルVBAとエクセル関数を組み合わせ、営業日を考慮したスケジュール表自動作成の方法をシリーズでお伝えしております。
前回の記事はこちら

前回はエクセルVBAのFunctionプロシージャを使用して、祝日判定関数を自作する方法をお伝えしました。
日付を引数として与えると、その日付が祝日かどうかをTrueかFalseで返す関数でしたね。
今回は前回の記事で紹介した祝日判定関数を使用して、カレンダーシートの土日祝日行に背景色をつける方法をお伝えします。
前回までのおさらい
前回は③の「土日祝日を判定し、VBAでその行に色をつけたい。」の途中まで(祝日判定関数を自作するところまで)説明しました。
今回は土日祝日行に背景色をつけていき、カレンダーを完成させます!
① シート名が「テンプレート」のままなのでVBAでシートをコピーして対象月の名称にしたい。例:「201811」
② A1セルに対象月の「開始日」をVBAで自動入力し、B列全体を対象月の日付として反映させたい。
③ 土日祝日を判定し、VBAでその行に色をつけたい。 ⇒今回紹介します。
④ 各日付ごとのタスクをVBAで「日付計算」シートから取得して反映させたい。
カレンダーの土日祝日の行に色をつける流れ
仕組みは非常にシンプルです。
カレンダーシートの日付を上から順番にループで読んでいき、その日付が土日祝日か?を関数で判定します。
・土曜日の場合:水色
・日曜・祝日の場合:オレンジ
という具合に日付の曜日や祝日を判定して色をつけていきます。
カレンダーシートの土日祝日行に色をつけるサンプルコード
早速ですが、サンプルコードを紹介します。
'--------------------------------------------------------------------------------------- '機能:カレンダーの土日祝日行に背景色をつける '引数:カレンダーシートのオブジェクト変数 '返り値:なし '--------------------------------------------------------------------------------------- Private Sub calendarSet(ByVal wsSchedule As Worksheet) Const CALENDAR_MAXROW As Long = 31 'カレンダーの最終行定数 Dim cntRow As Long 'カレンダー行カウント用変数 With wsSchedule For cntRow = 1 To CALENDAR_MAXROW '土曜日を判定しその行を水色にする '土曜日=vbSaturday If Weekday(.Range("B" & cntRow)) = vbSaturday Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 8 '背景色に水色設定 End If '日曜日と祝日を判定しその行をオレンジ色にする '日曜日=vbSunday 祝日:isholiday=True If Weekday(.Range("B" & cntRow)) = vbSunday Or isHoliday(.Range("B" & cntRow)) = True Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 46 '背景色にオレンジ色設定 End If Next cntRow End With End Sub
ではソースコードを詳しく解説していきます。
Const CALENDAR_MAXROW As Long = 31 'カレンダーの最終行定数
カレンダーシートの最大行は31を超えることはありません。そのため、定数(固定値)として扱います。
For cntRow = 1 To CALENDAR_MAXROW 省略 Next cntRow
For文によるループで、カレンダーの日付を1行ずつ31行目まで読み込んでいきます。
カレンダーの日付が土曜日か?を判定しその行を水色にする
'土曜日を判定しその行を水色にする '土曜日=vbSaturday If Weekday(.Range("B" & cntRow)) = vbSaturday Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 8 '背景色に水色設定 End If
B列の日付をループで1行ずつ読みながら、土曜日か?を判定し、土曜日の場合にInterior.ColorIndexで色をつけています。
Interior.ColorIndexは指定のセルに背景色をつけるプロパティです。背景色は1~56までの種類があり、56色を扱うことができます。
どの数値がどの色を表すかは以下のサイトを参考にしてください。
Weekday関数は、日付の曜日を返す関数です。引数に曜日を調べたい日付を指定することで、その日付が何曜日であるか?を数値か定数で返します。
数値 | 定数 | 曜日 |
---|---|---|
1 | vbSunday | 日曜日 |
2 | vbMonday | 月曜日 |
3 | vbTuesday | 火曜日 |
4 | vbWednesday | 水曜日 |
5 | vbThursday | 木曜日 |
6 | vbFriday | 金曜日 |
7 | vbSaturday | 土曜日 |
サンプルコードではB列の日付がvbSaturday(土曜日)であるか?を判定し、土曜日の場合にColorIndexプロパティで8(水色)の背景色をつけています。
カレンダーの日付が日曜・祝日か?を判定しその行をオレンジ色にする
'日曜日と祝日を判定しその行をオレンジ色にする '日曜日=vbSunday 祝日:isholiday=True If Weekday(.Range("B" & cntRow)) = vbSunday Or isHoliday(.Range("B" & cntRow)) = True Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 46 '背景色にオレンジ色設定 End If
日曜祝日も同様ですが、ここで前回の記事で自作したFunctionプロシージャである、isHoliday関数を使用しています。
Weekday関数の返り値vbSunday(日曜日)と、or条件でisHoliday関数を使用し、返り値のTrueかFalseで祝日を判定しています。
これで日曜日か祝日の場合にその行がオレンジ色になります。
背景色は46(オレンジ)です。
これまで紹介したソースコードの全体
では、これまでの記事で紹介したソースコード全体を見てみましょう。今回紹介したcalendarSetプロシージャは、template_Copyプロシージャから呼び出すようにしました。
'--------------------------------------------------------------------------------------- '機能:テンプレートシートをコピーし開始日を設定する '引数:なし '返り値:なし '--------------------------------------------------------------------------------------- Public Sub template_Copy() '==================================== '前回までの記事で紹介したソースコード '==================================== 'テンプレートシートをコピー wsTemplate.Copy after:=wsTemplate Dim strStartDate As String '開始日 Dim strSheetName As String 'シート名 strStartDate = wsDateList.Range("F5") '基準日の翌月(VBAを実行した日の翌月となる) strSheetName = Format(strStartDate, "yyyymm") '基準日の翌月をFormat関数で変換 ActiveSheet.Name = strSheetName 'シートの名前を変更 Dim wsSchedule As Worksheet Set wsSchedule = ThisWorkbook.Worksheets(strSheetName) 'コピーしたシートをオブジェクト変数に格納 'コピーしたシートの保護を解除 wsSchedule.Unprotect 'カレンダーの「開始日」に日付計算シートの「基準日の翌月」を反映 wsSchedule.Range("A1") = strStartDate '====================================================== '今回紹介するソースコード(callで別プロシージャを呼び出す) '====================================================== Call calendarSet(wsSchedule) End Sub '--------------------------------------------------------------------------------------- '機能:カレンダーの土日祝日行に背景色をつける '引数:カレンダーシートのオブジェクト変数 '返り値:なし '--------------------------------------------------------------------------------------- Private Sub calendarSet(ByVal wsSchedule As Worksheet) Const CALENDAR_MAXROW As Long = 31 'カレンダーの最終行定数 Dim cntRow As Long 'カレンダー行カウント用変数 With wsSchedule For cntRow = 1 To CALENDAR_MAXROW '土曜日を判定しその行を水色にする '土曜日=vbSaturday If Weekday(.Range("B" & cntRow)) = vbSaturday Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 8 '背景色に水色設定 End If '日曜日と祝日を判定しその行をオレンジ色にする '日曜日=vbSunday 祝日:isholiday=True If Weekday(.Range("B" & cntRow)) = vbSunday Or isHoliday(.Range("B" & cntRow)) = True Then .Range("B" & cntRow & ":I" & cntRow).Interior.ColorIndex = 46 '背景色にオレンジ色設定 End If Next cntRow End With End Sub '--------------------------------------------------------------------------------------- '★★前回の記事で紹介したFunctionプロシージャです。 '機能:取得した引数と、祝日一覧を比較して一致した場合にTrueを返す '引数:祝日かどうか判定したい日付(文字列) '返り値:真偽値 '--------------------------------------------------------------------------------------- Private Function isHoliday(ByVal strDate As String) As Boolean Dim maxRow As Long '祝日一覧の最終行 Dim cntRow As Long 'ループカウント用変数 isHoliday = False '初期化 With wsDateList '日付計算シート maxRow = .Cells(.Rows.Count, 9).End(xlUp).Row '祝日一覧の最終行を取得する For cntRow = 3 To maxRow '祝日一覧を一行ずつ読み込むループ If Format(.Range("I" & cntRow), "yyyy/m/d") = Format(strDate, "yyyy/m/d") Then isHoliday = True '祝日一覧に引数strDateに一致する日付があればTrue Exit For '一致する日付があればループを抜ける End If Next cntRow End With End Function
実行結果
template_Copyプロシージャを実行すると以下のようになります!
テンプレートシートから翌月分のシートがコピーされ、土日祝日の行に背景色がつきました。これでカレンダーが完成しました!
まとめ
以上、土日祝日を関数を使用して判定する方法と、カレンダーの土日祝日の行に背景色をつける方法をお伝えしました。
カレンダーもかなり見やすくなりました。
次回は、完成したカレンダーにいよいよ、翌月のタスクを自動で埋め込んでいく方法をお伝えします。
日付計算シートにあらかじめWORKDAY関数で設定しておいたスケジュールのカレンダーへの反映です。
どうぞお楽しみに!