[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで条件一致したらセルに色を塗りたい』(くるみ)
表題について、教えて下さい。すみません、マクロ初心者でうまく行きません。
シート1, シート2があります。
シート1
A B C 1 2 判定1 No. 判定2 3 A 1-009 2 4 A 1-015 1 5 A 1-014 4 6 A 1-012 1 7 A 1-011 1 8 A 1-016 2 9 A 1-020 2 10 A 1-008 1
シート2
A B 1 2 3 No. 記号 4 1-009 〇 5 1-015 〇 6 1-014 〇 7 1-012 △ 8 1-011 × 9 1-016 × 10 1-020 11 1-008
シート1もシート2も、No.の並びは同じですが、行の始まりが違います。
やりたい事は、シート2の記号が〇か△か×(つまり空欄以外)はシート1のNo.が一致する行の判定1と判定2のセルの色を黄色で塗りつぶしたいです。
但し、一つ条件があり、もし〇か△か×だったとしても、シート1の判定2の値が4だった場合は、グレーとしたいです。(A5セルとC5セルをグレーとしたい)
記号が空欄の場合は何も色を塗りません。
下記のように考えましたが、これだと
シート1のA列の3〜8行目が黒で塗りつぶされてしまいます。黄色やグレーにならない。
かつ、判定2(C列)にも色を付けたいのですが、色が何もつきません。
Sub test()
Dim i As Long
For i = 3 To 10
If Sheets("2").Cells(i + 1, 2) = "〇" Or Sheets("2").Cells(i + 1, 2) = "△" Or Sheets("2").Cells(i + 1, 2) = "×" Then Sheets("1").Cells(i, 1).Interior.Color = RGB(255, 255, 0) And Sheets("1").Cells(i, 3).Interior.Color = RGB(255, 255, 0) If Sheets("1").Cells(i, 3).Value = 4 Then Sheets("1").Cells(i, 1).Interior.Color = RGB(192, 192, 192) And Sheets("1").Cells(i, 3).Interior.Color = RGB(192, 192, 192) End If End If Next i End Sub
宜しくお願いいたします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
And ではなく : で繋げば一行に書けますけど、2行に分けた方が見やすいかも。
Sub test() Dim i As Long For i = 3 To 10 If Sheets("2").Cells(i + 1, 2) = "〇" Or Sheets("2").Cells(i + 1, 2) = "△" Or Sheets("2").Cells(i + 1, 2) = "×" Then Sheets("1").Cells(i, 1).Interior.Color = RGB(255, 255, 0): Sheets("1").Cells(i, 3).Interior.Color = RGB(255, 255, 0) If Sheets("1").Cells(i, 3).Value = 4 Then Sheets("1").Cells(i, 1).Interior.Color = RGB(192, 192, 192): Sheets("1").Cells(i, 3).Interior.Color = RGB(192, 192, 192) End If End If Next i End Sub (丑) 2021/10/30(土) 18:55
Sub test_まとめてみた() Dim i As Long Dim R As Long, G As Long, B As Long
For i = 3 To 10 With Sheets("2") If .Cells(i + 1, 2) = "〇" Or .Cells(i + 1, 2) = "△" Or .Cells(i + 1, 2) = "×" Then R = 255: G = 255: B = 0 With Sheets("1") If .Cells(i, 3).Value = 4 Then R = 192: G = 192: B = 192 Union(.Cells(i, 1), .Cells(i, 3)).Interior.Color = RGB(R, G, B) End With End If End With Next i End Sub ※すみません、一部修正。 19:33 (丑) 2021/10/30(土) 19:14
■1
まず、おかしいなとおもったら【ステップ実行】して思った通りの処理になっているか自己検証することをお勧めします
※なお、ステップ実行という言葉を聞いたことがなければ↓を読んでみてください。
【ステップ実行】 https://www.239-programing.com/excel-vba/basic/basic023.html http://plus1excel.web.fc2.com/learning/l301/t405.html
【ブレークポイント】 https://www.239-programing.com/excel-vba/basic/basic022.html https://www.tipsfound.com/vba/01010
また、以下も知っておいて損は無いと思います。
【イミディエイトウィンドウ】 https://www.239-programing.com/excel-vba/basic/basic024.html https://excel-ubara.com/excelvba1/EXCELVBA486.html
【ローカルウィンドウ】 https://excel-ubara.com/excelvba4/EXCEL266.html http://excelvba.pc-users.net/fol8/8_2.html
■2
構文エラーにはならないようですが↓の書き方には違和感を感じますので再考されてはいかがでしょうか。
Sheets("1").Cells(i, 1).Interior.Color = RGB(255, 255, 0) And Sheets("1").Cells(i, 3).Interior.Color = RGB(255, 255, 0)
■3
おそらく判定の順番としては
(1)「2」シートのB列が空白でない (2) かつ、「「1」シートのB列が4である」が真のとき・・・「1」シートのA,C列をグレーで塗りつぶし (3) 〃 偽のとき・・・「1」シートのA,C列を黄色で塗りつぶし
ということですよね。
それをコードにすると↓のような感じになるとおもいますので、興味があればステップ実行して研究のうえ、必要な部分をご自身のコードに組み込んでみてください。
(理解していただきたいので、丸パクリして完成!というのはご遠慮ください。)
Sub 研究用() Dim i As Long Dim 行 As Variant
Stop 'ブレークポイントの代わり
With Worksheets("1") For i = 3 To .Cells(.Rows.Count, "B").End(xlUp).Row 行 = Application.Match(.Cells(i, "B").Value, Worksheets("2").Range("A:A"), 0)
If IsError(行) Then MsgBox .Cells(i, "B").Value & " が発見できません" Else If Worksheets("2").Cells(行, "B").Value <> "" Then If .Cells(i, "C").Value = 4 Then Intersect(.Rows(i), .Range("A:A,C:C")).Interior.Color = RGB(192, 192, 192) Else Intersect(.Rows(i), .Range("A:A,C:C")).Interior.Color = vbYellow End If End If End If Next i End With End Sub
(もこな2) 2021/10/30(土) 19:43
Sub sample() Dim i As Long Dim Yellow As Long, Grey As Long Yellow = RGB(255, 255, 0) Grey = RGB(192, 192, 192) For i = 3 To 10 Select Case Sheets("2").Cells(i + 1, 2) Case "〇", "△", "×" Select Case Sheets("1").Cells(i, 3).Value Case 1, 2, 3 Sheets("1").Cells(i, 1).Interior.Color = Yellow Sheets("1").Cells(i, 3).Interior.Color = Yellow Case 4 Sheets("1").Cells(i, 1).Interior.Color = Grey Sheets("1").Cells(i, 3).Interior.Color = Grey End Select End Select Next i End Sub (参考) 2021/10/30(土) 20:31
もこな2様
所々に参考になるコードのご提示、ありがとうございます!
今回はNo.の並びが同じといえど、matchで No.が一緒かどうか判定させておいた方が確実ですね。
やりたい事を整理する事がまだ出来ていません。今後意識したい所です。
B列が空欄でないか先に条件分岐してしまう事も、大変勉強になりました。
Intersectの考え方も目から鱗でした。ありがとうございます。
(くるみ) 2021/10/30(土) 20:39
(くるみ) 2021/10/30(土) 20:45
グレーで塗る条件を判定3も追加したいです。
もし、シート1のD列に判定3があったとして、そこには3行目から10行目まで数式で#N/Aか、対象外のどちらか
数式で表示させているとします。
判定2の値が4かつ、判定3が#N/Aの場合グレーとしたいのですが、型が一致しませんと出てしまいます。
下記 丑様にご提示して頂いたコードの
If .Cells(i, 3).Value = 4 Then R = 192: G = 192: B = 192 部分を
If .Cells(i, 3).Value = 4 AND .Cells(i, 4).Value = "N/A" Then R = 192: G = 192: B = 192
としました。
最初に丑様にご提示いただいたコードです。
↓↓
With Sheets("1") If .Cells(i, 3).Value = 4 Then R = 192: G = 192: B = 192 Union(.Cells(i, 1), .Cells(i, 3)).Interior.Color = RGB(R, G, B) End With
ANDの使い方がいけないのか、
変数指定のi, R, G, Bをlongにしているからなのか分からなくて困っています。
(くるみ) 2021/11/01(月) 15:25
#N/Aはエラー値なので、エラーの判定をする必要があると思います。 判定するエラー値を#N/Aに限定するなら、こんな感じでしょうか。
If .Cells(i, 3).Value = 4 And .Cells(i, 4).Value = CVErr(xlErrNA) Then R = 192: G = 192: B = 192
>変数指定のi, R, G, Bをlong 今回の場合、変数の型は関係ないです。 RGBは参考さんが提示されているように、1つの変数に入れた方が扱いやすいかも。 (丑) 2021/11/01(月) 18:08
(くるみ) 2021/11/01(月) 18:24
■4
繰り返しになりますが、おかしいとおもったら、まず【ステップ実行】して自己検証すべきです。
また、回答者には貴方の画面は見えませんので【現状のコード】をすべて(Sub〜End Subまで)提示のうえ【どこ】で【どのような】エラーが発生するのか提示をされるとよいでしょう。
■5
私見になりますが、↓のような書き方(マルチステートメントといいます)は慣れていれば(理解していれば)よいのですが、初心者だといっている間はご自身が混乱するとおもうので避けた方がよいように思います。
R = 192: G = 192: B = 192
付随して、IF文も If〜End Ifまでを記述する基本形のほうがわかりやすいのではないかとおもいます。
■6
>シート1のD列に判定3があったとして、数式で#N/Aか、"対象外"のどちらか表示させているとします。
#N/Aはエラー値というものなので、普通に文字列と比較判定させようとすると「型」が一致しないというエラーが出ます。
※【値】が【エラー値】の場合【文字列】は「型」が違うので比較できない
単純にエラーかそうでないかを調べるだけならばIsError関数を使うことで判定ができます。
Sub 実験1() If IsError(Range("A1").Value) Then MsgBox "エラー値だよ" Else MsgBox "エラーじゃ無いよ" & vbLf & Range("A1").Value & "だよ" End If End Sub
ですが、「#N/A」というエラーか判定をしたいならば、ちょっとめんどくさいことになります
Sub 実験2() If IsError(Range("A1").Value) Then If Range("A1").Value = CVErr(xlErrNA) Then MsgBox "N/Aエラーだよ" Else MsgBox "N/A以外のエラーだよ" End If Else MsgBox "エラーじゃ無いよ" & vbLf & Range("A1").Value & "だよ" End If End Sub
なお↑は【値(Value)】を使った場合の話です。表示されている情報(Textプロパティ)であれば【文字列】として扱うことが出来ます。
Sub 実験3() Select Case Range("A1").Text Case "#N/A", "対象外" MsgBox "条件に合致"
Case Else MsgBox "条件を満たさない"
End Select End Sub
ただし、セルの幅が狭く###のように表示されてしまっている場合は、この方法は使えません。
【参考】 https://qiita.com/nukie_53/items/6c2d9d4699149bebe863
■7
残念ながら前回提示したものは研究していただけなかったようですが、改造版を提示しておきます。
例によって研究用として提示しているので丸パクリはNGとします。
Sub 研究用2() Dim i As Long Dim 行 As Variant Dim 色コード As Long
Stop 'ブレークポイントの代わり
With Worksheets("1") For i = 3 To .Cells(.Rows.Count, "B").End(xlUp).Row 色コード = 0
行 = Application.Match(.Cells(i, "B").Value, Worksheets("2").Range("A:A"), 0) If IsError(行) Then MsgBox .Cells(i, "B").Value & " が発見できません" Else Select Case Worksheets("2").Cells(行, "B").Value Case "〇", "△", "×" Select Case .Cells(i, "C").Value Case 4 If .Cells(i, "D").Text = "#N/A" Then 色コード = RGB(192, 192, 192) End If Case Else 色コード = vbYellow End Select Case Else '省略可能だがあえて記述 '何もしない End Select End If
If 色コード <> 0 Then Intersect(.Rows(i), .Range("A:A,C:C")).Interior.Color = 色コード End If
Next i
End With End Sub
(もこな2 ) 2021/11/01(月) 19:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.