条件付き書式をまじめに勉強してみた
条件付き書式を設定するマクロ
年度最終日、さっさと仕事を済ませて華麗に帰ってやろうと思っていたのだが、新年度すぐに使う予定表に一つ機能を付け加え忘れていたことに気づいた。ワンクリックで1年分のカレンダーが更新されるようにしていたのに、土日のセルの色を変える条件付き書式を設定し忘れていたのだった。
ついこないだまでExcelど素人だった私。条件付き書式は普段あまり使うことがないので、いざやろうとしたら結構時間がかかってしまったのだった。
結局、単純作業の繰り返しに陥ってしまったので、以後こんなことにならないよう、自身の勉強も兼ねてブログに書いておくことにした。
マクロ記録してみる
まずは、A3セルに入っている日付が、土曜日か日曜日だったら、セルの背景を明るいグレーにする、という条件付き書式の設定をマクロ記録してみた。
「条件付き書式」→「ルールの管理」の順にクリックしたら、
こんなのが出てくるので、この画面で「新規ルール」をクリック。
すると、こんなやつが出てくるので、「数式を使用して、書式設定をするセルを決定」を選んで、「次の数式を満たす場合に値を書式設定」(変な日本語だな、オイ)欄に今回は、
OR(WEEKDAY($A$3)=1,WEEKDAY($A$3)=7)
を入力。「A3セルの日付が土曜日か日曜日だったらTrue」という条件だ。
次に、「書式」ボタンをクリックすると、
こんなのが出てくるので、明るいグレーのところ(赤枠のところね)をクリックして[OK]。そうしたら、
こんなふうになる。これで[OK]をクリックしたら設定完了。ここでマクロ記録終了。
ちなみに、ワークシート上ではこうなっている。画像のトリミングの仕方がおかしいな、オイ! グレーになっているところがA3セルです。
自動記録されたコード
んで、できたのが次のコード。改行とかタブとかちょっと整えてるけど。
リスト1
Sub Macro1() Cells.FormatConditions.Delete '……(1)' Range("A3").Select Selection.FormatConditions.Add _ Type:=xlExpression, _ Formula1:= _ "=OR(WEEKDAY($A$3)=1,WEEKDAY($A$3)=7)" '……(2)' Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority '……(3)' With Selection.FormatConditions(1).Interior '……(4)' .PatternColorIndex = xlAutomatic '……(5)' .ThemeColor = xlThemeColorDark1 '……(6)' .TintAndShade = -0.14996795556505 '……(7)' End With Selection.FormatConditions(1).StopIfTrue = False '……(8)' End Sub
うひゃあ、相変わらずイヤーなコードだw 見たことないようなプロパティが多いしw
何やってんだか解読してみよう。
リスト1の説明
まず、(1)なんだが、
Cells.FormatConditions.Delete
ん? Cells?……ってことは、一旦全てのセルの条件を削除しちまってるのか!? ってことは、安易に実行したら消されちゃ困る条件まで巻き添えで消されてしまうってことなのか???
で、(2)
Selection.FormatConditions.Add _ Type:=xlExpression, _ Formula1:= _ "=OR(WEEKDAY($A$3)=1,WEEKDAY($A$3)=7)"
ちょっと行継続文字をこまめに入れてある。選択中のセル(Selection)のFormatConditionsコレクションに、AddメソッドでFormatConditionオブジェクトを追加している。
引数のTypeってのはよく分からないんだけど、
によると、定数「xlExpression」が「演算」という意味のようだから、「数式を使用して、書式設定するセルを決定」を選んだ、という意味なんだろう。
んで、(3)。
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
FormatConditionsコレクションのインデックスに「Selection.FormatConditions.Count」を渡している。(1)で一旦FormatConditionをクリアした後、(2)のAddメソッドでFormatConditionオブジェクトを追加しているんだから、当然この時点でCountプロパティの値は「1」。要するに、さっき新たに追加したFormatConditionオブジェクトを指しているということなんだな……。
なんでこんなめんどくせーことするんだ???
すみません。取り乱しました。要するに、(2)で新たに追加したFormatConditionオブジェクトのSetFirstPriorityメソッドを使っているわけだが、
条件付き書式ルールの優先度の値を "1" に設定し、ワークシート内の他のルールより先に評価されるようにします。
……。これ、いる???
優先も何も、条件1つしかないのに……。
次は、(4)。
With Selection.FormatConditions(1).Interior
って、今度はFormatConditionsコレクションのインデックスは「1」なのかよw さっきの「Selection.FormatConditions(Selection.FormatConditions.Count)」ってのは何だったんだ???
それはともかく、FormatConditionオブジェクトのInteriorプロパティまでをWithでまとめているので、ここから先はセル(今回の場合はA3セル)の見た目を操作していくことになるはず。
(5)~(7)はいっぺんに行こう。
.PatternColorIndex = xlAutomatic '……(5)' .ThemeColor = xlThemeColorDark1 '……(6)' .TintAndShade = -0.14996795556505 '……(7)'
は、は~~~ん???
何でColorプロパティがないんだ???
すまん。(5)については、たぶん、
ということなんだと思う。
(7)については、
色を明るく、または暗くする単精度浮動小数点型 (Single) の値を設定します。
ということだそうだから、マクロ記録にありがちな
デフォルトで何ら問題なくて普段意識することすらないプロパティの設定をバカ正直にやっている
というだけのことだろう。
しかしながら、(6)はさっぱり分からん。
それ以上になんでColorプロパティに関する記述がないのか、もっと分からん。だれか、詳しい人は教えろてください。
またしても取り乱してしまった。気を取り直して(8)。
Selection.FormatConditions(1).StopIfTrue = False
StopIfTrueというのは、「条件を満たす場合は停止」のチェックのことで、こういうことらしい。
複数条件があるようなときは、結構重要なんだろうが、今回のように条件式が1つしかないときは、別にどうでもいいよね?
次回予告
う~~~ん、思ってた以上に手強いぞ、条件付き書式。
次回から、このコードを改良していこう。