[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セルに色がついているセルの数値を数えたい』(浪人生)
色は何種類とかきまっている?(2007以降なら 16,777,216 色もあるので。2003までだったら56色だけど) で、その結果を、どのようにして表示したいのかな? それとも、特定の色を指定して、その合計数値を取得したい?
処理の構造としては [[20130311142239]] 『いろいろ』(あるよね) あたりも参考になると思うけど。
(ぶらっと)
追記で。
もし、色がついているセルの場所が決まっている(どこかの列とかどこかの行とか)なら [[20130222161818]] 『色をつけると隣に行に数字がはいるようにしたい』(生どら) ここで提案した Get.Cell を使って関数で色番号をセットして SUMIF なんかも使えるね。 ちょっと弱点があるので、そのスレでCodさんがアップされた Worksheet_SelectionChange を 記述しておけば、かなり使えるものになると思う。
(ぶらっと)
もし、1列にデータが入っていて、2007以降のバージョンをお使いなら 色でオートフィルタが使えるので、SUBTOTAL関数でCOUNTなりSUMなりできますが・・・
(コナミ)
>色でオートフィルタが使えるので
あぁ、この手がありましたね!
(ぶらっと)
20130102062016 で 着色するコードが ぶらっと さんから出ています。
と言う事は このコードの着色部分を 『変数への足し込み』に変えれば
すぐ出来そうな気がしますが。
ついでに補足)
Selection_Changeは再計算時を意識した内容なので、一度実行で完了なら
通常の標準モジュールだけでOkです。念のため。
(Cod)
青、赤、黄色 といっても、色合いでその番号が異なるんだけど、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様 私の能力不足で、 マクロの実行の仕方がわかりませんでした。 今後のために実行の方法を教えて下さい。 よろしくお願いします。 (浪人生)
前回も書きましたが青は 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.