条件付き書式の優先順位
VBAで条件付き書式の追加を複数行う場合、より先に設定したルールの方が自動的に優先順位が高くなります。言い方を変えると、追加順、になります。
あとで優先順位を変更したい場合はFormatConditionクラスのPriorytyプロパティ、SetFirstPriorityメソッド、SetLastPriorityメソッドの3つを利用します。
1 2 |
'// 優先順位を1からFormatCondition.Countの範囲内で設定する Property FormatCondition.Priority As Long |
1 2 |
'// 優先順位を1に設定する Sub FormatCondition.SetFirstPriority() |
1 2 |
'// 優先順位を最後に設定する Sub FormatCondition.SetLastPriority() |
また、優先順位が上位のルールが適用されたあとに下位のルールを適用したくない場合は以下のプロパティを利用します。
1 2 |
'// 以降のルールの適用を行うか設定する(True:以降のルールは適用しない、False:適用する) Property FormatCondition.StopIfTrue As Boolean |
優先順位のプロパティを使うよりも削除+優先順に追加した方が簡単
上のプロパティを使えば優先順位の変更は可能ですが、複数のルールの優先順位を変更する場合はかなり難解なコードになります。
例えば、FormatConditions(1)から(4)までの4つのルールがあったとします。
FormatConditions(2)の優先順位を先頭にしようとして「FormatConditions(2).SetFirstPriority」とすると、その直後に2、1、3、4の優先順になります。
この状態からさらに優先順位を変えることになると、変更後のインデックスは何なのかを把握しておく必要があります。
そのため、複数のルールの優先順位を変えるのであれば、条件付き書式を一度削除して優先度順に追加しなおした方がラクなことの方が多いです。
サンプルコード
まず、以下の関数で4つのルールを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub FormatCollectionsAddTest2() Dim r As Range Dim f As FormatCondition Dim i '// 対象範囲指定 Set r = Range("A:A") For i = 1 To 4 '// 条件付き書式の追加 Set f = r.FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:=i) '// フォント太字、文字色、背景色 f.Font.Bold = True f.Font.Color = RGB(20, 140, 150) f.Interior.Color = RGB(200, 250, 180) f.Borders.LineStyle = xlContinuous Next End Sub |
実行後は以下のようになります。
次に、優先順位を入れ替えて、元々の1,2,3,4の順を2,3,4,1に変えます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub FormatCollectionPriorityTest() Dim r As Range Set r = Range("A:A") Call r.FormatConditions(1).SetFirstPriority '1234 Call r.FormatConditions(4).SetFirstPriority '4123 Call r.FormatConditions(4).SetFirstPriority '3412 Call r.FormatConditions(4).SetFirstPriority '2341 r.FormatConditions(3).StopIfTrue = True End Sub |
実行すると以下のようになります。
コードの7,8,9行目はインデックス4に対する全く同じコードですが、それぞれ対象のルールが異なります。
複数のルールの優先順位を変える場合はこういうわかりにくいコードになる恐れがあるため、上に書いたとおり、削除+追加を検討した方がよいでしょう。