- ベストアンサー
【ExcelVBA】セルに入力された値によって書式を変更する
こんにちは。いつもお世話になっております。 標題の件で質問させて下さい。 セルに入力された値によって塗りつぶす色を変えるマクロを作成しています。 条件付き書式では、条件を3つしか指定できなかったので、マクロにて制御しようと思いました。 値の判定を行い、入力した各文字列の色で塗りつぶされるところは正常に動作しているのですが、 値が入っていてもいなくても、複数のセルを選択し、「Delete」キーを押下すると、背景色がグレーになってしまうのです。 初歩的な質問で申し訳ありませんが、どなたか上記のような動作をする理由をご教授頂けないでしょうか。 以下にソースを載せておきます。 宜しくお願い致します。 --- Private Sub Worksheet_Change(ByVal target As Range) On Error Resume Next If (target.Cells.Value = "グレー") Then target.Cells.Interior.ColorIndex = 15 ElseIf (target.Cells.Value = "イエロー") Then target.Cells.Interior.ColorIndex = 6 ElseIf (target.Cells.Value = "スカイブルー") Then target.Cells.Interior.ColorIndex = 33 ElseIf (target.Cells.Value = "ピンク") Then target.Cells.Interior.ColorIndex = 7 Else target.Cells.Interior.ColorIndex = 0 End If End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Target.count End Sub で、原因が判ります。 つまり、Target のセルは一つではないことが原因です。 ですから、次のようにセルを一つづつ抜き出せばエラーは回避されます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rngChange As Range For Each rngChange In Target If (rngChange.Value = "グレー") Then rngChange.Interior.ColorIndex = 15 ElseIf (rngChange.Value = "イエロー") Then rngChange.Interior.ColorIndex = 6 ElseIf (rngChange.Value = "スカイブルー") Then rngChange.Interior.ColorIndex = 33 ElseIf (rngChange.Value = "ピンク") Then rngChange.Interior.ColorIndex = 7 Else rngChange.Interior.ColorIndex = 0 End If Next rngChange End Sub なお、Select文で書いた方がスッキリするかも知れません。 Private Sub Worksheet_Change(ByVal Target As Range) Dim C As Integer Dim rngChange As Range For Each rngChange In Target Select Case rngChange.Value Case "グレー" C = 15 Case "イエロー" C = 6 Case "スカイブルー" C = 33 Case "ピンク" C = 7 Case Else End Select rngChange.Interior.ColorIndex = C Next rngChange End Sub
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 >>複数のセルを選択し、「Delete」キーを押下すると この動作をした場合、 >>If (target.Cells.Value = "グレー") Then の判定でエラーになります。 然しながら・・・、 >>On Error Resume Next なので、当然 >>target.Cells.Interior.ColorIndex = 15 になります・・・。 惜しいっちゃぁ惜しいのですが・・・。
お礼
ご回答ありがとうございます。 エラーをハンドリングした場合、"On Error Resume Next" で次の処理に進んでしまうため、背景色がグレーになってしまっているのですね。。 よく分かりました。ありがとうございます。 エラーハンドリングの処理も追々勉強して行きます。 m(_ _)m ありがとうございました。
お礼
ご回答ありがとうございます。 選択された範囲内の1つ1つのセルに対して、繰り返し判定処理を行えばよかったのですね。 大変分かりやすいご回答で、自分でも確認のためソースを記述して、動かすことができました。 For Each ~ Next の使い方も勉強になりました。 初歩的な構文まで教えて頂き、ありがとうございました。 m(_ _)m