Excelの選択しているセルの行・列に色を付ける(書式を設定する)

Twitterで面白そうなネタを見つけたのでやってみる。

はまさんのツイート: "アクティブセルの行全体に色を付ける方法です。横に長い表の場合は、便利です。 https://t.co/wJr1nNaxxX… "

アクティブセルのある行・列を目立たせる:エクセルマクロ・Excel VBAの使い方-イベントプロシージャ

リンク先の方法は非常にシンプルで良いのですが、直前に触った一つのセルしか対象になりません。

複数セル選択に対応できないかと、いじくり回していたら何とかなったので備忘録として残します。

コード

'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

動作イメージ

やっていること

  1. 常にTRUEの条件付き書式を作成する(常にその範囲に書式が設定される)
  2. 条件付き書式の適用範囲を、選択セルに応じて動的に変更する

余談

FormatConditionModifyAppliesToRangeなど一部のメソッドは、実行しても「元に戻す」の履歴は消えないようです。

問題点

条件付き書式を自己生成するため、止める手段がありません。

アドイン化&クラスモジュール化して、インスタンス・破棄で制御する形にすれば良いですが……