プロが教えるわが家の防犯対策術!

数値がランダムに入っている表に条件付き書式で指定の数式に合致するとセルを色塗りするよう設定しあります。その色塗りしたセルをカウントするにはどうすればよいか検索していましたら、下記にマクロでの手法が説明されていましたが、マクロに詳しくないので、どう利用したらよいかわかりません。

http://keep-on.com/excelyou/1999lng4/199908/9908 …

たとえば、A1:Y30の範囲の表があるとして、1行ごとに色塗りしたセルをカウントしたいです。Z1,Z2,Z3,Z4...にそれぞれ結果が表示されるようにするには、上記のマクロ(もしくは違う方法)をどのように使用したらよいんでしょうか?

ちなみに1列おきにカウントしたくない列が入っているので、COUNTIF関数を使わないでやりたいんです。色のついたセルを定義してやる方法もありましたが、条件付き書式では不可能とわかりましたので、上記の方法しかないのかなと思うんですが。詳しい方、教えてください。

A 回答 (6件)

>ちなみに1列おきにカウントしたくない列が入っているので、..


>また、一行おきにカウントしたくない列が含まれているというのは..
>「一行おきに」色つきセルをカウントというのは..

..ぅーん.. -"-
「1行おき」かつ「1列おき」にカウント対象外セルがある、という意味ですかね?
つまり
B2,D2,F2,H2,J2,L2,N2,P2,R2,T2,V2,X2
B4,D4,F4,H4,J4,L4,N4,P4,R4,T4,V4,X4
...?
Z1はさっきの数式で
Z2=SUMPRODUCT((A2:Y2>=$AA$1-5)*(A2:Y2<=$AA$1+5)*MOD(COLUMN(A2:Y2),2)+(A2:Y2>=$AA$1+25)*(A2:Y2<=$AA$1+35)*MOD(COLUMN(A2:Y2),2))
Z1:Z2をZ30までコピー。

1行おきではなく全行で偶数列がカウント対象外ならZ2の式をZ1:Z30コピーで。



マクロにしたところで
Sub try()
  Dim i As Long
  Dim j As Long
  Dim c As Long
  Dim x

  With Sheets("SheetX")
    x = .Range("AA1").Value
    For i = 1 To 30
      c = 0
      For j = 1 To 25 'Step 2
        If (i Mod 2) Or (j Mod 2) Then
          With .Cells(i, j)
            If (((x - 5) <= .Value) And (.Value <= (x + 5))) Or _
              (((x + 25) <= .Value) And (.Value <= (x + 35))) Then
              c = c + 1
            End If
          End With
        End If
      Next
      .Cells(i, 26).Value = c
    Next
  End With
End Sub
>標準モジュールに張り付けて実行すればOK..
というわけにはいかないですけどね。要件を整理しなきゃ。
    • good
    • 0
この回答へのお礼

「一行おき」と補足に書いたのは間違いでした。最初の質問に書いた通り「1列おき」にしたかったのです。それも偶数列に。混乱させてしまいすみませんでした。
書いていただいた数式で試したら奇数列のみカウントされたので、自分で調べて手直ししたらできました‼↓(MODに=0を入れました)

=SUMPRODUCT((A1:Y1>=$AA$1-5)*(A1:Y1<=$AA$1+5)*(MOD(COLUMN(A1:Y1),2)=0)+(A1:Y1>=$AA$1+25)*(A1:Y1<=$AA$1+35)*(MOD(COLUMN(A1:Y1),2)=0))

もう諦めようと思っていましたが、本当に助かりました。ご親切に教えてくださり、本当にありがとうございました!

お礼日時:2013/06/19 18:40

伝え忘れ。




「行」と「列」の区別は“ハッキリ”させたほうが今後のために良いですよ。


では、失礼。
    • good
    • 0

つまり、


> ちなみに1列おきにカウントしたくない列が入っているので、
「1行おきに」のカウントですね?


だとすると

Sub Sample()
Dim myCnt As Long '変数を長整数型で宣言
Dim i As Long, J As Long

    Columns(26).Delete
    For i = 1 To 30 Step 2
        myCnt = 0
        For j = 1 To 25
            Cells(i, j).Select
            If Application.Evaluate(Cells(i, j).FormatConditions.Item(1).Formula1) = True _
                Or Application.Evaluate(Cells(i, j).FormatConditions.Item(2).Formula1) = True Then
                myCnt = myCnt + 1
            End If
        Next j
        Cells(i, 26) = myCnt
    Next i 
End Sub 




> やってみたのですが、Z列すべてに「13」が入力されてしまいます。
> これを標準モジュールに張り付けて実行すればOK、という形でご回答いただければ大変助かります。

「作らされている」感が満載なので、これを以って私は本件からは撤退します。
あとは適宜応用するなり、親切な回答者さまの回答をお待ち下さい。
    • good
    • 0

>これを標準モジュールに張り付けて実行すればOK、という形でご回答いただければ大変助かります。


いやそこまでしなくてもZ1セルに数式
=SUMPRODUCT((A1:Y1>=$AA$1-5)*(A1:Y1<=$AA$1+5)+(A1:Y1>=$AA$1+30-5)*(A1:Y1<=$AA$1+30+5))
以下Z30までコピー、という話なんですが。

この回答への補足

試しにやって気づきましたが、これだと、一列おきに入っているカウントしたくないところも入りますよね。だから、色付きセルのみカウントできるマクロが知りたかったのです。

補足日時:2013/06/18 23:03
    • good
    • 0

「条件付き書式」の結果、色が塗られたセルをカウントするには。


通常の書式設定で色が塗られたセルをカウントする方法と同じやり方ではできません。
# ウラ技的に書式を固定してあげればできない事はないですが
# それはおいといて。

「条件付き書式」の対象セル範囲を調べて「条件付き書式」の「条件」がTRUEかどうか調べると良いです。
提示されたリンク先記事はその方針で組まれたコードです。

>数値がランダムに入っている表に条件付き書式で
>指定の数式に合致するとセルを色塗りするよう設定しあります。

その指定の数式を提示してみてください。
その数式が前もってわかってるなら、「条件付き書式」を調べなくても
元のセル範囲をその数式で判定してあげれば良いです。

ちなみに、Excelのバージョンはなんでしょう?

この回答への補足

回答ありがとうございます。

条件付き書式には、下記の条件2つが設定されています。(パターン色:黄色)

=AND(A1>=$AA$1-5,A1<=$AA$1+5)
=AND(A1>=$AA$1+30-5,A1<=$AA$1+30+5)

また、一行おきにカウントしたくない列が含まれているというのは、下記の異なる条件2つを設定しているためです。

=AND(B1>=$AB$1-5,B1<=$AB$1+5)
=AND(B1>=$AB$1-7,B1<=$AB$1+7)

ただ、こちらは、パターン色でなくて、フォント色でも対応できるので、「一行おきに」色つきセルをカウントというのはしなくても大丈夫です。(が、こちらもパターン色で表示して、一行おきに(最初の2つ条件の黄色セルだけ)カウントできれば、もっと助かります。)

エクセルのバージョンは2003です。

これを標準モジュールに張り付けて実行すればOK、という形でご回答いただければ大変助かります。
よろしくお願いします。

補足日時:2013/06/18 18:31
    • good
    • 0

正直なところを言わせて頂くと


> マクロに詳しくないので、どう利用したらよいかわかりません。
なら、マクロは使わないほうが良いですよ。

理解できないものを理解できないまま使っても後の応用は出来ません。
手直しも出来ませんし、自分好みにカスタマイズすることも出来ませんから。


踏まえて、「マクロの使い方」までお教えするつもりはありませんが、
わかりやすく(?)注釈をつけたコードです。
難しい文は使っていないつもりです。

Sub Sample()
Dim myCnt As Long '変数を長整数型で宣言
Dim i As Long, J As Long

    Columns(26).Delete '念のため、26列目(X列)を削除
    For i = 1 To 30 ' 変数iの範囲は1~30(後に行指定に使用)
        myCnt = 0 ' 変数myCntを初期化(0にする)
        For j = 1 To 25 Step 2 ' 変数jの範囲は1~25(後に列指定に使用) 周期は「2」、つまり「1列おき」に処理)
            If Cells(i, j).FormatConditions.Count > 0 Then ' i行j列に「一つ以上の条件付書式が設定」されていたら
                myCnt = myCnt + 1 '変数myCntに「1」を加算
            End If ' 条件終了
        Next j ' jに「2」(Stepで指定した数)を加算して、繰り返し(上限の25に達したら繰り返し終了)
        Cells(i, 26) = myCnt ' i行26列目にmyCntの値を入力
    Next i ' iに「1」を加算して、繰り返し(上限の30に達したら繰り返し終了)
End Sub 'マクロ終了


重ねて言いますが、理解できないなら使わないほうが良いですよ。
私が「悪質な回答者」なら、このマクロでファイルを壊す可能性もあるのですから。
(そんな無益なことはしないですけどね。)



マクロの使い方、命令文の意味などは、別途コツコツ勉強なさって下さい。

この回答への補足

やってみたのですが、Z列すべてに「13」が入力されてしまいます。

補足日時:2013/06/18 18:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています