[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『条件付き書式で色がついているセルの◯の数をカウントするには?』(はこふぉあ)
条件付き書式で色がついているセルの◯の数をカウントしたいです。
現在下記にてカウントをしてみたのですが、条件付き書式で色がついているものに関してはカウントしてくれませんでした。
どのように変更すればカウントできますでしょうか?ご教授お願いします。
Function Countifvcolor(Rng, v, c)
Dim r As Range, cnt As Long
For Each r In Rng
If r.Value = v And r.Interior.Color = c.Interior.Color Then
cnt = cnt + 1
End If
Next
Countifvcolor = cnt
End Function
ExcelVBAは初心者ですので理解が追い付かない場合がありますがよろしくお願いします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
色付きセルをカウントする議論は昔からあります。 1. 条件付き書式ではない手動でつけた色については、 ユーザー定義関数があります。(提示されたコードですね) 2. 条件付き書式の結果としての色をカウントする話は、 (1)まずは、条件そのものから直接判断できないか検討します。これができればベスト。 (2)なんらかの事情でできない場合は、 Excel2010で導入されたDisplayFormatプロパティを使ったプロシージャで処理する。 (3)ユーザー定義関数では、DisplayFormatプロパティを直接は使えないが、 ある種の工夫をすると使えます。
2.の(3)については、 [[20210325141131]] 『条件付き色付きセルのカウント方法』(ひな) が参考になります。
【結論】 上記のスレッドをまずは読んでみてください。 (色条件に値の条件をANDで追加すればできるはずです。) (xyz) 2023/08/27(日) 17:27:53
少し結論を急ぎすぎたかもしれません。 まず、どんな条件付き書式なのか説明されたらいかがですか? その返事によっては、簡単なワークシート関数で個数がカウントできるかもしれません。
(xyz) 2023/08/27(日) 18:20:33
条件付き書式はF列の指定文字(1クラス、2クラス、3クラス、4クラス)によって指定された列の色を灰色にするものです。
E F G H I J K L M N
1クラス ✕ 〇灰 ✕灰 〇 〇灰 ✕ 〇 灰色の◯のみカウント集計
3クラス 〇 〇 ✕灰 〇 〇 〇 ✕ 灰色の◯のみカウント集計
4クラス 〇 〇 〇 〇 〇 〇 ✕ 灰色の◯のみカウント集計
2クラス ✕ 〇 ✕灰 ✕ 〇灰 〇 〇 灰色の◯のみカウント集計
こんな具合です。
DisplayFormatをどのように組み込んでいいのかが考えていろいろと試したのですがよくわからないままです。ご教授いただけると助かります。
(はこふぉあ) 2023/08/27(日) 18:51:43
E F G H I J K L M N
1クラス ✕ 〇灰 ✕灰 〇 〇灰 ✕ 〇 灰色の◯のみカウント集計
3クラス 〇 〇 ✕灰 〇 〇 〇 ✕ 灰色の◯のみカウント集計
4クラス 〇 〇 〇 〇 〇 〇 ✕ 灰色の◯のみカウント集計
2クラス ✕ 〇 ✕灰 ✕ 〇灰 〇 〇 灰色の◯のみカウント集計
(はこふぉあ) 2023/08/27(日) 19:01:16
>条件付き書式はF列の指定文字(1クラス、2クラス、3クラス、4クラス)によって >指定された列の色を灰色にするものです。
例えば、3クラスのH列は、灰色じゃないですよね?(1クラスは灰色なのに)
つまり、列単位で灰色になっているとは言えないと思います。
条件付き書式の条件を正確に説明してください。
(半平太) 2023/08/27(日) 19:13:43
条件付き書式は『数式を使用して、書式設定するセルを決定』を使い
「=$F1="3クラス”」を設定し適応先の範囲の列がクラス毎に違うようになっています。
※今回の図は4行ですが実際の行数は100ほどあり1〜4クラスが分散している状態です。
よろしくお願いします。
(はこふぉあ) 2023/08/27(日) 19:27:23
サンプルでは、「4クラス」の行には全く灰色が付いてないですよね?
サンプルの「灰」はあくまで例として、テキトーに書いただけなんですね?
(半平太) 2023/08/27(日) 20:09:11
1クラスが灰色の列が1番多く、2クラス、3クラスと少なくなっていく感じです。
※2クラスは3クラスが灰色の列+αの列が灰色、1クラスは2、3クラスが灰色の列+αの列が灰色
というような感じになってます。
(はこふぉあ) 2023/08/27(日) 20:25:03
サンプルの「灰」の位置が正しいとすると、
N1セル =IFERROR(SUMPRODUCT(INDEX({0,1,1,0,1,0,0;0,0,1,0,1,0,0;0,0,1,0,0,0,0;0,0,0,0,0,0,0},LEFT(F1))*(G1:M1="○")),"") 下にコピー
<結果図> 行 ___F___ _G_ _H_ _I_ _J_ _K_ _L_ _M_ _N_ 1 1クラス ○ ○ ○ ○ 2 2 3クラス ○ ○ ○ ○ ○ 0 3 4クラス ○ ○ ○ ○ ○ ○ 0 4 2クラス ○ ○ ○ ○ 1
この数式で、ワークしますか?
(半平太) 2023/08/27(日) 20:45:28
試してみていけそうです。ありがとうございます。
前回送っていた表はあくまでもサンプルでして、実際はGoogle formでとった結果を
コピーして貼る感じで使います。
実際の列数はG列ーCF列まであります。
この{0,1,1,0,1,0,0;0,0,1,0,1,0,0;0,0,1,0,0,0,0;0,0,0,0,0,0,0}の部分を変えればいけそうだと思うのですが、
どのような法則になっているのでしょうか?
(はこふぉあ) 2023/08/28(月) 09:45:40
既に記載のとおり、できれば数式対応が良いと思いますが、 仮にユーザー定義関数を使うとすれば、以下のようなことになるでしょう。 参考にしてください。
標準モジュールに、以下の二つのプロシージャをコピーします。
・基準となる色がセットされているセルを P1セル、 ・対象となるセル範囲をE列〜M列 ・合計表示列をN列 とします。 N2セルに =CountColorA(E2:M2,$P$1) とし、下にコピーペイストして下さい。
Function CountColorA(rng As Range, c As Range) As Long Dim sh As Worksheet Dim targetColor As Long Dim r As Range Dim cnt As Long
Application.Volatile cnt = 0 Set sh = rng.Parent targetColor = sh.Evaluate("CColor(" & c.Address & ")") For Each r In rng If r = "〇" Then If sh.Evaluate("CColor(" & r.Address & ")") = targetColor Then cnt = cnt + 1 End If End If Next CountColorA = cnt End Function
Function CColor(r As Range) As Long CColor = r.DisplayFormat.Interior.Color End Function
なお、上記の色のカウントは、条件付き書式のみならず、手動で設定した色も対象と なることに注意してください。
運用上の留意点は、次のとおりです。 ・シートのセル変更に伴って、(カウント計算に無関係でも)その都度 ユーザー定義関数の計算が実行されます ・トリッキーな手法のため、ブラックボックス化する懸念があること
リアルタイムで追随する点はメリットですが、それにはコストが伴うということです。 そこまでリアルタイム性が求められるものか、一考の余地があります。 もし、ボタン押し下げによる一括計算でよければ、負荷軽減できます。 Subプロシージャであれば、"普通"にDisplayFormatを使って繰り返し計算できます。
# "丸記号"は発言にあったものに合わせましたが、 # 往々にして別の文字であったりすることがあるので、 # 注意してください。 (xyz) 2023/08/28(月) 09:49:03
ご返信ありがとうございます。
試してみたところ、ちゃんと作動しました!!ありがとうございます!
皆様、貴重な時間を割いて教えて頂き本当にありがとうございました。
まだまだ理解しきれていない部分がかなりあるのでこれから学習していきたいと思います。
(はこふぉあ) 2023/08/28(月) 10:44:04
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.