エクセル | の学校 |
8.一覧 | 9.HOME |
1.Top | 2.Last |
『条件付き色付きセルのカウント方法』(ひな)
指定した範囲の中で、条件付きで色がついたセルをカウントしたいです。 以下のコードを試したところ、色付きのセルはカウントしてくれましたが、条件付きで色がついたセルはカウントしてくれず、どのように直せば良いか分からず困っています。
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 >
>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
(ひな) 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
貴重なお時間割いていただき、感謝致します! (ひな) 2021/03/25(木) 17:42
色を指定したい場合は、どう記載すればいいでしょうか?? (ひな) 2021/03/25(木) 17:52
一般に「評価」にあたっては、どの「環境」のもとで評価するかが重要とされますが、 両者でどれほど環境が違うのだろうか、外部からは窺い知れないが、 そのシートで評価するんだから、Application.Evaluateよりも、 Worksheet.Evaluateがよいのだろう、と思っておくことにしたい。
(γ) 2021/03/25(木) 17:58
(γ) 2021/03/25(木) 18:04
世話かけまして申し訳ありませんでした! vba所見だったので、これから精進します!! (ひな) 2021/03/25(木) 18:11
]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.