• ベストアンサー

【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

質問者が選んだベストアンサー

  • ベストアンサー
noname#22222
noname#22222
回答No.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

daisy_k
質問者

お礼

ご回答ありがとうございます。 選択された範囲内の1つ1つのセルに対して、繰り返し判定処理を行えばよかったのですね。 大変分かりやすいご回答で、自分でも確認のためソースを記述して、動かすことができました。 For Each ~ Next の使い方も勉強になりました。 初歩的な構文まで教えて頂き、ありがとうございました。 m(_ _)m

その他の回答 (1)

回答No.1

こんばんは。 >>複数のセルを選択し、「Delete」キーを押下すると この動作をした場合、 >>If (target.Cells.Value = "グレー") Then の判定でエラーになります。 然しながら・・・、 >>On Error Resume Next なので、当然 >>target.Cells.Interior.ColorIndex = 15 になります・・・。 惜しいっちゃぁ惜しいのですが・・・。

daisy_k
質問者

お礼

ご回答ありがとうございます。 エラーをハンドリングした場合、"On Error Resume Next" で次の処理に進んでしまうため、背景色がグレーになってしまっているのですね。。 よく分かりました。ありがとうございます。 エラーハンドリングの処理も追々勉強して行きます。 m(_ _)m ありがとうございました。

関連するQ&A