エクセル の学校
8.一覧 9.HOME
1.Top 2.Last

[[20210325141131]]

[ 初めての方へ | 一覧(最新更新順) |

|
| 全文検索 | 過去ログ | エクセルの学校HOME ]

 

『条件付き色付きセルのカウント方法』(ひな)

指定した範囲の中で、条件付きで色がついたセルをカウントしたいです。 以下のコードを試したところ、色付きのセルはカウントしてくれましたが、条件付きで色がついたセルはカウントしてくれず、どのように直せば良いか分からず困っています。

VBAにお詳しい方、どなたか知恵をお貸しいただけると助かります( ω-、) よろしくお願いいたします!

Function CountColorA(Rng As Range) As Long

 Dim myRng As Range  Dim Col_cnt As Long

 Application.Volatile  Col_cnt = 0

 For Each myRng In Rng   If myRng.Interior.ColorIndex > 0 Then    Col_cnt = Col_cnt + 1   End If  Next myRng  CountColorA = Col_cnt   End Function

< 使用 Excel:Excel2016、使用 OS:Windows10 >


条件付き書式で色が付いているセルというのは、「条件を満たしているセル」なので 色が付いているものではなく「条件を満たしているセル」を探すのが良いと思います。 (きまぐれおじさん) 2021/03/25(木) 14:27
 >If myRng.Interior.ColorIndex > 0 Then
 を
 >If myRng.DisplayFormat.Interior.ColorIndex > 0 Then
 とすると通常の書式設定で色がついているセル、条件付き書式で色がついているセル両方を数える。

 もし、条件付き書式で色がついているセルだけであれば
 myRng.Interior.ColorIndex
 と
 myRng.DisplayFormat.Interior.ColorIndex
 が異なるものを数えてはどうか?
(ねむねむ) 2021/03/25(木) 15:05

 このトピの最後のレスで、γさんが有益な情報を提示しているので参考にしてください。
  ↓
[[20210225132255]] 『Functionで#value!が表示される』(アカポン)

(半平太) 2021/03/25(木) 15:06


 おっと、元質問をよく見ていなかった。
 ユーザー定義関数だったか。
 それだと半平太さんの示したリンク先にある工夫が必要になるか。
 半平太さん、指摘ありがとう。
(ねむねむ) 2021/03/25(木) 15:12

 ご指摘ありがとうございます。
 ご指摘の方法もありますが、色を直接見に行く下記のような方法がないではありません。
 (Application.Volatileが全体に及ぼす影響は除外しておきます。)
 参考にして下さい。

 Function CountColorA(Rng As Range) As Long
     Dim myRng As Range
     Dim Col_cnt As Long
     Application.Volatile
     Col_cnt = 0
     For Each myRng In Rng
         If Evaluate("CColor(" & myRng.Address & ")") > 0 Then '■■この行修正
             Col_cnt = Col_cnt + 1
         End If
     Next myRng
     CountColorA = Col_cnt
 End Function

 '■■以下を追加
 Function CColor(r As Range) As Long
     CColor = r.DisplayFormat.Interior.ColorIndex
 End Function

 【参考的補足】
 ・DisplayFormatは2010で導入されたRangeオブジェクトのプロパティです。
   条件付き書式の結果としての書式を得ることができます。
  (手動設定の書式も対象に含まれます)
 ・ただし、DisplayFormatは通常のプロシージャでは使えるが、
   ユーザー定義関数の中では使用できません、と従来言われて来ました。
 ・しかし、上記のような細工をすることで実質的に使えることが分かりました。
   (つまり、他のプロシージャから呼ばれた場合は機能することを利用したもの)
   他の掲示板で教えていただきました。
 (実は、私も、ユーザー定義関数の使用を何度却下したことか。南無合掌)  
(γ) 2021/03/25(木) 15:14

みなさま、コメントありがとうございます!!

>yさん ご丁寧に、ありがとうございます。 以下に書き換えましたが、「Forで指定された変数は既に使用されています。」のエラーがでてしまいます。 解消方法をご教授頂けないでしょうか??

Function CountColorA(Rng As Range) As Long

     Dim myRng As Range
     Dim Col_cnt As Long
     Application.Volatile
     Col_cnt = 0
     For Each myRng In Rng
         If Evaluate("CColor(" & myRng.Address & ")") > 0 Then 
          Function CColor(r As Range) As Long
          CColor = r.DisplayFormat.Interior.ColorIndex
          End Function
          Col_cnt = Col_cnt + 1
         End If
     Next myRng
     CountColorA = Col_cnt
 End Function

(ひな) 2021/03/25(木) 16:48


>yさん 失礼しました。 頂いたものをそのまま貼り付ければ良かったんですね。 ただ、エラーにはならないものの、カウントができませんでした( ω-、) 0になってしまいます。。

(ひな) 2021/03/25(木) 17:05


 CColorはそのまま残して、CountColorAを以下に差し替えて見て下さい。
 こちらのほうが、より安定すると思います。

 Function CountColorA(Rng As Range) As Long
     Dim myRng As Range
     Dim Col_cnt As Long
     Dim sh  As Worksheet
     Application.Volatile
     Col_cnt = 0
     Set sh = Rng.Parent
     For Each myRng In Rng
         If sh.Evaluate("CColor(" & myRng.Address & ")") > 0 Then
             Col_cnt = Col_cnt + 1
         End If
     Next myRng
     CountColorA = Col_cnt
 End Function
(γ) 2021/03/25(木) 17:35

>yさん 出来ました!!!! 本当に本当にありがとうございます!! 困っていたので助かりました(^^)

貴重なお時間割いていただき、感謝致します! (ひな) 2021/03/25(木) 17:42


>yさん 何度もすみません!! もしすぐに分かればで構わないので、もう一点だけ聞いてもいいでしょうか?

色を指定したい場合は、どう記載すればいいでしょうか?? (ひな) 2021/03/25(木) 17:52


【余談】(コメント不要です) ユーザー定義関数を入力した時点では正確に表示される。(むろん発言に先立って確認してます) その後、0になるのだろう。 Application.Evaluateと、 Worksheet.Evaluateとでは振る舞いが違うのかも知れない。

一般に「評価」にあたっては、どの「環境」のもとで評価するかが重要とされますが、 両者でどれほど環境が違うのだろうか、外部からは窺い知れないが、 そのシートで評価するんだから、Application.Evaluateよりも、 Worksheet.Evaluateがよいのだろう、と思っておくことにしたい。

(γ) 2021/03/25(木) 17:58


見本の色をつけたセルを作っておき、 Function CountColorA(Rng As Range,r2 as Range) As Long と変更して、 条件判定部分を以下に修正してはどうですか? If sh.Evaluate("CColor(" & myRng.Address & ")") = r2.Interior.ColorIndex Then あとは色々と応用はあるはずなので、ご自分でトライしてみて下さい。

(γ) 2021/03/25(木) 18:04


ありがとうございます!! 試してみますね♪

世話かけまして申し訳ありませんでした! vba所見だったので、これから精進します!! (ひな) 2021/03/25(木) 18:11





[ 一覧(最新更新順) |

]

キーボードヒント:[Home]または[Fn+Home]キーで一番上へ戻ります

YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.