Excelの選択しているセルの行・列に色を付ける(書式を設定する)
Twitterで面白そうなネタを見つけたのでやってみる。
はまさんのツイート: "アクティブセルの行全体に色を付ける方法です。横に長い表の場合は、便利です。 https://t.co/wJr1nNaxxX… "
リンク先の方法は非常にシンプルで良いのですが、直前に触った一つのセルしか対象になりません。
複数セル選択に対応できないかと、いじくり回していたら何とかなったので備忘録として残します。
コード
'Worksheet Module Private Sub Worksheet_SelectionChange(ByVal Target As Range) '条件付き書式で使う数式(常にTrue) Const FC_ID = "=ISTEXT(""ID1"")" '条件付き書式を適用する範囲 Dim crossRng As Excel.Range Set crossRng = Excel.Union(Target.EntireRow, Target.EntireColumn) '条件付き書式を探す Dim fc As Excel.FormatCondition If tryGetFmtCond(Me, FC_ID, fc) Then '条件付き書式の範囲を変更(元に戻すの履歴は消えない) Call fc.ModifyAppliesToRange(crossRng) Else '見つからなかったので新規作成 Set fc = crossRng.FormatConditions.Add(xlExpression, Formula1:=FC_ID) With fc.Interior .Pattern = XlPattern.xlPatternGray25 .PatternColor = vbYellow End With 'fc.Interior End If End Sub '`ws`から`condFormula`の数式の条件付き書式を探す。 '見つかったらTrueおよび`oFmtCond`に見つかった条件付き書式を返す。 Private Function tryGetFmtCond( _ ws As Excel.Worksheet, _ condFormula As String, _ ByRef oFmtCond As Excel.FormatCondition) As Boolean Dim fc As Excel.FormatCondition For Each fc In ws.Cells.FormatConditions Select Case True Case fc.Type <> XlFormatConditionType.xlExpression, _ fc.Formula1 <> condFormula 'Next Case Else Set oFmtCond = fc Let tryGetFmtCond = True Exit Function End Select Next fc End Function
動作イメージ
— いみひと (@nukie_53) 2018年2月22日
やっていること
- 常にTRUEの条件付き書式を作成する(常にその範囲に書式が設定される)
- 条件付き書式の適用範囲を、選択セルに応じて動的に変更する
余談
FormatCondition
のModifyAppliesToRange
など一部のメソッドは、実行しても「元に戻す」の履歴は消えないようです。
問題点
条件付き書式を自己生成するため、止める手段がありません。
アドイン化&クラスモジュール化して、インスタンス・破棄で制御する形にすれば良いですが……