[[20211209152742]] 『セルの色毎に一覧に出力する』(中也さん) ページの最後に飛ぶ

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

 

『セルの色毎に一覧に出力する』(中也さん)

こんにちは。
セルの色を判別してデータを出力したいのですが教えて下さい。
「結果」シートのマクロボタン実行で「期限一覧」シートの赤色RGB(255, 0, 0)と黄色RGB(255, 255, 0)のセルを検索し、「結果」シートに順番に出力したいです。
「期限一覧」シートには他の色のセルもありますがスルーしたいです。
※検索範囲はC2セル〜E5セル
※出力結果は「PC名」空白「SW名」空白「日付」の1行にまとめたい
※できるだけ、ForとIfを使いたいです

 因みに赤は期限切れ、黄色は1年後に切れるです。

■「期限一覧」シート
    A列  B列  C列 D列 E列
1行目 SW名 日付 PC1 PC2 PC3
2行目 Office 12/1
3行目 サクラ 1/1  赤  赤
4行目 IE   2/1  黄  黄
5行目 捺印  3/1 赤     赤

■「結果」シート(出力結果)
「A1」セルから順に赤色セルの情報を。
PC1 サクラ 1/1
PC2 サクラ 1/1
PC1 捺印 3/1

「B1」セルから順に黄色セルの情報を。
PC1 IE 2/1
PC2 IE 2/1

お手数お掛けしますが、ご教授の程お願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


して、わからないのはどの部分なのですか?
>できるだけ、ForとIfを使いたいです
単純に For Each 〜 Nextで各セルを巡回して、「IF」なり、「Select case」なりで「Interior.Color」や「DisplayFormat.Interior.Color」を判定すればよいのではありませんか?

(もこな2) 2021/12/09(木) 16:57


 横から失礼します。

 特定の色に関しては、定数を使うこともできます。

https://katakago.sakura.ne.jp/pgm/vba/pgm01/vbcolor.html

 参考まで。
(通りすがり) 2021/12/09(木) 17:33

詰まっている部分がまったくわかりませんが、ざっくり書くとこんな感じではないですか?
    Sub 研究用()
        Dim 赤出力 As Range, 黄出力 As Range
        Dim MyRNG As Range

        Stop

        With Worksheets("結果")
            Set 赤出力 = .Range("A1")
            Set 黄出力 = .Range("B1")
        End With

        With Worksheets("期限一覧")
            For Each MyRNG In .Range("C2:E5")
                If MyRNG.Interior.Color = RGB(255, 0, 0) Then
                    赤出力.Value = .Cells(1, MyRNG.Column).Value & " " & .Cells(MyRNG.Row, 1).Value & " " & Format(.Cells(MyRNG.Row, 2).Value, "m/d")
                    Set 赤出力 = 赤出力.Offset(1)
                ElseIf MyRNG.Interior.Color = RGB(255, 255, 0) Then
                    黄出力.Value = .Cells(1, MyRNG.Column).Value & " " & .Cells(MyRNG.Row, 1).Value & " " & Format(.Cells(MyRNG.Row, 2).Value, "m/d")
                    Set 黄出力 = 黄出力.Offset(1)
                End If
            Next
        End With
    End Sub

 ※↑は少々冗長な気もしますし、現状のコードを示して頂いたほうが具体的なアドバイスが受けられると思います。

(もこな2) 2021/12/09(木) 18:48


ありがとうございます。
この投票を載せたあとも色々調べて、?@最初のC2セル〜E5セルを順番に見るマクロからとりかかったのですが
For j = 3 To 5
        For i = 2 To 5
            If Sh1.Cells(i, j).Interior.Color = RGB(255, 0, 0) Then
                Sh1.Cells(i, j).Copy Sh2.Cells(Q, 1)

と分かりにくかったので大変助かりました。
また出力の箇所を見やすいよう少し追加しました。

修正前)
赤出力.Value = .Cells(1, MyRNG.Column).Value & " " & .Cells(MyRNG.Row, 1).Value & " " & Format(.Cells(MyRNG.Row, 2).Value, "m/d")

修正後)
赤出力.Value = "【" &.Cells(1, MyRNG.Column).Value & "】" & " " & .Cells(MyRNG.Row, 1).Value & " " & Format(.Cells(MyRNG.Row, 2).Value , "<" & "yyyy/m/d") & ">"

■出力結果
【PC1】 サクラ <2021/1/1>

■追加でこちらの問題が起きたのですが、少し自分で調べてみます。

セルの色付けを「条件付き書式」で設定しているのですが、自動で色付けされた箇所を「セルの書式設定」で覗くと
塗り潰しが指定なしになっています。
そのため、今回のマクロでセルの色が認識されませんでした。
どうやらフィルターを掛けると認識されるので、マクロで色を上書きしようと思います。
<手順>フィルターをかける⇒色でくくる⇒色を上書きする

できそうになかったら改めて新規で質問させて頂こうと思います。
宜しくお願いします。
(中也さん) 2021/12/10(金) 15:54


MyRNG.DisplayFormat.Interior.Color
とすると、条件付き書式も手作業でつけたものも
両方対象になりますよ。
(2010以降ですね)
(γ) 2021/12/10(金) 16:07

もこな2さんが指摘済みでしたね。
(γ) 2021/12/10(金) 16:09

■1
>分かりにくかったので大変助かりました。
いや、行と列の2重ループで回すのも決して悪いプランではないと思いますよ。
(特にMyRNGから、いちいち行番号・列番号を取り出すよりわかりやすいかと)

■2
>セルの色付けを「条件付き書式」で設定しているのですが
γさんがコメントされているとおり。

■3
>この投票を載せたあとも色々調べて、?@最初のC2セル〜E5セルを順番に見るマクロからとりかかったのですが
よくわかりませんが、"質問"されたときは何も手を付けてなかったということですか?
単に発注したいだけならその旨始めから表明しておいてほしいです。(そういったことには興味ないため関わりたくないので)

そうでなくて、ちゃんと質問だったということであれば、再三になりますがコードを提示してどのように困っているのか(エラーが発生するならその個所、エラー番号、エラーメッセージの提示、エラーにならないが想定外の動きになるなら××になるはずが○○になる等)説明いただくとアドバイスできることがあるかもしれません。

■4
上記にかぶりますがどうも作成依頼だったような気もするので"質問"があるまでしばしROMりますが、書いてしまったので研究材料として投稿しておきます。

 あえてステップ実行してみないと理解しにくいように雑な書き方にしています。
 この記述方法を推奨しているという意味ではありませんので誤解の無いように願います。

    Sub 研究用2()
        Dim 行 As Long, 列 As Long, 出力列 As Long
        Stop 'ブレークポイントの代わり
        With Worksheets("期限一覧")
            For 列 = 3 To 5: For 行 = 2 To 5
                Select Case .Cells(行, 列).DisplayFormat.Interior.Color
                    Case RGB(255, 0, 0): 出力列 = 1
                    Case RGB(255, 255, 0): 出力列 = 2
                    Case Else: 出力列 = 0
                End Select
                If 出力列 > 0 Then Worksheets("結果").Cells(Rows.Count, 出力列).End(xlUp).Offset(1).Value = _
                "【" & .Cells(1, 列).Value & "】" & " " & .Cells(行, 1).Value & " " & Format(.Cells(行, 2).Value, "<" & "yyyy/m/d") & ">"
            Next 行: Next 列
        End With
        If WorksheetFunction.CountA(Worksheets("結果").Rows(1)) = 0 Then Worksheets("結果").Rows(1).Delete
    End Sub

(もこな2) 2021/12/10(金) 20:00


(◞‸◟)ハァ
(チンチクリン) 2021/12/10(金) 20:13

こちらの条件設定で上手く行きました。

すいません。
以前小出しで質問した際にやりたい事が分かりにくいと言われたので、今回は全部書いてしまいました。
指定の範囲内の検索方法とヒットしたセルのSW名と機器名を読み取る方法で苦戦し、質問させて頂きました。

頂いたコード、検索範囲の指定が簡潔でとてもわかり易かったです。
ありがとうございました。
(中也さん) 2021/12/14(火) 11:56


コメント返信:

[ 一覧(最新更新順) ]


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