【ExcelVBA】条件付き書式はワークシート関数では使えない

久々にはまったので自分用にメモ。条件付き書式の設定されたセルで、表示された色が何色かを把握するにはDisplayFormatを使いますが、DisplayFormatはユーザ定義関数では使えません

やりたかったこと

こういうワークシートがありまして

このうち、日曜日は条件付き書式で色付けしてあります。

条件付き書式
日曜日なら赤くする

この条件付き書式で赤くなっているセルと、手動で赤くしたセルと合わせてカウントするようなユーザ定義関数を作ったところ、エラーとなりました。

Public Function CountRed(Rng As Range)
    
    Dim R As Range
    Dim Cnt As Long
    
    Cnt = 0
    
    For Each R In Rng
        If R.Value <> "" Then
            If RGB(255, 0, 0) = R.Font.Color Or RGB(255, 0, 0) = R.DisplayFormat.Font.Color Then
                Cnt = Cnt + 1
            End If
        End If
    Next R
    
    CountRed = Cnt
    
End Function
ワークシート上で=CountRed(範囲)で呼び出そうとしたらエラーとなった

なんで?

原因

理由は、DisplayFormatがユーザ定義関数では機能しないからです。そういう仕様です。

Range.DisplayFormat プロパティ (Excel)

https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.displayformat

↑これを読むと、「 ただし、DisplayFormat は、Visual Basic for Applications (VBA) から呼び出される関数では機能します。 」とありました。確かに、イミディエイトペインでは機能します。

回避策

そこで仕方がないのでボタンを一個ワークシート上に作成し、そのボタンを押したら特定のセルに値が反映されるようにしました。

ボタンを作成。ボタンには下記↓のマクロを登録。ボタンを押すとセルAC4に値が入る
Public Sub SetCountRed()
    
    ThisWorkbook.Worksheets(1).Range("AC4").Value _
        = CountRed(ThisWorkbook.Worksheets(1).Range("B4:Z8"))

End Sub

かっこ悪いですけど仕方がないです。