[[20211030175057]] 『マクロで条件一致したらセルに色を塗りたい』(くるみ) ページの最後に飛ぶ

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

 

『マクロで条件一致したらセルに色を塗りたい』(くるみ)

表題について、教えて下さい。すみません、マクロ初心者でうまく行きません。

シート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

丑様
ありがとうございます!!
まず、ANDの使い方が良くなかったのですね。よく考えてみたらそうですよね。。
なぜ、ANDだと色が黒になってしまったのかだけがどうしても不思議なのですが。
ANDという正しくない指定をした事で、色が0とみなされて、0=黒に変換された…?、、今後解明してみたいと思います。
そして、色を変数に格納してしまうという発想も大変勉強になりました。

もこな2様
所々に参考になるコードのご提示、ありがとうございます!
今回はNo.の並びが同じといえど、matchで No.が一緒かどうか判定させておいた方が確実ですね。
やりたい事を整理する事がまだ出来ていません。今後意識したい所です。
B列が空欄でないか先に条件分岐してしまう事も、大変勉強になりました。
Intersectの考え方も目から鱗でした。ありがとうございます。
(くるみ) 2021/10/30(土) 20:39


参考様
ありがとうございます!!
今回始めにやり方をネットで調べた所、ifの他にselectが使えそう…と思ったのですが、
selectの使い方がいまいち良く分からずifにしました。
このように使用するのですね。ありがとうございます。まだまだ駆け出しですが、色々出来るようになったら楽しそうですね。
今後、引き出しを増やしていけるように頑張ります!

(くるみ) 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

丑様
大変ありがとうございます。あの後、作業列を作り、♯N/Aを文字列に変更するというやり方を試しましたが、
そのように処理できるのですね。今回、色々勉強させて頂きました。ありがとうございました!
色の変数も1つにまとめてみます。

(くるみ) 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


もこな2様
先日に引き続き、順を追っての分かりやすいご説明、ありがとうございます!
型が一致しないと出てきた理由も、ご説明頂いた事でよく分かりました。
ご提示頂いたコード、前回も今回も所々に参考になるヒントが入っており、
大変勉強になっています。(ステップインで確認させて頂きました。)
ありがとうございました^ ^
(くるみ) 2021/11/01(月) 21:00

コメント返信:

[ 一覧(最新更新順) ]


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