スナックelve 本店

バツイチ40代女の日記です

指定範囲の指定色を数える関数

会社から自分に送ったメールが届いてなくて顔面蒼白です・・・。やばい。クビになったら笑いましょう(;´Д`)

=cc(数えたい範囲,数えたい色のセル)で数える関数だよ。
↓こんな感じで使えます
f:id:elve:20210727194148p:plain

Function cc(a As Range, b As Range) As Long

Set b = b.Item(1)

Dim sh As Worksheet: Set sh = a.Parent
If Intersect(a, sh.UsedRange) Is Nothing Then
    cc = 0
    Exit Function
End If
Dim countcolor As Long: countcolor = b.Interior.Color

Dim lc As Long: lc = WorksheetFunction.Min(a.Item(a.count).Column, sh.UsedRange.Item(sh.UsedRange.count).Column)
Dim lr As Long: lr = WorksheetFunction.Min(a.Item(a.count).Row, sh.UsedRange.Item(sh.UsedRange.count).Row)

Dim c As Long, r As Long, count As Long: count = 0
For c = a.Item(1).Column To lc
    For r = a.Item(1).Row To lr
        If sh.Cells(r, c).Interior.Color = countcolor Then count = count + 1
    Next
Next

cc = count

End Function

A:Aみたいに列で色つけた場合は全部は数えません。使用範囲(UsedRange)内で数えます。
f:id:elve:20210727195648p:plain

なので、例えば別のシートからだとこんな感じになります。
f:id:elve:20210727200840p:plain

調べたこと

Intersect

2つの範囲が重なってるかどうか。(間違えて使ってない範囲を指定してる場合0を返すため)
Office TANAKA - Excel VBA Tips[あるセルがセル範囲に含まれるかどうか]

範囲の右下

EXCEL2003のVBAで、Rangeオブジェクト(矩形)で取得されている... - Yahoo!知恵袋

UsedRange使わないとA:Aみたいに選択した時めっちゃ時間かかる(;´Д`)