[[20150618102207]] 『決まった色で塗りつぶされているか調べたい』(すずめ) ページの最後に飛ぶ

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

 

『決まった色で塗りつぶされているか調べたい』(すずめ)

おはようございます。

G列に"1"と書かれていたら、その数字の書かれた行を端まで調べて、決まった色で背景色が塗りつぶされているか(3色のどれか)調べたいです。もし決まった色以外で塗りつぶされていた場合、msgboxで知らせたいです。

背景色は、

.Interior.ColorIndex = 3
.Interior.ColorIndex = 5
.Interior.ColorIndex = 6

です。

例えば、G5に "1" と書かれていたら、5行目を調べて上の3色の色で塗りつぶされていたらOK。それ以外の色がついていたら×。
G列に何も書かれていなければ調べずに終了、という感じです。

どなたかご教示お願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 こんな感じでどうでしょうか?
 データの範囲がわからないので、とりあえず行列ともに最後まで調べる感じにしています。
 G列が1だった場合にH列から最後まで調べるのかなと思ったのですが、わからなかったので
 とりあえずA列から最終列まで調べるようにしています。
 H列から調べる場合はjのループ開始を1から8に変更すればいいと思います。

 Sub test()

 Dim i As Long, j As Long

 For i = 1 To Rows.Count
    If Cells(i, 7).Value = 1 Then
        For j = 1 To Columns.Count
            Select Case Cells(i, j).Interior.ColorIndex
                Case 3, 5, 6
                Case Else
                Cells(i, j).Select
                MsgBox i & "行の" & j & "列が違います"
                Exit Sub
            End Select
        Next j
    End If
 Next i

 End Sub
(KUKI) 2015/06/18(木) 11:45

ありがとうございます。試してみたのですが、指定の色が塗りつぶされているにも関わらすmsgboxが出てきてしまいます。。
(すずめ) 2015/06/18(木) 15:37

>その数字の書かれた行を端まで調べて

の端とは何を示していますか
何かデータがある端ですか、それとも行の一番最後までですか

指定の色はどのようにして付けましたか?条件付き書式の場合はInterior.ColorIndexではできません

KUKIさんのをG列の最終行1がある最終列にしたコードです

Sub test()

 Dim i As Long, j As Long
 For i = 1 To Cells(Rows.Count, 7).End(xlUp).Row
    If Cells(i, 7).Value = 1 Then
        For j = 1 To Cells(i, Columns.Count).End(xlToLeft).Column
            Select Case Cells(i, j).Interior.ColorIndex
                Case 3, 5, 6
                Case Else
                Cells(i, j).Select
                MsgBox i & "行の" & j & "列が違います"
                Exit Sub
            End Select
        Next j
    End If
 Next i
 End Sub
(デイト) 2015/06/18(木) 15:59

こんにちは。

疑問なのですが、G列に1のある行は、すべてのセルに3・5・6のいずれかの色が
塗ってあるのが正しい姿なのでしょうか。言い換えると、違う色が塗ってあるのはもちろん
NGでしょうがそれだけでなく、ひとつでも色の無いセルがあればそれもNG。
そういうことでしょうか。

( 佳 ) 2015/06/18(木) 18:25


 新規ブックの標準モジュールにて

 '=========================================================
 Option Explicit
 Sub サンプルデータ作成()
    Dim r As Range
    Dim g0 As Long
    Dim Color As Variant
    Cells.Clear
    Range("g1:g3").Value = 1
    Range("z1:z3").Value = "色 あるよ"
    Color = Array(3, 5, 6)
    For Each r In Range("z1:z3")
       r.Interior.ColorIndex = Color(g0)
       g0 = g0 + 1
    Next
 End Sub

 上記のサンプルデータ作成 というコード実行によって作成されたデータに対して、回答者さんが投稿されたコードを
 実行すると 指定色があっても メッセージが表示されますし、実行がそこで止まってしまいますね!!

(ichinose) 2015/06/19(金) 09:31


 (ichinose)さん

 止まりますか?色が付いていないセルでは止まりますが
 指定色の個所では自分のPCではメッセージは表示されなかったです。
 何か違いがあるんですかね?

(KUKI) 2015/06/19(金) 10:20


デイトさん
データの有無にかかわらず行の一番最後までです。

佳さん
塗られていない場合もあります。表の内容を変更した際に、G列のその行に"1"と書き、変更したセルに色を付けています。1のある行のどこかのセルには必ず色が付いていないといけません。(3色のうちどれか)逆に、1がなければ必ずすべて塗りつぶしなしでないといけません。
(すずめ) 2015/06/19(金) 11:33


 サンプルデータ作成というプロシジャー実行により、生成されたデータに対し、提示されたコードを
 実行していただけましたか?  1行目のZ1には、3、2行目のZ2には、5、3行目のz3には 6に相当する
 色でセルが塗られていますよね?

 1〜3行目目では、 条件の色のセルが存在するにも関わらず、メッセージが表示されるというロジックが
 仕様と違うのではないでしょうか?

 G列が1の行で 条件色で塗られているセルが一つでもあれば メッセージは出さない という仕様だと思います。

 加えて メッセージを出したら そこで処理を終了してしまう(そのようには 記述されていませんよね)ことも気になりました。

 処理の終了は G列が未入力のときですよね?

 仕様がわかりづらいのは 確かです。

 私は、色の検索は、Findメソッドを使った書式検索を使うことを想定していました。

(ichinose) 2015/06/19(金) 12:37


やはり色で判定するのは難しいんですね。。
(すずめ) 2015/06/19(金) 13:50

 要件がわかりづらいんですがたたき台です。

 Sub Test()
    Dim c As Range
    Dim z As Range
    Dim color As Variant
    Dim er As Boolean
    Dim msg As Object

    Set msg = CreateObject("Scripting.Dictionary")

    With Range("A1", ActiveSheet.UsedRange)

        For Each c In .Columns("G").Cells
            er = False
            If c.Value = 1 Then
                '指定色(のみ)ないしは塗りつぶしなしであること
                color = .Rows(c.Row).Interior.ColorIndex
                If color = xlNone Then
                    msg(msg.Count) = c.Row & "行目に塗りつぶしセルがありません"
                Else
                    For Each z In .Rows(c.Row).Cells
                        Select Case z.Interior.ColorIndex
                            Case 3, 5, 6
                            Case xlNone
                            Case Else
                                er = True
                                Exit For
                        End Select
                    Next

                    If er Then
                        msg(msg.Count) = c.Row & "行目に指定色以外の色がありました"
                    End If

                End If
            ElseIf IsEmpty(c) Then
                '色塗り禁止
                color = .Rows(c.Row).Interior.ColorIndex
                If IsNull(color) Then
                    er = True
                ElseIf color <> xlNone Then
                    er = True
                End If
                If er Then msg(msg.Count) = c.Row & "行目は色なしにしてください"
            End If
        Next
    End With

    If msg.Count > 0 Then MsgBox Join(msg.items, vbLf)

 End Sub

(β) 2015/06/19(金) 13:57


こんにちは。

> やはり色で判定するのは難しいんですね
いやぁ、そこはぜんぜん難しくありません。
むつかしいのは、すずめさんのやりたいことを正確に把握すること。
そこが違っていたら(というか、違っていたから)思ったとおりに動かないわけで。

いま疑問に思っているのは、「行を端まで」ってどこまでだろうかと。
表のある範囲内だけでいいのですよね。
まさか、対象の表の右側にもうひとつ、関係の無い表があったりしませんよね(笑
あと、セルに白色を塗ってある可能性も考えておかないといけないですか?

うーむ。正直だんだんメンドクサイです。
発想を変えてみます。
>表の内容を変更した際に、G列のその行に"1"と書き、変更したセルに色を付けています。
という状況でご要望のようなチェックをするということは、
変更したのに1と書かないひとや、セルに色を付けないひとがいらっしゃるワケですね。
でも、ほんとうのところ、1と色のどちらが正しいかわかりませんよね。
だったら、あとからまとめて調べるより、変更した瞬間に自動的に色がついて1が書き込まれるほうが
確実ではないかと思いますが、いかがでしょう。

( 佳 ) 2015/06/19(金) 19:23


いろんな方から回答をいただけて本当に感謝しています。ありがとうございます。
今更で大変申し訳ないんですが、最終行を指定することってできますか??
例えば、G列に"1"と書かれていたら、I列〜O列まで塗りつぶしがあるかどうか調べる、というような・・・
(すずめ) 2015/06/22(月) 13:33

 >>G列に"1"と書かれていたら、I列〜O列まで塗りつぶしがあるかどうか

 たとえば私のコードでいえば 3か所ある .Rows(c.Row). これを .Rows(c.Row).Range("I1:O1"). に変えると
 OKだと思いますが。

(β) 2015/06/22(月) 18:54


コメント返信:

[ 一覧(最新更新順) ]


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