[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.