選択した項目以外の条件付き書式を消してみる

昨日は、シート上にある条件付き書式一覧を、ユーザーフォームのリストボックスに表示してみた。
infoment.hatenablog.com
今日は、選択した項目以外の条件付き書式の削除に挑戦する。
f:id:Infoment:20181221220803p:plain

昨日は、シート内にある条件付き書式の「条件式」を抽出して、リストボックスに表示した。
f:id:Infoment:20181220221133p:plain
リストボックスの項目は、0番から始まっている。従って、表にするとこうなる。

Listboxのn番目 条件式
0 =MONTH($Q$1)<>MONTH(Q3)
1 =WEEKDAY(Q3)=1
2 =WEEKDAY(Q3)=7
3 =MONTH($A$1)<>MONTH(A3)
4 =MONTH($I$1)<>MONTH(I3)
5 =WEEKDAY(I3)=1
6 =WEEKDAY(I3)=7
7 =judgeholiday($A$3)=TRUE
8 =WEEKDAY(A3)=1
9 =WEEKDAY(A3)=7

一方、条件付き書式はコレクションオブジェクトであるため、1番目から始まる。先程の表に加えると、このようになる。

Listboxのn番目 条件付き書式のn番目 条件式
0 1 =MONTH($Q$1)<>MONTH(Q3)
1 2 =WEEKDAY(Q3)=1
2 3 =WEEKDAY(Q3)=7
3 4 =MONTH($A$1)<>MONTH(A3)
4 5 =MONTH($I$1)<>MONTH(I3)
5 6 =WEEKDAY(I3)=1
6 7 =WEEKDAY(I3)=7
7 8 =judgeholiday($A$3)=TRUE
8 9 =WEEKDAY(A3)=1
9 10 =WEEKDAY(A3)=7
一つずつずれているため、注意が必要だ。

また、リストボックスで選択したもの(或いはしていないもの)を上から順に削除した場合、一つ削除するごとに段違いが発生する。
【消す前】

条件付き書式 リストボックス
=MONTH($Q$1)<>MONTH(Q3) =MONTH($Q$1)<>MONTH(Q3)
=WEEKDAY(Q3)=1 =WEEKDAY(Q3)=1
=WEEKDAY(Q3)=7 =WEEKDAY(Q3)=7
=MONTH($A$1)<>MONTH(A3) =MONTH($A$1)<>MONTH(A3)
=MONTH($I$1)<>MONTH(I3) =MONTH($I$1)<>MONTH(I3)
=WEEKDAY(I3)=1 =WEEKDAY(I3)=1
=WEEKDAY(I3)=7 =WEEKDAY(I3)=7
=judgeholiday($A$3)=TRUE =judgeholiday($A$3)=TRUE
=WEEKDAY(A3)=1 =WEEKDAY(A3)=1
=WEEKDAY(A3)=7 =WEEKDAY(A3)=7

例えばリストボックスの3つ目(=2番目)を消した場合、リストボックスの内容は変更されていないので、以下のような段違いが生じる。
【消した後】

条件付き書式 リストボックス
=MONTH($Q$1)<>MONTH(Q3) =MONTH($Q$1)<>MONTH(Q3)
=WEEKDAY(Q3)=1 =WEEKDAY(Q3)=1
=WEEKDAY(Q3)=7 =WEEKDAY(Q3)=7
=MONTH($I$1)<>MONTH(I3) =MONTH($A$1)<>MONTH(A3)
=WEEKDAY(I3)=1 =MONTH($I$1)<>MONTH(I3)
=WEEKDAY(I3)=7 =WEEKDAY(I3)=1
=judgeholiday($A$3)=TRUE =WEEKDAY(I3)=7
=WEEKDAY(A3)=1 =judgeholiday($A$3)=TRUE
=WEEKDAY(A3)=7 =WEEKDAY(A3)=1
=WEEKDAY(A3)=7

段違いが発生したまま処理を進めると、意図しない条件付き書式の削除に繋がるため、注意が必要だ。今回はこれを回避するために、上からではなく下から削除することにする。

以上を踏まえた、削除機能がこちら。
今回は、「選択項目以外削除」というボタンを設けた。
f:id:Infoment:20181221223449p:plain

Private Sub DeleteButton_Click()
    Dim i As Long
    For i = ListBox1.ListCount - 1 To 0 Step -1
        If ListBox1.Selected(i) = False Then
            Cells.FormatConditions(i + 1).Delete
        End If
    Next
    ListBox1.Clear
    Call UserForm_Initialize
End Sub

結果は、以下のとおり。
f:id:Infoment:20181221223752g:plain

もちろん、このままでは未だ使い物にならない。
しかしとにかく、残したいものだけ残すことはできたようだ。

これでまた一歩、野望に近づいた。

参考まで。