エクセルVBAでカレンダーシートの土日祝日の行に背景色をつける方法


背景色

みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAとエクセル関数を組み合わせ、営業日を考慮したスケジュール表自動作成の方法をシリーズでお伝えしております。

前回の記事はこちら

エクセルVBAのFunctionプロシージャで祝日判定関数を自作する方法
エクセルVBAのFunctionプロシージャの概要と、それを活用した祝日判定関数の作成方法をお伝えします。エクセル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で色をつけています。

Range.Interior.ColorIndex

Interior.ColorIndexは指定のセルに背景色をつけるプロパティです。背景色は1~56までの種類があり、56色を扱うことができます。

どの数値がどの色を表すかは以下のサイトを参考にしてください。

色指定ColorIndexプロパティに対応するColorプロパティ 一覧|Excel|ヘルプの森
ヘルプデスクサイト「ヘルプの森」Excel_ColorIndexプロパティとColorプロパティの対応一覧リスト
Weekday(日付)

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関数で設定しておいたスケジュールのカレンダーへの反映です。

どうぞお楽しみに!

連載目次:エクセルVBAで営業日を考慮したスケジュール表を自動で作成する

WORKDAY関数とエクセルVBAを組み合わせ、営業日を考慮したスケジュール表を自動作成する方法をお伝えします。 実務で使いこなすことができればとても便利なツールとして活用できるはずです!
  1. エクセルで営業日判定を実現するWORKDAY関数の使い方
  2. エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩
  3. エクセル関数だけで営業日を考慮した月間スケジュールを作成する方法
  4. エクセル関数でスケジュール自動表示のためのカレンダーを作成する方法
  5. エクセルVBAでテンプレートをコピーし翌月のカレンダーシートを生成する方法
  6. エクセルVBAでカレンダーシートに翌月の日付を反映させる方法
  7. エクセルVBAのFunctionプロシージャで祝日判定関数を自作する方法
  8. エクセルVBAでカレンダーシートの土日祝日の行に背景色をつける方法
  9. エクセルVBAでカレンダーシートに自動でタスクを表示する方法

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

タイトルとURLをコピーしました