選択した項目以外の条件付き書式を消してみる
昨日は、シート上にある条件付き書式一覧を、ユーザーフォームのリストボックスに表示してみた。
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
結果は、以下のとおり。
もちろん、このままでは未だ使い物にならない。
しかしとにかく、残したいものだけ残すことはできたようだ。
これでまた一歩、野望に近づいた。
参考まで。