|    | 
     ▼けい さん: 
 
こんにちは 
 
はずしているかもしれませんが・・・・ 
 
たとえば 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 
 | 
     
    
   |