|    | 
     ▼UO3 さん: 
解説、回答をありがとうございます。 
 
'以降の処理でシートに値が書き込まれたときにChangeイベントが 
'発生すると、また、このルーティンに連鎖して入ってくるので 
'それを抑止 
 
というのは 
Range("B1").Value = Range("A1").Value 
が実行されたとき、Changeイベントが起きた→ 
Range("A1")に戻る→Range("A1")は既に入力済み→ 
Range("B1")は空ではないので何もしない 
ということを抑止する、ということですか。 
 
 
>▼隼 さん: 
> 
>こんにちは 
> 
>アップされたコードを解説しますね。 
>(隼さんのエクセルの設定が標準設定のまま、エンターキーの 
> 後カーソルが下に行くようになっているという前提で) 
> 
>Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
> 
>まず、、これは、「入力されたとき」ではなく「選択されたセルの場所が変わったとき」に発生します。 
>つまり、A1に入力してエンター。するとカーソルはA2にきますね。この時に動きます。 
>ですから、この時の Target は A2 になっています。 
> 
>  Target = Range("A1") 
> 
>このコードは、省略しないで書くと 
>Target.Value = Range("A1").Value ということなんです。 
>で、TargetはA2になっていますので、 
>Range("A2").Value = Range("A1").Value と同じことになります。 
>これで、A1の値がA2に記入されるわけがおわかりですね? 
> 
>で、その後 
>If IsEmpty(Range("B1")) Then 
>  Range("B1") = Target 
>End If 
> 
>がありますので、B1が空白の場合、B1にも書かれるというわけです。 
> 
>SelectionChange のコードをすべて削除して以下にしてください。 
> 
>Private Sub Worksheet_Change(ByVal Target As Range) 
>  'A1に入力された場合のみ対応 
>  If Not Intersect(Target, Range("A1")) Is Nothing Then 
>    '以降の処理でシートに値が書き込まれたときにChangeイベントが 
>    '発生すると、また、このルーティンに連鎖して入ってくるので 
>    'それを抑止 
>    Application.EnableEvents = False 
>    If IsEmpty(Range("B1").Value) Then Range("B1").Value = Range("A1").Value 
>    'このプロシジャ内でのシートへの書き込みが終わったので 
>    'イベントの発生を再開する。 
>    Application.EnableEvents = True 
>  End If 
>End Sub 
 
 | 
     
    
   |