こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAの記述法(Worksheet_Changeで)

入力があればセルが黄色のなり、入力がなければ無色とするマクロです。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value <> "" Then
Target.Interior.ColorIndex = 6
Else
Target.Interior.ColorIndex = xlNone
End If
End Sub

このように書くと、通常は正しく動きますが、ドラッグした場合や、複数セルを一度にクリアした場合、エラーになってしまいます。
ただしく作動させるにはどう直せばいいのでしょうか?

投稿日時 - 2004-04-30 09:55:27

QNo.844647

困ってます

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

For Each ~Nextを使わずにやる方法が思い浮かばないので、たとえ列を選択された場合でも、範囲をUsedRangeと重なる部分のみに限定してみました。これならそんなに時間はかからないと思います。
ほかにももっといい方法があるとは思いますが・・・・。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
Set Target = Application.Intersect(Target, UsedRange)
If Target Is Nothing Then Exit Sub
For Each c In Target
With c
If .Value <> "" Then
.Interior.ColorIndex = 6
Else
.Interior.ColorIndex = xlNone
End If
End With
Next
End Sub

If Target Is Nothing Then Exit Subは、UsedRange外を削除したような場合のエラー防止のためです。

投稿日時 - 2004-04-30 14:04:23

お礼

なるほど!
ありがとうございます。

投稿日時 - 2004-05-04 12:27:10

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

内部を以下のようにすると、正しく動作します。

Dim c As Range

For Each c In Target
With c
If .Value <> "" Then
.Interior.ColorIndex = 6
Else
.Interior.ColorIndex = xlNone
End If
End With
Next

投稿日時 - 2004-04-30 10:27:02

お礼

さっそくありがとうございます。
なるほどFor Each ~Nextで一個ずつやるわけですね。

やってみましたところ、ちゃんと作動しました。ありがとうございました。ただ、列を選択してクリアした場合、一個ずつみるためだと思いますが、かなり時間がかかってしまいます。これはどうしようもないのでしょうか?

投稿日時 - 2004-04-30 13:15:20

あなたにオススメの質問