増殖した条件付き書式を統合する

昨日は「選択した条件式が、どの範囲に適用されているかを見える化」してみた。
infoment.hatenablog.com
ここまでくると、見える化だけでは物足りない。何故なら、ことの発端は

条件付き書式って、気が付くと増殖してるよね

だったからだ。

そこで今回は、選択した条件付き書式を統合することに挑戦する。
f:id:Infoment:20181224174050p:plain
※デューク東郷(ゴルゴ13)のフリー素材が無かったので、スナイパーの画像を貼ってみた。


まず、条件付き書式が「同じ」であることを、何を以って判別するか。少し考えてみたが、条件式に入るアドレスが異なる場合、完全一致での判別は不可能だ。
また、今回のように

  • =WEEKDAY(A3)=1
  • =WEEKDAY(A3)=7

のような極めて似たような条件式が、共存することもある。自動で判別できる気がしない。

ということで今回は、「人による判断」で選択してもらう。
ユーザーフォームに、「選択項目条件統合」ボタンを配置。
f:id:Infoment:20181224174809p:plain

別の条件付き書式を選んでしまった場合は、仕方ない。作業前には必ず保存を。
とにかく、選択された条件付き書式について、以下を行うことにした。

  1. 一つを除いて、他の条件付き書式を削除する。
  2. 残した一つに、選択した適用範囲全てを設定。

適用範囲の再設定は、以下で行う。

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

結果は、このようになった。
f:id:Infoment:20181224175514g:plain

おお、上手くいった!と、一瞬思った。
しかしよく見ると、文字が灰色になるはずの、先月の日曜日が赤くなっている。
f:id:Infoment:20181224175715p:plain

他にもおかしな箇所があり、まだ実用化には遠い。とりあえず、今日はここまで。

明日は、今回の事象の原因と対策に取り組むことにします。
(これでまた一歩、野望に近づいた。)

参考まで。