アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。いつもお世話になっております。

標題の件で質問させて下さい。

セルに入力された値によって塗りつぶす色を変えるマクロを作成しています。

条件付き書式では、条件を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

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

選択された範囲内の1つ1つのセルに対して、繰り返し判定処理を行えばよかったのですね。

大変分かりやすいご回答で、自分でも確認のためソースを記述して、動かすことができました。

For Each ~ Next の使い方も勉強になりました。

初歩的な構文まで教えて頂き、ありがとうございました。

m(_ _)m

お礼日時:2006/09/25 12:04

こんばんは。



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

惜しいっちゃぁ惜しいのですが・・・。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

エラーをハンドリングした場合、"On Error Resume Next" で次の処理に進んでしまうため、背景色がグレーになってしまっているのですね。。

よく分かりました。ありがとうございます。

エラーハンドリングの処理も追々勉強して行きます。

m(_ _)m ありがとうございました。

お礼日時:2006/09/25 11:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!