増殖した条件付き書式を統合する
昨日は「選択した条件式が、どの範囲に適用されているかを見える化」してみた。
infoment.hatenablog.com
ここまでくると、見える化だけでは物足りない。何故なら、ことの発端は
条件付き書式って、気が付くと増殖してるよね
だったからだ。
そこで今回は、選択した条件付き書式を統合することに挑戦する。
※デューク東郷(ゴルゴ13)のフリー素材が無かったので、スナイパーの画像を貼ってみた。
まず、条件付き書式が「同じ」であることを、何を以って判別するか。少し考えてみたが、条件式に入るアドレスが異なる場合、完全一致での判別は不可能だ。
また、今回のように
- =WEEKDAY(A3)=1
- =WEEKDAY(A3)=7
のような極めて似たような条件式が、共存することもある。自動で判別できる気がしない。
ということで今回は、「人による判断」で選択してもらう。
ユーザーフォームに、「選択項目条件統合」ボタンを配置。
別の条件付き書式を選んでしまった場合は、仕方ない。作業前には必ず保存を。
とにかく、選択された条件付き書式について、以下を行うことにした。
- 一つを除いて、他の条件付き書式を削除する。
- 残した一つに、選択した適用範囲全てを設定。
適用範囲の再設定は、以下で行う。
ModifyAppliesToRange
具体的なコードがこちら。
Private Sub IntegrationButton_Click() ' 適用範囲を取得。 Dim TempRange As Range Set TempRange = myRng ' 残す一つのリスト番号を取得。 ' 今回は、一つ目に選択されたものとする。 Dim RemainIndex As Long RemainIndex = -1 Dim i As Long For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) = True Then RemainIndex = i Exit For End If Next ' 一つも選ばれていない場合は、処理中断。 If RemainIndex = -1 Then Exit Sub ' リストボックスで選択された項目に対応する ' 条件付き書式の削除または適用範囲の再設定。 Dim FC As FormatCondition For i = ListBox1.ListCount - 1 To 0 Step -1 Set FC = Cells.FormatConditions(i + 1) If ListBox1.Selected(i) Then Select Case i Case RemainIndex FC.ModifyAppliesToRange TempRange Case Else FC.Delete End Select End If Next ' リストボックスの更新。 ListBox1.Clear Call UserForm_Initialize End Sub
結果は、このようになった。
おお、上手くいった!と、一瞬思った。
しかしよく見ると、文字が灰色になるはずの、先月の日曜日が赤くなっている。
他にもおかしな箇所があり、まだ実用化には遠い。とりあえず、今日はここまで。
明日は、今回の事象の原因と対策に取り組むことにします。
(これでまた一歩、野望に近づいた。)
参考まで。