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

昨日は、シート内にある条件付き書式の「条件式」を抽出して、リストボックスに表示した。

リストボックスの項目は、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 |
段違いが発生したまま処理を進めると、意図しない条件付き書式の削除に繋がるため、注意が必要だ。今回はこれを回避するために、上からではなく下から削除することにする。
以上を踏まえた、削除機能がこちら。
今回は、「選択項目以外削除」というボタンを設けた。

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
結果は、以下のとおり。

もちろん、このままでは未だ使い物にならない。
しかしとにかく、残したいものだけ残すことはできたようだ。
これでまた一歩、野望に近づいた。
参考まで。