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