[[20150430013426]] 『VBAで条件に一致したセルの背景色を変更するには』(ミカン) ページの最後に飛ぶ

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

 

『VBAで条件に一致したセルの背景色を変更するには』(ミカン)

お世話になります。

過去ログをあさってみましたが、いまいちよく分からないので教えてください。

条件に一致するセルの背景色を変更したいです。

例えば
範囲がA1:Q5で

セルの値が1の場合セルの背景色→赤
セルの値が2の場合セルの背景色→緑
セルの値が3の場合セルの背景色→青
セルの値が4の場合セルの背景色→黄
空白の場合は背景色なし

といったイメージです。
範囲内のセルの値は1〜4の中で変動します。(空白セルもあります)
変動した際にリアルタイムで背景色を変えたいです。

よろしくお願いいたします。

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


 こんばんは

 シートモジュールに下記コードを貼付て下さい。

 Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A1:Q5")) Is Nothing Then Exit Sub
   On Error GoTo ErrSyori

  Select Case Target.Value
       Case 1
          Target.Interior.ColorIndex = 3
       Case 2
          Target.Interior.ColorIndex = 4
       Case 3
          Target.Interior.ColorIndex = 5
       Case 4
          Target.Interior.ColorIndex = 6
       Case Else
          Target.Interior.ColorIndex = xlNone
  End Select
 ErrSyori:
 End Sub

 どうでしょうか?
(播磨) 2015/04/30(木) 03:38


 「VBAで」ということですが、条件付き書式でも対応できますね。

 A1:Q5 を選んだ状態で

 セルの値が 1 に等しい で 書式 塗りつぶしの色を 赤
 セルの値が 2 に等しい で 書式 塗りつぶしの色を みどり
 セルの値が 3 に等しい で 書式 塗りつぶしの色を 青
 セルの値が 4 に等しい で 書式 塗りつぶしの色を 黄色

(β) 2015/04/30(木) 06:04


 Excelのシートのイベントって、結構難しいですよねえ!!

 シートに値の入力って、セル一つ一つ入力だけではなく、どこかの別のシートのA1:A3をコピーし、

 当該シートのA1に貼り付ける なんてことが出来てしまいます。

 この時、ChangeイベントのTargetは、A1:A3を返します。

 又、 A1:A3を選択した状態で A1に1と入力し、確定を Ctrl+Enterとすると、
 A1:A3に1と入力されます。

 この時も、 ChangeイベントのTargetは A1:A3を返します。

 このように 同時に複数のセルに対し、入力が可能です。

 これに対処しなくてよいのか? という仕様上の問題が生じます。

 Changeイベントの頭で

 if target.count<>1 then exit sub

 なんてやってしまえば、複数同時入力の場合をカットできますが、
 仕様によっては、これが出来ないと非常に不便ということになりかねません。

 シートモジュールのChangeイベントを

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rtarget As Range
    Dim ctarget As Range
    Set rtarget = Application.Intersect(Target, Range("a1:q5"))
    If Not rtarget Is Nothing Then
       For Each ctarget In rtarget
          With ctarget
             Select Case .Value
                Case 1
                   .Interior.ColorIndex = 3
                Case 2
                   .Interior.ColorIndex = 4
                Case 3
                   .Interior.ColorIndex = 5
                Case 4
                   .Interior.ColorIndex = 6
                Case Else
                   .Interior.ColorIndex = xlNone
            End Select
         End With
      Next
   End If
   Set ctarget = Nothing
   Set rtarget = Nothing
 End Sub
 
 このようにすると、複数セル同時入力にも対応できそうです。

 ただ、これも 今回のように コード適応範囲が A1:Q5という狭い範囲だとそれらしく作動しますが、
 もっと適応範囲が広い場合、例えば、すべてのセルに対して色の設定が出来るなんて仕様だと

 セル全体を選択されて 1を入力して、Ctrl+Enterなんてされたら、戻ってくるのかこないのか
 わかりません。

 Targetのセルの数があまり多い場合は、メッセージを表示し、継続か否かの指示をユーザーに仰ぐようにする等の工夫が必要だと思います。

 セルの結合などがある場合も考慮するとなると もう大変ですね!!

 シートのイベントでは、コード化する前に仕様をきっちり決めることが重要だと思います。

(ichinose) 2015/04/30(木) 20:02


 incinoseさんのおっしゃるとおりですね。
 ichinoseさんが指摘されるケースの他に、複数セルに一度に値をいれるということは、結構(意識しないで)やってしまいます。
 どこかのセルを選択してフィルコピーをしたときとか、どこかのセル領域からコピペした時とか
 結構ありうるのは、領域を選択して、Deleteキーでクリア。

 (播磨)さんのコードでは、最初にエラートラップをかけて、 Select Case Target.Value でエラーになっても
 抜けるようには、なっていますが、領域をクリアして、値が 1〜3 じゃなくなっているのに色がついたままという不都合もありますね。

 で、これぐらいの領域であれば、β的には条件付き書式で十分ではないかと思います。

(β) 2015/04/30(木) 20:35


ご回答頂いた皆様、大変感謝いたします。

おかげで思うようなシートを作ることができました。

ありがとうございました!
(ミカン) 2015/04/30(木) 21:07


コメント返信:

[ 一覧(最新更新順) ]


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