[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『決まった色で塗りつぶされているか調べたい』(すずめ)
おはようございます。
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
の端とは何を示していますか
何かデータがある端ですか、それとも行の一番最後までですか
指定の色はどのようにして付けましたか?条件付き書式の場合は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
要件がわかりづらいんですがたたき台です。
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列まで塗りつぶしがあるかどうか
たとえば私のコードでいえば 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.