|
▼けい さん:
こんにちは
はずしているかもしれませんが・・・・
たとえば L30 を「セル削除」した場合、確かにTarget.Address は
$L$30 になります。
ただし、その値は Target.Value であれ Range("L30").Value であれ
「新しいL30」の値になります。(削除前のL30の値は返りません)
ただし、「空白」、つまり、L30を「クリア」すれば、値は空白で返ってきます。
なので、ElseIf での処理がなされると思うのですが?
ブレークポイントの設定と、ステップ実行はご存知でしょうか?
最初の If 文にブレークポイントを設定し、L30をクリアして、このコードでとまった後
F8を押しながら1ステップずつ実行させますと、コードが、どのような順序で実行されるのかが
わかります。是非、お試しください。
それと、今回のケースでは、最初にTargetのアドレスをL30 と聞いていますので
実害はないのですが、L36へのセットで、Changeイベントが発生し、その瞬間に
このプロシジャに再入してきます。(イベントの連鎖)
一般的には、処理の前に、
Application.EnableEvents = False と記述してイベント発生を抑止し
処理後に
Application.EnableEvents = True として復旧させますね。
アップされたコードと基本、同じですが、少し手直ししたものを参考まで以下に。
Private Sub WorkSheet_change(ByVal Target As Range)
Dim P As VbMsgBoxResult
If Target.Address <> "$L$30" Then Exit Sub
Application.EnableEvents = False
If Range("L30") <> "" Then
P = MsgBox("有りですか?", vbYesNo)
If P = vbYes Then
Range("I36").Value = "有り"
Else
Range("I36").Value = "無し"
End If
Else
Range("I36").ClearContents
End If
Application.EnableEvents = True
End Sub
|
|