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」を生成することもできるはできますが、
かえって難読化していらぬバグを招きますのでこの程度の定数化で十分と思います。
メンテナンス性とコーディングコストはある程度進むとトレードオフになってきますので、
このあたりはバランスを見て実装を決めてください。
汎用マクロ版
本問のような「条件付き書式の増殖問題」への対応は、
- 一旦2行目以降の条件付き書式をクリア
- 1行目の条件付き書式を範囲全体へ拡張
というマクロを作るという対応策もあります。
これならシートごとにマクロを作る必要がないため、
よくこの処理を行う場合はこれがあると相当便利だと思います。
こちらの記事で詳細を解説しておりますので、
よろしければお持ち帰りください。
www.limecode.jp