- 締切済み
(EXCEL)CELLの条件付き書式で色をつけたセルをカウントする。
(EXCEL)CELLの条件付き書式で色をつけたセルをカウントしたいのですが、適切なVBAはありますか?私はVBAは初心者中の初心者です。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
#3の回答者です。 ダメならダメで結構なのですが、曲がりなりにもある時間を費やして、#3 でVBAの回答した私に対して、なぜ、そのようにコメント避けたのは分かりません。#3 で書いたように、元の質問を元にしては、VBAでは、情報が足りなくて、解決に完全な見通しは立たないということです。 いずれにしても、サンプルとしてレイアウトを示してもらったほうが早いかもしれません。回答者のいろんな想像に対して、あれこれ書いても、おそらく、情報が不足していて、うまく行かないような気がします。 たとえば、#4の補足の中の、B1 の同じセルに、残業時間と休日出勤があるのか、同じものなのか、良く理解できません。 B1が1月の残業時間、 B1が月の休日出勤時間、 C1がその2つの合計時間です。 おそらく、どこかに項目欄(例えば、A列)があるなら、SUMPRODUCT で、 =SUMPRODUCT((A1:A100="項目")*(B1:B100>=42)) 条件:42 (時間) とすれば、カウントすることが出来るかと思います。
#1です。 そうゆう配置になっているなら、いったん最終行でそれぞれの列のCOUNTIFをとり、その合計を計算した方が簡単でしょうね。 500人いるなら、D501セルに一月分の小計 =COUNTIF(D1:D500,">42") として、それを3列おきにコピーし12月の小計の後で501行目の合計を求めればOKでしょう。
- imogasi
- ベストアンサー率27% (4737/17069)
条件付き書式で色をつけた根拠は (1)セルの値(の大小など)で色をつけたに違いない。 質問ではその条件を書いてくれれば考えやすかったが。 (A)そこでその条件をVBAのIF文やCASE文に置き換えてプログラムを組みカウントする方法もある。 例データ 11 2 21 15 25 8 9 33 コード Sub test01() Dim a(5) For i = 1 To 8 x = Cells(i, "A") Select Case x Case Is > 40 a(1) = a(1) + 1 Case Is > 30 a(2) = a(2) + 1 Case Is > 20 a(3) = a(3) + 1 Case Is > 10 a(4) = a(4) + 1 Case Else a(5) = a(5) + 1 End Select Next i For i = 1 To 5 MsgBox "a" & i & "= " & a(i) Next i End Sub 配列は0に初期化がよいかも。 8を自動的に採ることはできるが初心者あてなので略。 (B)上記のことは条件付書式の色はとりあえず、置いといて、そのの条件の量的な面に注目して、それに基づいて関数で該当分の件数を数えル方法もあるということだ。 上例でやると 右は関数式の内容 0 =SUMPRODUCT((A1:A8>40)*1) 1 =SUMPRODUCT((A1:A8<=40)*(A1:A8>30)*1) 2 =SUMPRODUCT((A1:A8<=30)*(A1:A8>20)*1) 2 =SUMPRODUCT((A1:A8<=20)*(A1:A8>10)*1) 3 =SUMPRODUCT((A1:A8<=10)*(A1:A8>0)*1) 2007ならSUMIFSが使えるかも (2)既にセルなりに設定されている色でカウントするら やはりIF文やCASE文でプログラムコードを組む方法もある。 条件付書式は3種以下なので上例は不適当だが Colorindexについて、上記(1)(A)のような(そっくりの)プログラムを組めばよい。 Select Case x をSelect Case Cells(i,"A").interior。Colorindex にして。 ーー しかし>VBAは初心者中の初心者です、なら上記のことも判らないかも知れないと思う。 配列 繰り返し Case文 件数の取り方(該当したとき+1) など経験者にはなんでもないことが、わかるかな。
補足
ご回答ありがとうございます。私は会社の総務をしています。そしてこの計算は労働時間の計算です。1行ごとに従業員が並んでいます。たとえばA1が鈴木さん、A2が佐藤さん、A3が山田さんです。列に月ごとに1月、2月、3月です。月の内訳として1月の残業時間と休日出勤時間、そしてその2つの時間の合計時間で1つの月の列が構成されています。たとえば鈴木さんであればB1が1月の残業時間、B1が月の休日出勤時間、C1がその2つの合計時間です。合計時間が42時間を越えている月が年間何回あるのかをカウントしたいのです。ですから残業時間と休日時間だけで42時間を越えているのはセルはカウントしたくないのです。計算しなければいけない従業員が500人前後、そして1年分となると計算労力が大変で困っています。ひとつよろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #1/2 さんのご指摘の通りですね。理由は、条件付き書式で色のついているセルを数えるのは、セルオブジェクトの中では色を取得できませんから、難しいです。 >数えてほしくないセルである なら、そういうセルを数えて引けばよいのですが、内容的に漠然としていますから、その種の回答としては、今は不可能です。 条件式を取り出して、個別に検索したほうが、早いし簡単だと思います。VBAでは、無理とは言いませんが、極端に面倒なコードになります。 少なくとも、条件式は分かりませんので、VBAでは、条件付き書式を取り出して、それをセルに戻して判定して、True をカウントするという方法しかないと思います。しかし、これは、数式で設定された場合のみであって、私の知っている範囲では、条件付き書式のFormatConditionの、True or False の判定のプロパティは持っていなかったと思います。 なお、これは、A1 方式のみになっていますので、R1C1方式の場合は、ConvertFormula の中を変えてください。コードとして無理があるのは承知の上です。 Sub TestMacro1() Dim c As Range Dim v As Variant Dim a As String Dim i As Long Application.ScreenUpdating = False For Each c In Range("A1", Range("A65536").End(xlUp)) For Each v In c.FormatConditions c.Select a = Application.ConvertFormula(v.Formula1, xlA1, xlA1, xlAbsolute) If a Like "=*" Then If Not IsError(Application.Evaluate(a)) Then i = i + 1 End If Else MsgBox "現在のマクロでは、この条件付き書式は取れません!", 48 Exit Sub End If Next v Next c Application.ScreenUpdating = True MsgBox i End Sub
#1です。 COUNTIF関数は100以上のセルもカウントすることが出来ます。 質問者様が出来ないのは他に理由があるはずです。 「カウントしたいセルとカウントしたくないセルが同じ行にあります。条件付き書式はカウントしたい列に設定しています。そのカウントしたい列で100以上のセルの数を数えたい」 ではなく、もう少し具体的に示していただけると良い回答が付くと思いますよ。 例) A1からB2500までのセルの中にある100を超える数字をカウントしたい。 =COUNTIF(A1:B2500,">100")
補足
#1様ありがとうございます。 =COUNTIF(A1:A10,">100") で例えていいますとA1とA5、A9という3つのセルの中で100以上の数値のセルがいくつあるか表示させたいのです。 範囲指定でA1:A10としてしまうと、数えてほしくないセルであるA2,A3・・・の100以上のセルも拾ってしまうので困っています。 よろしくお願いします。
VBAじゃなきゃだめですか? 条件付書式で色を付けたのなら、COUNIFでその条件を設定すればカウントできると思いますが…。
補足
ご回答ありがとうございます。カウントしたいセルとカウントしたくないセルが同じ行にあります。条件付き書式はカウントしたい列に設定しています。そのカウントしたい列で100以上のセルの数を数えたいため、countifではできないための質問です。
補足
ご回答ありがとうございます。それだと例えば1月の休日の労働時間で42時間を越えた場合、休日労働時間とその月の合計労働時間で2回とカウントされてしまうのです。あくまで私がとりたいのはその月の合計労働時間において42時間以上かどうかなんです。でもその内訳である労働時間と休日労働時間の内訳も違う種類のカウントのときに必要なので、できれば消さずに今回の計算ができないか模索中です。 親身にご相談にのっていただき感動です。 もしかしたら無理なのかもしれないと思っています。