| 
    
     |  | ▼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
 
 
 |  |