@kazutopinebook

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Excel VBAを使った日付セルの背景色変更の方法

解決したいこと

既存のマクロ台帳に以下の処理を追加しようと考えています。


<ルール>
・本日の日付が納期より5営業日以下になった場合、納期のセルを黄色に塗りつぶす。
・本日の日付が納期当日および納期以降になった場合、納期のセルを赤色に塗りつぶす。
・ステータスが「完了」の場合、塗りつぶしなし。


発生している問題・エラー

下記のソースコードにて実行したところ、動作自体はするものの、
「納期より5営業日以下になった場合、AF列のセルを黄色に塗りつぶす。」処理にて、
処理式30行目で祝日を指定できないのと、
日付によっては当日以前のセルも黄色になってしまうという課題が残っています。

該当するソースコード

Option Explicit

Sub CellsColorChange()
   
    Dim h As Variant
    Dim A As Long
    Dim i As Integer
    Dim B As Integer
    Dim Cnt As Variant
    Dim C As Integer
    Dim D As Integer
    Dim E As String
   
    'シート名「祝日」から祝日を取得(h:holyday)
    h = Worksheets("祝日").Range("A2:A163").Value

    '本日から5営業日後の日付をAとする。
    A = WorksheetFunction.WorkDay(Date, 5, h)
   
    'AF列「納期」欄の記載開始行(i:初期値)を設定。
    i = 7
   
    'AF列が空白になるまで処理を繰り返す。
    Do Until Cells(i, 32).Value = ""
   
        '5営業日後の日付-納期をBとする。
        B = A + 1 - Cells(i, 32).Value
       
        'Bの期間に含まれている祝日の日数を計算する。
        Cnt = WorksheetFunction.CountIf(Range(Cells(i, 32), Cells(i + 7, 32)), "2022/9/19")
       
        '1週間後+祝日の日数
        C = 7 + Cnt
       
        '本日から納期までの日数をDとする。
        D = Cells(i, 32).Value - Date
       
        'AI列「ステータス」欄の値をEとする。
        E = Cells(i, 35).Value
   
        '納期より5営業日以下になった場合、AF列のセルを黄色に塗りつぶす。
        '納期当日および納期以降になった場合、AF列のセルを赤色に塗りつぶす。
        'AI列が「完了」の場合、塗りつぶしなし。
        If B <= C And B > 0 And E <> "完了" Then
            Cells(i, 32).Interior.Color = RGB(255, 255, 0) '背景色:黄色
        ElseIf D <= 0 And E <> "完了" Then
            Cells(i, 32).Interior.Color = RGB(255, 0, 0) '背景色:赤色
        Else
            Cells(i, 32).Interior.Color = xlNone '塗りつぶしなし
        End If
   
        i = i + 1
    Loop
   
End Sub

実行結果
画像1.png

※「祝日」シートのA列に2022年から2030年の祝日の日付を記載済み。

「処理式が間違っている」「もっとこうした方が良い」など、
遠慮なくお知らせください。

0 likes

5Answer

@kazutopinebook さん
この VBA は "ボタン" で動作する仕様でしょうか。
もしくは、ファイルオープン時?
「色を変更する」というところが着地であれば、"条件付き書式"の方がよいと思います。

手動だと、押し忘れの可能性がありますし、オープン時ならファイル開きっぱなしだと動作しないので。

VBA の中にワークシート関数を利用しているので、なおさらかなと思いました。

1Like

@neko_daisuki

すみません。自己解決しました…。

以下の処理式にしたら、想定通りの動きになりました。

Option Explicit

Sub CellsColorChange()
    
    Dim holyday As Variant
    Dim i As Integer
    Dim date_start As Date
    Dim date_end As Date
    Dim C As Integer
    Dim Status As String
    
    'シート名「祝日」から取得した祝日をholydayとする。
    holyday = Worksheets("祝日").Range("A2:A163").Value

    'AF列「納期」欄の記載開始行(i:初期値)を設定。
    i = 7
    
    '翌日をdate_start(開始日)とする。
    date_start = Date + 1
    
    '本日から5営業日後をdate_end(終了日)とする。
    date_end = WorksheetFunction.WorkDay(Date, 5, holyday)
    
    'AF列が空白になるまで処理を繰り返す。
    Do Until Cells(i, 32).Value = ""
    
        '本日から納期までの日数をCとする。
        C = Cells(i, 32).Value - Date

        'AI列「ステータス」欄の値をStatusとする。
        Status = Cells(i, 35).Value
    
        '納期より5営業日以下になった場合、AF列のセルを黄色に塗りつぶす。
        '納期当日および納期以降になった場合、AF列のセルを赤色に塗りつぶす。
        'AI列が「完了」の場合、塗りつぶしなし。
        If date_start <= Cells(i, 32).Value And date_end >= Cells(i, 32).Value And Status <> "完了" Then
            Cells(i, 32).Interior.Color = RGB(255, 255, 0)  '背景色:黄色
        ElseIf C <= 0 And Status <> "完了" Then
            Cells(i, 32).Interior.Color = RGB(255, 0, 0)    '背景色:赤色
        Else
            Cells(i, 32).Interior.Color = xlNone            '背景色:なし
        End If
        
        i = i + 1
    Loop
    
End Sub

ご協力ありがとうございました!

1Like

Cnt = WorksheetFunction.CountIf(Range(Cells(i, 32), Cells(i + 7, 32)), "2022/9/19")
この行は、"2022/9/19"をカウントしているのですか?

0Like

@neko_daisuki
ご回答ありがとうございます。

ご認識の通り、ボタンで動作します。
条件付き書式での方法も考えましたが、すでに書式設定がいっぱいでこれ以上容量が重くなるのは避けたいので、マクロで設定したいです。

また、ワークシート関数は「祝日」セルから祝日を取得するために書きました。
別シートからではなく自動で祝日を取得する方法はあるのでしょうか。

さらに、"2022/9/19"としたのはマクロを動かすための仮の値で、
実際には変数「h」を置きたいです。

0Like

Your answer might help someone💌