[[20130312054215]] 『セルに色がついているセルの数値を数えたい』(浪人生) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルに色がついているセルの数値を数えたい』(浪人生)
いろいろなセルに色がついてそこには数値が書かれております。
この色別ごとの数値をマクロでも関数でも良いので数えたいのです。
よろしくお願いします。


 色は何種類とかきまっている?(2007以降なら 16,777,216 色もあるので。2003までだったら56色だけど)
 で、その結果を、どのようにして表示したいのかな?
 それとも、特定の色を指定して、その合計数値を取得したい?

 処理の構造としては
[[20130311142239]] 『いろいろ』(あるよね) 
 あたりも参考になると思うけど。

 (ぶらっと)

 追記で。

 もし、色がついているセルの場所が決まっている(どこかの列とかどこかの行とか)なら
[[20130222161818]] 『色をつけると隣に行に数字がはいるようにしたい』(生どら)
 ここで提案した Get.Cell を使って関数で色番号をセットして SUMIF なんかも使えるね。
 ちょっと弱点があるので、そのスレでCodさんがアップされた Worksheet_SelectionChange を
 記述しておけば、かなり使えるものになると思う。

 (ぶらっと)

 もし、1列にデータが入っていて、2007以降のバージョンをお使いなら
 色でオートフィルタが使えるので、SUBTOTAL関数でCOUNTなりSUMなりできますが・・・

 (コナミ)


 >色でオートフィルタが使えるので

 あぁ、この手がありましたね!

 (ぶらっと)

浪人生さんで検索すると Excel が 2003 と書かれているのがありましたので、
オートフィルターは無理そうですねえ。ですが

20130102062016 で 着色するコードが ぶらっと さんから出ています。
と言う事は このコードの着色部分を 『変数への足し込み』に変えれば
すぐ出来そうな気がしますが。

ついでに補足)
 Selection_Changeは再計算時を意識した内容なので、一度実行で完了なら
       通常の標準モジュールだけでOkです。念のため。
       
(Cod)


諸先生方ありがとうございます。
質問の仕方が悪かったので下記に再質問します。
赤色のセルに書かれた数値。
黄色のセルに書かれた数値。
青色のセルに書かれた数値。
この3色のセルに書かれた数値を求めたいです。
それぞれの色のセルは複数あります。
それぞれに合計値を出したいです。
よろしくお願いします。
(浪人生)


 青、赤、黄色 といっても、色合いでその番号が異なるんだけど、VBAで定義している青、赤、黄色だとして。

 以下のTestを実行。

 Sub Test()
    Dim n As Double

    n = SumColor(vbRed)
    MsgBox n

    n = SumColor(vbBlue)
    MsgBox n

    n = SumColor(vbYellow)
    MsgBox n

 End Sub

 Private Function SumColor(myColor As Long) As Double
    Dim c As Range
    For Each c In ActiveSheet.UsedRange
        If c.Interior.Color = myColor Then SumColor = SumColor + Val(c.Value)
    Next
 End Function

 (ぶらっと)

 以下のようなコードでも。

 Sub Test2()
    Dim c As Range
    Dim totB As Double
    Dim totY As Double
    Dim totR As Double

    For Each c In ActiveSheet.UsedRange
        Select Case c.Interior.Color
            Case vbRed: totR = totR + Val(c.Value)
            Case vbBlue: totB = totB + Val(c.Value)
            Case vbYellow: totY = totY + Val(c.Value)
        End Select
    Next

    MsgBox "合計は以下の通りでした" & vbLf & "赤:" & totR & vbLf & "青:" & totB & vbLf & "黄:" & totY

 End Sub

 (ぶらっと)

セルの書式の標準カラーインデックスでセットしたものだと仮定してます。

赤(3)と黄(6)は明確なんですが青(仮置きで41)がグレーなので、
 MsgBox Selection.Interior.colorIndex で番号は確認してください。

利用方法は 出力したいセルに 通常の関数と同じく黄色なら =SumC(3) です。
全使用セルを検索するので、選択範囲に絞り込めば処理時間も少なくて済みそうですが。 

'******************************** 赤:3 青:41 黄:6
Function SumC(P1 As Long) As Long
Dim Myo As Range

    Application.Volatile
    For Each Myo In ActiveSheet.UsedRange
        If Myo.Interior.ColorIndex = P1 Then SumC = SumC + Myo.Value
    Next
End Function

(Cod)


ぶらっと様
両方とも理想どおりの数が出ました。
感激です。
今後ともよろしくお願いします。
ありがとうございました。
しかし
 Private Function SumColor(myColor As Long) As Double
    Dim c As Range
    For Each c In ActiveSheet.UsedRange
        If c.Interior.Color = myColor Then SumColor = SumColor + Val(c.Value)
    Next
 End Function
これの使い方がわかりませんでした。
Cod様
私の能力不足で、
マクロの実行の仕方がわかりませんでした。
今後のために実行の方法を教えて下さい。
よろしくお願いします。
(浪人生)

空いているセルで『=SumC(3)』。。。これは赤の場合です。(赤:3 青:41 黄:6)

前回も書きましたが青は 41番で 設定していますが、濃淡がありますので、
下記のコードは青のセルを選択してから実行すると戻る番号になります。
2003ではセル書式で出てくる56色に関しては、
左上から1.2.3の連番なので、その番号の事です。

SUb ATestX
 MsgBox Selection.Interior.colorIndex 
End SUb

注)大きく勘違いしてました。番号は 特定の 3つではなくて
   1から56までなら何でも良いです。ただ浪人生さんが望まれている
   青はどこかでヒットしますが、41くらいかなと勝手に思っているだけです。
   何度も修正すみません。

(Cod)


 >青はどこかでヒットしますが、41くらいかなと勝手に思っているだけです。 

 私のコードで青も想定通りの値になったということなので、vbBlue にあたるインデックス 5 が(浪人生)さんの実態にマッチしてそうですね。

 (ぶらっと)

 >これ(SumColor)の使い方がわかりませんでした。

 メモ程度に補足。

 構造としては Codさんの SumCと同じく、色の情報を与えて、シート上のその指定の色が付いたセルの数値の合計を結果として返す。
 ただし、Codさんのコードは、セルの上で =SumC(5) といったように シート関数のように使うことを想定して、そのための配慮が
 されている。(このような使い方をするものを【ユーザー定義関数 User Defined Function】と呼ぶ)

 Application.Volatile  通常は たとえば =SUM(A1:A5") と書くと、A1〜A5の値が変更されると式が実行される。
 ところが、=SumC(5) と書いてあるわけで、どのセルが変更になったら実行するという情報がなく、このままでは
 その後、シート上の変更があっても、再計算されず、値がかわらない。これをカバーするために、シート上のどこかの値がかわれば
 再計算しなさいというのがApplication.Volatile。

 ただ、色のみが変更になったばあい、値の変更がないので Application.Volatile が記述されていても再計算はされないのが
 ちょっと弱点。これを少しでもカバーする方法はいくつかあるけど。

 もう1つの違いが、私の場合は 色情報を 「カラー番号」で指定。一方、Codさんのコードでは、操作者が指定しやすい
 「カラーインデックス番号」を使うという配慮がなされている。

 「カラー番号」は 黒が 0 、赤が 255、黄色が 65,535、白が 16,777,215(これが最大の数) 等々。
 なので、私のコードを Range("A1").Value = SumColor(65535) と(マクロ内で)実行すると、A1 に 黄色のセルの合計値が
 セットされる。(あくまで、マクロ内で使うことを想定)

 2003で使用が可能な56種類に限ったとしても、この色番号は、なかなかすべてを覚えきるのは困難なので、
 以下の色については特別にVBAで色定数が定義されていて、それを使うことができる。

 vbBlack   黒 
 vbRed     赤 
 vbGreen   緑 
 vbYellow  黄 
 vbBlue    青 
 vbMagenta マゼンタ 
 vbCyan    シアン 
 vbWhite   白 

 なので、Range("A1").Value = SumColor(65535) は Range("A1").Value = SumColor(vbYellow) と記述することができる。

 なお、CodさんのSumCを使う場合、留意点が。
 まかり間違っても、既に青く塗られているセルに =SumC(5) と記述しないこと。もし、こうすると「循環参照エラー」になる。

(ぶらっと)


諸先生方へ
ありがとうございました。
私ごときにお付き合い下さり感謝に耐えません。
今後もよろしくご指導お願いします。
(浪人生)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.