Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Microsoft 365)
Interior.ColorIndexのカウントについて
投稿日時: 22/09/25 15:40:29
投稿者: BILLIKEN

いつもお世話になります。
早速で申し訳ありません。
セル色をカウントさせ集計表に入れる処理で困っています。
宜しくお願い致します。
 
セル色で分類している「利用予定表」(塗りつぶしで利用時間計算をしている表)を作成しています(例1)
横軸には利用時間/縦軸には利用日としており、同様のシートを12カ月分とその結果を反映させる「結果」シートを用意しています。
 
これまでは毎月手動で色を目視で数え利用計算をさせていました。
それをマクロで全シート(集計シートは除く)を分類ごとにカウントさせ「集計」シート(例2)に
結果を入れたいと思っています。
 
シート毎で「分類別」に塗りつぶしされているセルを、カウントさせることは出来きました。
しかしシート毎に結果を入れたいのではなく「集計」シートに結果が入るようにしたいのですが
うまく出来ずに困っています。
 
一部ですが例3は1シート上で分類別に合計を出すコードを作ってみました。
セル範囲を決めColorIndexで各カラーをカウントさせその結果を指定セルに入れています。
 
どのようにしたらよいかご教授頂けませんでしょうか。
宜しくお願い致します。
 
 
例1
 シートセル色(黄色(A):休憩 赤色(B):作業 色なし(C):利用なし )
  
     A列    B列  C列  D列
  ------------------------------------------- 
         1時間  2時間 3時間・・・
  ------------------------------------------- 
  1行目 1日   黄色  色なし 赤色  
  -------------------------------------------
  2行目 2日   赤色  赤色  赤色  
 -------------------------------------------
  3行目 3日   赤色  赤色  黄色  
  -------------------------------------------
 
 
例2
 集計シート(全月分の利用時間色の合計カウント結果)
     A列    B列  C列  D列
  ------------------------------------------- 
           1月   2月  3月・・・
  ------------------------------------------- 
  1行目 黄色   10   5  3 
  -------------------------------------------
  2行目 赤色    9   4  1
 -------------------------------------------
  3行目 色なし   1   0  0
 -------------------------------------------
 
 
例3
 一部となりますがこのコードにシートをループさせシート単位で色のカウントをさせています。
    
   For Each Rng In Range("D5:J8")
    Select Case Rng.Interior.ColorIndex
             Case 3 '赤
                Red_cnt = Red_cnt + 1
             Case 6 '黄
                yellow_cnt = yellow_cnt + 1
      End Select
    Next Rng
 
    Range("J2") = Red_cnt
    Range("K2") = yellow_cnt

回答
投稿日時: 22/09/25 16:40:27
投稿者: simple

こんにちは。
まず、1月についての処理を、Sub xxx() から End Subまで省略せずに示されたらどうでしょうか。
いわばそれをもとに、複数の月の繰り返し処理に修正することを考えればいいわけですよね。
具体的に詰まっているところはどこですか?
 
なお、
(1)シート名は月が分かるようなものなのでしょうか?
まあ、なっていなくても対応づけさえできれば何でもいいわけですけど。
(2)「結果」シートと「集計」シートの関係がわかりません。
   「結果」シートは今回の集計に関係してくるんですか?
そのあたりの補足説明も必要でしょうね。

回答
投稿日時: 22/09/25 18:28:09
投稿者: WinArrow
投稿者のウェブサイトに移動

提案
 
手作業で色を付けているとしたら、
「色をカウントする」というより、「数字または文字をカウントする」に変更しt方が
全体として効率化できると思います。色を修正することも簡単です。
「数字や文字を判断してセルの色を表示させる」方法には、「条件付き書式」を使います。
また、工夫すれば、VBAと使わなくても、集計できるかもしれません。

投稿日時: 22/09/25 19:08:16
投稿者: BILLIKEN

simpleさん
 こんにちは。
 早々ご回答いただきありがとございました。
 言葉の相違や説明不足で申し訳ございません。
 
以下回答させて頂きます。
 1.月の処理について
  シート名については一番左から「1月」「2月」「3月」の順番で12カ月分のシートが用意さ
  れており、最後のシート一番右側に「集計」の名前でシートが1つあります。
  例1)にある表が12シート分存在し、各シートで分類別にまとめられた色のカウント
  結果が「集計」シートに反映できればと思っています。
 
 2.シート名について
   「結果」シートとは「集計」シートのことで言葉に相違がありました。
 
 3.VBAコードの省略について
   省略し過ぎており申しわけありません。
   シート単位で集計結果が出るコードは以下のように作成していますが、結果を各シートに
  出すのではなく、例2)のように「集計」シートに結果をまとめたいと思っています。
  一番詰まっているのは、月別で出る分類別結果を「集計」シート(例2)に出したい部分に
  なります。
   例2)の「集計」シートには、「縦軸の分類」と「横軸の月」の項目名固定で「黄色」
  「赤色」「色なし」と順番に並ぶようになります。
  結果が入る数字の部分は最新データとなるようにしたいのですが、どのようにコードを
  書けば良いのかがわかりません。
   同じ説明となってしまい大変申し訳ございません。
  こちらの内容で内容をお伝えできればと思います。
   宜しくお願い致します。

投稿日時: 22/09/25 19:19:25
投稿者: BILLIKEN

simpleさん
 すみません。
 マクロコードを付けるのを忘れていました。
 再送させて頂きます。
 
以下回答させて頂きます。
 1.月の処理について
  シート名については一番左から「1月」「2月」「3月」の順番で12カ月分のシートが用意さ
  れており、最後のシート一番右側に「集計」の名前でシートが1つあります。
  例1)にある表が12シート分存在し、各シートで分類別にまとめられた色のカウント
  結果が「集計」シートに反映できればと思っています。
  
 2.シート名について
   「結果」シートとは「集計」シートのことで言葉に相違がありました。
  
 3.VBAコードの省略について
   省略し過ぎており申しわけありません。
   シート単位で集計結果が出るコードは以下のように作成していますが、結果を各シートに
  出すのではなく、例2)のように「集計」シートに結果をまとめたいと思っています。
  一番詰まっているのは、月別で出る分類別結果を「集計」シート(例2)に出したい部分に
  なります。
   例2)の「集計」シートには、「縦軸の分類」と「横軸の月」の項目名固定で「黄色」
  「赤色」「色なし」と順番に並ぶようになります。
  結果が入る数字の部分は最新データとなるようにしたいのですが、どのようにコードを
  書けば良いのかがわかりません。
 
Sub 色カウント()
    Dim Rng As Range
    Dim Red_cnt As Integer
    Dim yellow_cnt As Integer
    Dim blue_cnt As Integer
    Dim Ws As Worksheet
 
For Each Ws In Worksheets
    Ws.Activate
   If Ws.Name <> "集計" Then
    For Each Rng In Range("D5:J10")
        Select Case Rng.Interior.ColorIndex
            Case 3 '赤色
                Red_cnt = Red_cnt + 1
            Case 6'黄色
                yellow_cnt = yellow_cnt + 1
        End Select
    Next Rng
    Range("J2") = Red_cnt
    Range("K2") = yellow_cnt
   End If
 
Red_cnt = "0"
yellow_cnt = "0"
 
Next Ws
 
End Sub
 
 
  同じ説明となってしまい大変申し訳ございません。
 こちらの内容で内容をお伝えできればと思います。
  宜しくお願い致します。

回答
投稿日時: 22/09/25 19:30:48
投稿者: simple

# 行き違いでコメントがあったようです。
# それは反映していないレベルですが、回答しておきます。
 
例えばfunctionプロシージャを使って以下のようにできるでしょう。
考え方の理解のためのコード例です。
ご自分で確認して、細部はそちらで作ってください。
 

Sub main()
    Call myCount("1月", 2)
    Call myCount("2月", 3)
    ' 以下同様。
    
    ' これも、繰り返し構文を使って、数行で書くこともできるでしょう。
End Sub

Function myCount(対象シート名 As String, r As Long)
    ' r :  結果を書き出す集計シートの列番号
    Dim ws As Worksheet
    Dim rng As Range
    Dim red_cnt As Long, yellow_cnt As Long
    
    Set ws = Worksheets(対象シート名)

    For Each rng In ws.Range("D5:J8")           '例示そのままです。
        Select Case rng.Interior.ColorIndex
            Case 3  '赤
                red_cnt = red_cnt + 1
            Case 6  '黄
                yellow_cnt = yellow_cnt + 1
        End Select
    Next rng
    Worksheets("集計シート").Cells(1, r) = red_cnt
    Worksheets("集計シート").Cells(2, r) = yellow_cnt
    
    '色無しについても、計算、転記は可能でしょう。そちらで検討してください。
End Function

# 考え方の理解のためのものなので、動作確認はしていません。悪しからずご了解願います。

回答
投稿日時: 22/09/25 20:19:23
投稿者: simple

改めてご返答を拝見しました。ご苦労様でした。
それを拝見したうえでも、私の発言は私が修正する必要は無いように思います。念のため。

回答
投稿日時: 22/09/26 10:24:02
投稿者: Suzu

WinArrow さん からも既に提案ありますが、
「色」を主体に考えると、難しいですが「数値」 で考えたらどうでしょうか。
 
 
入力するユーザーとしても、色を入力するよりは 数値を入力する方が簡単だと思います。
 
また、

引用:
一部ですが例3は1シート上で分類別に合計を出すコードを作ってみました。

との事ですから、個別シートに そのシート毎の集計表を持たせて良いのであれば かなり簡単かと。
 
1. 各月の入力シート
  ・セルに色をつけていたセルには、条件付き書式を用い、
   入力値により、セルの背景/フォント色 を変える様にする
 
  ・当月の集計をシート内で行う
 
  ・ ユーザーには、色ではなく 数値を入力してもらう様にします。
 
2. まとめ シート
  各月のシートの集計値を参照させる
 
 
Ex)
---------------------------------------------------------------------------------
入力シート
	A	B	C	D	E	F	G
1		1	黄		2		
2		2	赤		6		
3		3	色なし		240		
4						
5	2022					
6	2			1時間	2時間	3時間
7	1		1	火	1		2
8	2		2	水	2	2	2
9	3		3	木	2	2	1
10	4		4	金			
11	5		5	土			
12	6		6	日			
	:
	:
	:

 
C7 =DATE(B$5,B$6,A7)  C34までフィル
C35 =IF(MONTH(DATE(B$5,B$6,1))=MONTH(DATE(B$5,B$6,A35)),DATE(B$5,B$6,A35),"") C37までフィル
C7:C37 セル書式設定 ユーザー定義「d」
 
D7 =C7 D37までフィル
D7:D37 セル書式設定 ユーザー定義「aaa」
 
 
E1:=COUNTIF($E$7:$L$37,1)
E2:=COUNTIF($E$7:$L$37,2)
E3:=COUNTBLANK(E7:L37)
 
条件付き書式
 適用先:=$E$7:$L$37
 1)セルの値 次の値に等しい =2  : フォント/塗りつぶし 赤
 2)セルの値 次の値に等しい =1  : フォント/塗りつぶし 黄
---------------------------------------------------------------------------------
 (B5 年入力 、B6 月入力 で万年カレンダー です。
  必要なら D列とE列の間に 休日を示す 列を挿入しても良いでしょう)
 
入力シートをテンプレートとして
4〜12,1,2,3 の各月のシートを作成(月の値のみのシート)
 
--------------------------------------------------------------------------------
まとめシート
 
	A	B	C	D E F G H I J K L M
1	4	5	6	7	8	9	10	11	12	1	2	3
2	黄
3	赤
4	色なし
  :

 
B2 : =INDIRECT(B$1&"!E1")
B3 : =INDIRECT(B$1&"!E2")
B4 : =INDIRECT(B$1&"!E3")
B2:B4 選択し、M列までフィル
 
B1:M1 セルの書式設定【0"月"】
--------------------------------------------------------------------------------
 
 
揮発関数 INDIRECT を使っているのでブックを開くたびに再計算されてしまいますが
VBA を使わなくとも 良くなります。
 
揮発関数を使わずとも、
B2〜M2 に、
『='4'!E1』『='5'!E1』〜『='3'E1』 を入力 4行目までフィルすれば INDIRECTは不要ですね。

投稿日時: 22/09/26 19:41:47
投稿者: BILLIKEN

simpleさん WinArrowさん Suzuさん
 ご回答頂きありがとうごいざいます。
 書式設定を利用すること全く気づきませんでした。
 全てをVBAで作成することしか考えていなかったので考え方を広げることができました。
 皆さんにご教授頂いた方法で一度考えてVBAを組み合わせるなど考えて作成してみます。
 作成に時間がかかる可能性がありますので、取り急ぎお礼まで。
 ありがとうございました。