
Excelで色の付いたセルの数を数えなければならない時はどうしていますか?
Excelに詳しい方は条件付書式を使用して塗りつぶし色を設定し、色を付ける前のデータの時点で数を数えるかもしれませんね。
ただ今回は、“既に塗りつぶし色を付けてあるセルの数を数える”ことを依頼されてしまったので、この方法は使用できません。
既存の関数では対処できない為、ユーザー定義関数を作って対応しました。
(*^^)/
3ヶ月ぶりですね。お久しぶりです。(^^ゞ
最近は、記事の内容に懲りすぎてしまい、ちょっと忙しくなると更新が滞ってしまって、申し訳ない。m(_ _)m
先日、知人に上記依頼をされて簡単な関数を作ったので備忘録がてら公開します。
この関数、案外使い勝手が良いんですよ。(^^)b
すべてが自前の記事なので、裏をとる必要が無くて楽〜♪♪
o(^-^o)(o^-^)o
進捗状況をチェックする表などでセル塗りつぶし色を使うことが多いかと思いますが、調べてみると、Excelにはセルの塗りつぶし情報を取得する関数はありませんでした。
Excel関数にはセルの文字揃え情報を取得できるものまであるのに、頻繁に使用されるセルの塗りつぶし情報を取得するものが無かったとは!!( ̄□ ̄;)
しょうがないので、VBAを使ってユーザー定義関数を作ってみました。
こんなことができるから、Excelって便利なんですよね〜。d(~〜~*)
サンプルを作ってみました。
Excel 2000 以降なら動くはずデス。(^^;)
ここでダウンロードしてください。
'*********************************
' 複数セル“Rng”内にある、セル塗りつぶし色(index)が'“Col_index”
' であるセル数をカウントする関数
'
' Application.Volatileを使用している為、再計算時に常に呼び出されます。
' 処理が重いようでしたら、対象範囲を狭めるか、Application.Volatileを
' 外してください
'*********************************
Function CountColor(Rng As Range, Col_index As Integer) 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 = Col_index Then
Col_cnt = Col_cnt + 1
End If
Next myRng
CountColor = Col_cnt
End Function
この関数は、対象範囲内の指定した色で塗りつぶされているセルの数を取得します。
CountColor(対象範囲, 検索色(カラーインデックス))
普通の関数と同じく再計算時に動作しますが、Excelはセルの色を変えただけでは再計算がおこなわれない点に注意してください。
再計算をさせるには、セルの編集をするか「F6」キーを押す必要があります。
サンプルには指定色で塗りつぶされたセル数を取得する関数以外に、塗りつぶされているセル数(色指定なし)を取得する関数、セルの塗りつぶし色をカラーインデックスで取得する関数も入っています。
'*********************************
' 複数セル“Rng”内にある、セル塗りつぶし色が付いているセル数を
' カウントする関数
'
' Application.Volatileを使用している為、再計算時に常に呼び出されます。
' 処理が重いようでしたら、対象範囲を狭めるか、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 myRng.Interior.ColorIndex > 0 Then
Col_cnt = Col_cnt + 1
End If
Next myRng
CountColorA = Col_cnt
End Function
この関数は、対象範囲内の塗りつぶされているセル(色指定なし)の数を取得します。
CountColorA(対象範囲)
'*********************************
'対象セル“Rng”のセル色(index)を取得する関数
'*********************************
Function GetColorIndex(Rng As Range) As Integer
GetColorIndex = Rng.Interior.ColorIndex
End Function
この関数は、対象セルの塗りつぶし色(カラーインデックス)を取得します。
GetColorIndex(対象セル)
依頼者に「XX色の“カラーインデックス”ってなに?」と毎回質問される事のないように、カラーインデックスを取得する関数も作りました。
ただし、この関数は再計算時には動作しないので、色を変更したときには、対象セルか計算式を入れたセルを編集する必要があります。
再計算時の動作が必要なら“Application.Volatile”を入れてください。
ま、VBAで動いてるので動作が遅いのはご愛嬌。
対象範囲を広く取りすぎると、再計算がおこなわれる度にもっさりとした動作になってしまいますよ。(^^ゞ
でも、これだけのコードで新しい関数を作ることができるなんて、やっぱりExcelVBAって便利です。
「欧米では小規模システムでVBAがよく使われていて、互換性の問題でVBAのバージョンを大きく上げられない。」という話をどこかで読んだ気がするのですが、案外本当なのかもしれませんね。
σ(^◇^;)
ちなみに、他のブックで使用する為にはモジュールをコピーするか、新しいブックでモジュールを作成し、上記コードをコピーする必要があります。
このコードも勝手に使用していただいてかまいませんが、不具合が起こってもクレームは受け付けませんよ。(*^_^)b