和風スパゲティのレシピ

日本語でコーディングするExcelVBA

35本目:条件付き書式

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:条件付き書式

#VBA100本ノック 35本目
表には条件付き書式が設定されていますが、行編集を繰り返した為に条件付き書式が大量に増えてしまいました。
以下の条件で、条件付き書式を再設定してください。
・対象はE列とG列
・90%未満は赤で塗りつぶす
・100%未満は赤文字
※シートは任意

条件付き書式サンプル

◇ 出題ページはこちら
https://excel-ubara.com/vba100/VBA100_0●●.html

ソースコード

定義モジュール

Option Explicit

' データ
Public Const R1stデータ = 3
Public Const C1stデータ = 2
Public Enum CNoデータ
    科目 = C1stデータ
    今年
    昨年
    昨年比
    予算
    予算比
End Enum
Public Const CLastデータ = CNoデータ.予算比
Public Const Formula比率着色条件_背景色 = "=AND(E1<>"""",E1<0.9)"
Public Const Formula比率着色条件_文字色 = "=AND(E1<>"""",E1<1)"

メインモジュール

' 100本ノック035:条件付き書式
Sub 条件付き書式を再設定する()
  
    Dim 書式設定エリア As Range
    Set 書式設定エリア = Union(WSデータ.Columns(CNoデータ.昨年比) _
                                        , WSデータ.Columns(CNoデータ.予算比))
  
    With 書式設定エリア.FormatConditions
        
        .Delete
        
        With .Add(xlExpression, Formula1:=Formula比率着色条件_背景色)
            .Interior.Color = vbRed
        End With
        With .Add(xlExpression, Formula1:=Formula比率着色条件_文字色)
            .Font.Color = vbRed
        End With

    End With

End Sub

解説

条件付き書式を設定する問題でした。

設定自体はそこまで難しくはなく、
対象セル範囲のFormatConditionsをいじれば設定することができます。


あとはシートレイアウトの定数化とどう対応させるかという問題ですが、
本解答のように数式をString定数にして定義モジュールに置いておくがおすすめです。

これなら列の挿入削除があった際にも、
Enumの修正時に数式の変更に対応することが出来ます。


数式までEnumに連動させようとして、

Left(.Cells(1, CNoデータ.昨年比).Address(0, 0), 1)

こんな風に数式内の「E」を生成することもできるはできますが、
かえって難読化していらぬバグを招きますのでこの程度の定数化で十分と思います。

メンテナンス性とコーディングコストはある程度進むとトレードオフになってきますので、
このあたりはバランスを見て実装を決めてください。

汎用マクロ版

本問のような「条件付き書式の増殖問題」への対応は、

  1. 一旦2行目以降の条件付き書式をクリア
  2. 1行目の条件付き書式を範囲全体へ拡張

というマクロを作るという対応策もあります。

これならシートごとにマクロを作る必要がないため、
よくこの処理を行う場合はこれがあると相当便利だと思います。


こちらの記事で詳細を解説しておりますので、
よろしければお持ち帰りください。
www.limecode.jp