Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Excel 2019)
条件付き書式の色のセル数を数える
投稿日時: 22/04/14 00:37:22
投稿者: まさゆり

「同じ色のセルの数をカウント」をしたく
VBAで、以下のコードを検索しました。
そのコードの欄外に「条件付き書式で設置された色は非対応
との注意書きが記載されていました。
 
条件設定は、「日付(年月の設定で日にちを1月分連続)・土日(=aaa)」で塗りつぶし」を設定しています。
なお、カウントは、色を付けていない平日の日数です。
(VBAを使わなくても、平日のカウントが可能であればと思いますが。。。)
 
よろしくお願いします。
 
Function ColorCount(R1 As Range, C As Range) As Long
  Dim r As Range
 
  Application.Volatile ’ユーザー定義関数を自動再計算関数にします
  ColorCount = 0 ’初期値
 
  For Each r In R1
    If r.Interior.Color = C.Interior.Color Then 'セルの色をチェックします
      ColorCount = ColorCount + 1 ’カウントの計算
    End If
  Next r
 
End Function

投稿日時: 22/04/14 01:26:36
投稿者: まさゆり

追伸
 土日のほかに祝日も「塗りつぶし」の設定を行っています。
よろしくお願いします。

回答
投稿日時: 22/04/14 06:13:34
投稿者: simple

条件付き書式による色がついたセル数のカウントは、
ユーザー定義関数を使って次のようにできます。
以前(2020年10月)、んなっとさんから紹介していただきました。
 

Function CCCount(r1 As Range, r2 As Range) As Long
    Dim Sht As Worksheet
    Dim n As Long, r As Range
    Set Sht = r1.Parent
    For Each r In Intersect(Sht.UsedRange, r1).Cells
         If Sht.Evaluate("CColor(" & r.Address & ")") = r2.Interior.Color Then
            n = n + 1
        End If
    Next
    CCCount = n
End Function

Function CColor(r As Range)
    CColor = r.DisplayFormat.Interior.Color
End Function
上記の"色"には、条件付き書式によるもののほか、通常の手作業によるものも含みます。
 
今回は色がついていない箇所をカウントしたいということのようなので、
以下のいずれかの方法を使ってはどうでしょう。
(1)色がついていないセルを、第二引数に指定して利用。
     例   =CCCount(A1:A10,C1)
または、     
(2)上記のコードの次の2か所を修正して、
      @ Function CCCount(r1 As Range) As Long    
      A If Sht.Evaluate("CColor(" & r.Address & ")") = 16777215 Then
   例えば =CCCount(A1:A10) のように使います。
汎用的な(1)の方法を推奨します。
 
【備考】
(1)DisplayFormatプロパティが使えるのは、Excel2010以降です。
(2)CCCountの中にCColorの機能を取り込むような修正を行うと動作しません。
  これは、「ユーザー定義関数の中では、DisplayFormatプロパティが動作しない」という
  仕様上の制約に触れるためです。
  それを避けるための工夫として、わざわざ、その部分を外に出しているのです。

回答
投稿日時: 22/04/14 06:30:49
投稿者: simple

なお、
 =CCCount(A:A,C1)
として、列全体を指定することも考えられますが(コードの意図はそうです)、
この場合は色がついていないところのカウントでもあり、
他の列の入力により、UsedRangeが拡がることもありうるなら、
誤判定につながりやすいので、列全体ではなく限定したほうが確実かと思います。

投稿日時: 22/04/15 08:41:35
投稿者: まさゆり

simple様 
第二引数に指定にてカウントすることができました。
ありがとうございました。
 
(んなっとさんにも、お世話になったことがあります)