[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『色付けしたセルのカウントができる関数』(困ってます、ああ)
教えてください。
Excelで関数を使って色付きセルのカウントをしたいです。
E5〜E20 までを(A〜Cさん)で氏名毎でカウントしていました。
カウントイフで数えていたのですが
ここに色付け(黄色)をしたセルの数を引きたいです。
可能でしょうか?
調べても行き詰ってしまいました。
皆様のお力をお貸しいただけたら幸いです。
よろしくお願いいたします。
< 使用 Excel:unknown、使用 OS:Windows11 >
色(セルの塗りつぶし色ですか?)を判定できるワークシート関数は提供されていません。 ユーザー定義関数を使うことになります。
最初に確認ですが、黄色は、どのような基準でつけていますか? 他の情報で客観的に決まるものなら、ワークシート関数で判定できますね。 それが曖昧なもので、客観的に再現できず、色を出発点とせざるを得ないものなら、 ユーザー定義関数(UDF)を使うことになります。
まずは、ここまで確認したい。色をつける基準について説明ください。 また、Excelのバージョンを明記してください。
(xyz) 2023/06/16(金) 16:19:57
Excelのバージョンは確認方法から見た所
Microsoft Office Home and Business 2019
とありました。こちらで大丈夫でしょうか?
また色付けは曖昧で利用が終了した方に色付けをしていました。
この場合は、色が出発点となるのでしょうか?
知識不足で申し訳ありませんが、ご教授いただければ幸いです。
(困ってます、ああ) 2023/06/16(金) 16:58:05
(1)
まず、セルの塗りつぶし色が黄色ならTrue、そうでないならFalseを返すUDFを作ります。
標準モジュールに下記をコピーして下さい。
Function isYellow(rng As Range) As Boolean
Application.Volatile
isYellow = rng.Interior.Color = vbYellow
End Function
(2) F5 セルに =isYellow(E5) と入れると、 E5セルが黄色ならTrue, そうでなければFalseを返します。 それを以下にコピーします。
(3) あとは、COUNTIFSを使って、 ・E列がAであり、 ・F列がFalseのものだけの個数を集計すれば、 黄色ではないセルに絞った、Aさんの個数合計が計算できます。 他の方も同じです。こんなことでどうでしょうか。
(4) なお、色を変えるだけでは、isYellowは再計算しません。 シートのどこかのセルを変更すれば、再計算します。 (逆に言うと、それだけ余計な再計算をする、とも言えます) この点を理解しておいてください。
あとは、氏名のカウントもユーザー定義関数でもできますが、 一番簡単なものに限っておいたほうが、逆に汎用的に使えるかと思いました。 その他の手法は別の方からのコメントを期待してください。それでは。
(xyz) 2023/06/16(金) 17:17:01
参考にやってみます。
貴重なお時間をいただきましてありがとうございます。
(困ってます、ああ) 2023/06/16(金) 17:41:08
同じ人でも色をつける場合とつけない場合があるってこと?
どっちにしても、そういうことは色だけで区別するのではなく どこかの列にフラグを立てた方がいいのでは?
たとえば F列だとして
E F 4 名前 区分 5 C 1 6 A 7 B 1 8 B 9 A 10 C 11
終了の場合は F列に「1」を入力 ※E列に色をつけたいのなら条件付き書式で(数式:=F5=1)
氏名ごとのカウントは
H I 5 A 2 6 B 1 7 C 1
I5 =COUNTIFS($E$5:$E$20,H5,$F$5:$F$20,"") 下コピー
参考まで (笑) 2023/06/16(金) 18:00:08
参考にしてください。 違っていたらスルーしてください。 >利用が終了した方に色付けをしていました。 どこかの列に終了と記載されているとしています。 終了のところだけ色付けされているとしています。
>ここに色付け(黄色)をしたセルの数を引きたいです。 COUNTIF($A$2:$A$21,D$2)で同じ氏名をカウントする。 COUNTIFS($A$2:$A$21,$D2,$B$2:$B$21,"終了")で同じ氏名の「終了」をカウントする。 色なし「色付け(黄色)をしたセルの数を引きたいです。」 E2=COUNTIF($A$2:$A$21,D$2)-COUNTIFS($A$2:$A$21,$D2,$B$2:$B$21,"終了") 下へコピー
|[A] |[B] |[C]|[D] |[E]
[1] |名前 |区分| |名前 |色なし
[2] |たなか |終了| |たなか | 2
[3] |さとう |終了| |さとう | 3
[4] |すずき | | |すずき | 3
[5] |いけだ |終了| |いけだ | 2
[6] |たなか | | | |
[7] |さとう | | | |
[8] |すずき |終了| | |
[9] |いけだ | | | |
[10]|たなか |終了| | |
[11]|さとう | | | |
[12]|すずき | | | |
[13]|いけだ |終了| | |
[14]|たなか | | | |
[15]|さとう | | | |
[16]|すずき |終了| | |
[17]|いけだ | | | |
[18]|たなか |終了| | |
[19]|さとう |終了| | |
[20]|すずき | | | |
[21]|いけだ |終了| | |
条件付き書式 数式を使用して、=B2="終了" (IT) 2023/06/16(金) 22:40:23
ちょっと脱線しに来ました ^^;
「黄色黄色って、どこまで黄色と認めるんだい?」という 実務ではまず直面することが無いであろう(しょうもない)課題を仮定した場合に、 ひょっとしたら部分的にでも役に立つかもしれないカラーモデル間変換関数どものデモです。 (ホントはクッソ長いユーザーフォーム使った遊び道具なんだけど関数部分だけ抜粋してのお届け)
Option Explicit
Sub test()
[A1:A20].Value = [{60;0.95;0.9;0.85;0.8;0.75;0.7;0.65;0.6;0.55;0.5;0.45;0.4;0.35;0.3;0.25;0.2;0.15;0.1;0.05}]
[B1:K1].Value = [{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1}]
[A23:A48].Value = [{45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70}]
[L22:T22].Value = [{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}]
[A2:A20,B1:K1,L22:T22].NumberFormat = "0%"
[B2:K20].FormulaR1C1 = "=HSL2RGB(R1C1,R1C,RC1)"
[B23:K48].FormulaR1C1 = "=HSL2RGB(RC1,R1C,0.5)"
[B51:T76].FormulaR1C1 = "=ToWebColor(R[-28]C)"
[L2:T20].FormulaR1C1 = "=ToWebColor(RC[-10])"
[L23:T48].FormulaR1C1 = "=HSL2RGB(RC1,1,R22C)"
[B2:T20,B23:T48,B51:T76].Select
PaintThisRGB
[A1].Select
End Sub
Function ThisRGB(Optional ByVal Target As Range) As Variant
With Application
.Volatile
If Target Is Nothing Then Set Target = .ThisCell Else Set Target = Target.Cells(1, 1)
ThisRGB = Target.Interior.Color
If Target.Interior.ColorIndex = xlColorIndexNone Then ThisRGB = CVErr(xlErrNA)
End With
End Function
Sub PaintThisRGB()
Dim R As Range
For Each R In ActiveWindow.RangeSelection.Cells
R.Interior.Color = R.Value
R.Font.Color = IIf(GetYfromRGB(R.Value) > 0.5!, &H0&, &HFFFFFF)
Next
End Sub
Rem =================================================================================================================
Rem カラー値計算関数群
Rem 参考文献
Rem 『CSSの色合成式をVBAで再現』(中途B) エクセル Excel [エクセルの学校]
Rem https://www.excel.studio-kazu.jp/kw/20181219225917.html
Rem PEKO STEP - 無料で楽しめるゲームやアプリの配信サイト
Rem https://www.peko-step.com/
Rem
Rem =================================================================================================================
Function SplitRGB(aRGB As Long, Optional Percentage As Boolean) As Variant
Rem RGB値をR,G,Bの各要素の配列に変換
Dim i As Long, Ary(0 To 2) As Variant
For i = 0 To 2
Ary(i) = (aRGB \ &H100& ^ i) Mod &H100&
If Percentage Then Ary(i) = CSng(Ary(i) / &HFF&)
Next
SplitRGB = Ary
End Function
Function ToWebColor(aRGB As Long) As Long
Rem RGB値を(昔懐かし)Webセーフカラーに丸めて返す
Dim vRGB() As Variant, i As Long
vRGB = SplitRGB(aRGB)
For i = 0 To 2
vRGB(i) = szMRound(CDbl(vRGB(i)), 51#)
Next
ToWebColor = vRGB(0) + vRGB(1) * &H100& + vRGB(2) * &H10000
End Function
Private Function szMRound(Number As Double, Divisor As Double) As Double
Rem なんちゃってMROUND関数
szMRound = Fix(CDec((Number + Divisor / 2) / Divisor)) * Divisor
End Function
Function GetYfromRGB(aRGB As Long) As Single
Rem RGB値から輝度信号Y(0以上1以下の数値)を算出
Const prmR = 0.298912!, prmG = 0.586611!, prmB = 0.114478!
Dim vRGB() As Variant
vRGB = SplitRGB(aRGB)
GetYfromRGB = vRGB(0) * prmR + vRGB(1) * prmG + vRGB(2) * prmB
GetYfromRGB = GetYfromRGB / &HFF&
If GetYfromRGB > 1! Then GetYfromRGB = 1!
If GetYfromRGB < 0! Then GetYfromRGB = 0!
End Function
Function RGB2Gray(aRGB As Long) As Long
Rem グレースケールに変換した時のRGB値を算出
RGB2Gray = GetYfromRGB(aRGB) * &HFF&
RGB2Gray = RGB2Gray + RGB2Gray * &H100& + RGB2Gray * &H10000
End Function
Function GetSfromRGB(aRGB As Long, Optional HSLMode As Boolean) As Single
Rem RGB値から彩度(0以上1以下)を算出(オプションHSLカラーモデル用の計算スイッチ)
Dim vRGB() As Variant, vMax As Long, vMin As Long, i As Long
vRGB = SplitRGB(aRGB)
vMin = vRGB(0): vMax = vRGB(0)
For i = 1 To 2
If vRGB(i) > vMax Then vMax = vRGB(i)
If vRGB(i) < vMin Then vMin = vRGB(i)
Next
If HSLMode Then
If vMax = vMin Then Exit Function
If (vMax + vMin) / 2 < &H80& Then
GetSfromRGB = (vMax - vMin) / (vMax + vMin)
Else
GetSfromRGB = (vMax - vMin) / (&HFF& * 2 - vMax - vMin)
End If
Else
If vMax = 0 Then Exit Function
GetSfromRGB = (vMax - vMin) / vMax
End If
If GetSfromRGB > 1! Then GetSfromRGB = 1!
If GetSfromRGB < 0! Then GetSfromRGB = 0!
End Function
Function GetVfromRGB(aRGB As Long) As Single
Rem RGB値から明度(0以上1以下の数値)を算出
Dim vRGB() As Variant, vMax As Long, i As Long
vRGB = SplitRGB(aRGB)
vMax = vRGB(0)
For i = 1 To 2
If vRGB(i) > vMax Then vMax = vRGB(i)
Next
GetVfromRGB = vMax / &HFF&
If GetVfromRGB > 1! Then GetVfromRGB = 1!
If GetVfromRGB < 0! Then GetVfromRGB = 0!
End Function
Function GetLfromRGB(aRGB As Long) As Single
Rem RGB値からHSLカラーモデル用の輝度(0以上1以下の数値)を算出
Dim vRGB() As Variant, vMax As Long, vMin As Long, i As Long
vRGB = SplitRGB(aRGB)
vMin = vRGB(0): vMax = vRGB(0)
For i = 1 To 2
If vRGB(i) > vMax Then vMax = vRGB(i)
If vRGB(i) < vMin Then vMin = vRGB(i)
Next
GetLfromRGB = (vMax + vMin) / 2 / &HFF&
If GetLfromRGB > 1! Then GetLfromRGB = 1!
If GetLfromRGB < 0! Then GetLfromRGB = 0!
End Function
Function GetHfromRGB(aRGB As Long) As Variant
Rem RGB値から色相(360度)を算出
Rem 例
Rem 赤: RGB = &HFF& => 0/360
Rem 黄: RGB = &HFFFF& => 60/360
Rem 緑: RGB = &HFF00& => 120/360
Rem シアン: RGB = &HFFFF00 => 180/360
Rem 青: RGB = &HFF0000 => 240/360
Rem マゼンタ:RGB = &HFF00FF => 300/360
Dim vRGB() As Variant, vMax As Long, vMin As Long, i As Long, MaxPos As Long
vRGB = SplitRGB(aRGB)
vMin = vRGB(0): vMax = vRGB(0)
For i = 1 To 2
If vRGB(i) > vMax Then
vMax = vRGB(i)
MaxPos = i
End If
If vRGB(i) < vMin Then vMin = vRGB(i)
Next
If vMax = vMin Then
GetHfromRGB = Null '-1!
Exit Function
End If
If MaxPos = 0 Then
GetHfromRGB = CSng(60& * ((vRGB(1) - vRGB(2)) / (vMax - vMin)))
ElseIf MaxPos = 1 Then
GetHfromRGB = CSng(60& * ((vRGB(2) - vRGB(0)) / (vMax - vMin)) + 120&)
ElseIf MaxPos = 2 Then
GetHfromRGB = CSng(60& * ((vRGB(0) - vRGB(1)) / (vMax - vMin)) + 240&)
End If
GetHfromRGB = CSng(GetHfromRGB - 360& * Int(GetHfromRGB / 360&))
End Function
Function GetYfromHSL(h As Single, s As Single, L As Single) As Single
Rem HSLカラーモデルから輝度信号Yを算出(0以上1以下の数値)
Const prmR = 0.298912!, prmG = 0.586611!, prmB = 0.114478!
Dim Yp As Single, a As Single, c As Single
Dim pMax As Single, pMid As Single
h = h - 360& * Int(h / 360&)
Select Case h
Case Is < 60!
pMax = prmR: pMid = prmG
a = (h Mod 60!) / 60!
Case Is < 120!
pMax = prmG: pMid = prmR
a = 1 - (h Mod 60!) / 60!
Case Is < 180!
pMax = prmG: pMid = prmB
a = (h Mod 60!) / 60!
Case Is < 240!
pMax = prmB: pMid = prmG
a = 1 - (h Mod 60!) / 60!
Case Is < 300!
pMax = prmB: pMid = prmR
a = (h Mod 60!) / 60!
Case Is >= 300!
pMax = prmR: pMid = prmB
a = 1 - (h Mod 60!) / 60!
End Select
Yp = pMax + pMid * a
c = 2 * s * (0.5! - Yp)
If L > 0.5! Then
GetYfromHSL = L * (1 + c) - c
Else
GetYfromHSL = L * (1 - c)
End If
End Function
Function GetLfromHSY(h As Single, s As Single, Y As Single) As Single
Rem HS値と輝度信号YからHSLカラーモデルのL値を算出 (H は360度、SとYは0以上1以下の数値を指定)
Const prmR = 0.298912!, prmG = 0.586611!, prmB = 0.114478!
Dim Yp As Single, a As Single, c As Single
Dim pMax As Single, pMid As Single
h = h - 360& * Int(h / 360&)
Select Case h
Case Is < 60!
pMax = prmR: pMid = prmG
a = (h Mod 60!) / 60!
Case Is < 120!
pMax = prmG: pMid = prmR
a = 1 - (h Mod 60!) / 60!
Case Is < 180!
pMax = prmG: pMid = prmB
a = (h Mod 60!) / 60!
Case Is < 240!
pMax = prmB: pMid = prmG
a = 1 - (h Mod 60!) / 60!
Case Is < 300!
pMax = prmB: pMid = prmR
a = (h Mod 60!) / 60!
Case Is >= 300!
pMax = prmR: pMid = prmB
a = 1 - (h Mod 60!) / 60!
End Select
Yp = pMax + pMid * a
c = 2 * s * (0.5! - Yp)
If Y > (1 - c) / 2! Then
GetLfromHSY = (Y + c) / (1 + c)
Else
GetLfromHSY = Y / (1 - c)
End If
End Function
Function HSV2RGB(ByVal h As Single, s As Single, v As Single) As Long
Rem HSV値からRGB値を算出 (H は360度、SとVは0以上1以下の数値を指定)
Dim vMax As Long, vMin As Long, vRGB(0 To 2) As Long
vMax = v * &HFF&
vMin = vMax - s * vMax
h = h - 360& * Int(h / 360&)
Select Case h
Case Is <= 60!
vRGB(0) = vMax
vRGB(1) = (h / 60!) * (vMax - vMin) + vMin
vRGB(2) = vMin
Case Is <= 120!
vRGB(0) = ((120! - h) / 60!) * (vMax - vMin) + vMin
vRGB(1) = vMax
vRGB(2) = vMin
Case Is <= 180!
vRGB(0) = vMin
vRGB(1) = vMax
vRGB(2) = ((h - 120!) / 60!) * (vMax - vMin) + vMin
Case Is <= 240!
vRGB(0) = vMin
vRGB(1) = ((240! - h) / 60!) * (vMax - vMin) + vMin
vRGB(2) = vMax
Case Is <= 300!
vRGB(0) = ((h - 240!) / 60!) * (vMax - vMin) + vMin
vRGB(1) = vMin
vRGB(2) = vMax
Case Is > 300!
vRGB(0) = vMax
vRGB(1) = vMin
vRGB(2) = ((360! - h) / 60!) * (vMax - vMin) + vMin
End Select
HSV2RGB = vRGB(0) + vRGB(1) * &H100& + vRGB(2) * &H10000
End Function
Function HSL2RGB(ByVal h As Single, s As Single, L As Single) As Long
Rem HSL値からRGB値を算出 (H は360度、SとLは0以上1以下の数値を指定)
Dim vMax As Long, vMin As Long, vRGB(0 To 2) As Long
If L <= 0.5! Then
vMax = &HFF& * (L + L * s)
vMin = &HFF& * (L - L * s)
Else
vMax = &HFF& * (L + (1 - L) * s)
vMin = &HFF& * (L - (1 - L) * s)
End If
h = h - 360! * Int(h / 360!)
Select Case h
Case Is <= 60!
vRGB(0) = vMax
vRGB(1) = (h / 60!) * (vMax - vMin) + vMin
vRGB(2) = vMin
Case Is <= 120!
vRGB(0) = ((120! - h) / 60!) * (vMax - vMin) + vMin
vRGB(1) = vMax
vRGB(2) = vMin
Case Is <= 180!
vRGB(0) = vMin
vRGB(1) = vMax
vRGB(2) = ((h - 120!) / 60!) * (vMax - vMin) + vMin
Case Is <= 240!
vRGB(0) = vMin
vRGB(1) = ((240! - h) / 60!) * (vMax - vMin) + vMin
vRGB(2) = vMax
Case Is <= 300!
vRGB(0) = ((h - 240!) / 60!) * (vMax - vMin) + vMin
vRGB(1) = vMin
vRGB(2) = vMax
Case Is > 300!
vRGB(0) = vMax
vRGB(1) = vMin
vRGB(2) = ((360! - h) / 60!) * (vMax - vMin) + vMin
End Select
HSL2RGB = vRGB(0) + vRGB(1) * &H100& + vRGB(2) * &H10000
End Function
Function HSY2RGB(ByVal h As Single, s As Single, Y As Single) As Long
Rem HS値と輝度信号YからRGB値を算出 (H は360度、SとYは0以上1以下の数値を指定)
HSY2RGB = HSL2RGB(h, s, GetLfromHSY(h, s, Y))
End Function
Function GetReversal(aRGB As Long) As Long
Rem 反転色を算出
Dim vRGB() As Variant, i As Long
vRGB = SplitRGB(aRGB)
For i = 0 To 2
vRGB(i) = &HFF& - vRGB(i)
Next
GetReversal = vRGB(0) + vRGB(1) * &H100& + vRGB(2) * &H10000
End Function
Function GetComplementary(aRGB As Long) As Long
Rem 補色を算出
Dim vRGB() As Variant, vMax As Long, vMin As Long, i As Long
vRGB = SplitRGB(aRGB)
vMin = vRGB(0): vMax = vRGB(0)
For i = 1 To 2
If vRGB(i) > vMax Then vMax = vRGB(i)
If vRGB(i) < vMin Then vMin = vRGB(i)
Next
For i = 0 To 2
vRGB(i) = (vMax + vMin) - vRGB(i)
Next
GetComplementary = vRGB(0) + vRGB(1) * &H100& + vRGB(2) * &H10000
End Function
Rem =================================================================================================================
(白茶) 2023/06/16(金) 23:13:08
(困ってます、ああ) 2023/06/19(月) 17:31:43
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.