指定したセルの色の件数を数えるCountColorというユーザー定義関数が、当ブログの人気記事なわけですが、あれって条件付書式で変更されたセルの色は判断出来ないんですよね。
元々のセルの色しか取得出来てなくて、条件付書式が発動後の色を取得する方法が無いか試行錯誤した結果、
DisplayFormatオブジェクトがあったんだけど、これってユーザー定義関数で動かなくて・・・。
注釈
DisplayFormat プロパティはユーザー定義関数では機能しないことに注意してください。たとえば、セル内部の色を返すワークシート関数で、Range(n).DisplayFormat.Interior.ColorIndex のような行を使用したとします。このワークシート関数が実行したときに #VALUE! エラーが返されます。
または、特定の範囲の設定を返すワークシート関数では DisplayFormat プロパティを使用できません。ただし、DisplayFormat は、Visual Basic for Applications (VBA) から呼び出される関数では機能します。
(Microsoft公式より https://msdn.microsoft.com/ja-jp/library/office/ff838814.aspx)
ってことで困った。
DisplayFormat
DisplayFormatは条件付書式が発動後のセル色など情報を取得できるオブジェクト。おお!って思ったけど上記の注釈で萎え。
以下のようにマクロ走らせてカウント結果をMsgBoxで出す事は可能だけど。。。
Sub test() Dim R As Range i = 0 Set R = Range("A1:B2") 'チェックする範囲を指定 Set C = Range("C1") '条件色セルを指定 For y = 1 To R.Columns.Count For x = 1 To R.Rows.Count If R(x, y).DisplayFormat.Interior.ColorIndex = C.Interior.ColorIndex Then i = i + 1 Next Next MsgBox ("一致セル数 : " & i) End Sub
ユーザー定義関数でやろうと思ったら考えられる方法はこうかな?
DisplayFormatは使えないので。
- セルに設定されている条件付書式の条件を引っ張ってくる
FormatConditionsの中にFormula1やらがある - VBA内で条件付書式の条件が発動するかどうか判定
- 判定の結果Trueだったら条件付書式で設定してあるセル色を取得
- そのセル色が指定のセル色かチェック、結果TrueならCount+1
こんな感じかなー。
1,2が面倒くさいんだよな。”セルの値が○○の場合”とかって簡単な条件であったらいいけど、”○○~△△の間”とか複数条件あったりすると、とかいろんなパターンを想定しておかないといけないので・・・。
ユーザー定義関数が発動しているかどうかのフラグがどっかに無いかなーって探したけど無さそう。