[[20050317113004]] 『SelectionChangeでTargetの保持』(純丸) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『SelectionChangeでTargetの保持』(純丸)

 またまたマクロの件で質問させていただきます。
 あるセルが選択された場合、選択範囲を1行下に移動させる目的で
 SelectionChangeイベントを使っているのですが、下のセルから
 ↑キー、またはShift+Enter で上がって来た場合は、選択セルを1行上に
 移動させたいと思っています。上から来たら下へ、下から来たら上へ、
 という動きが希望です。
 この場合、イベント発生前のセル位置を取得する必要があると思うのですが、
 マクロの最後でセル位置を取得し、次のイベントまで保持するのは可能ですか?
 可能ならどういう記述になるか教えていただけますか?
 よろしくお願いします。

       A       B
 10          B10 を入力後EnterするとB12 がActive になる。
 11       −   
 12          B12 で↑キーを押すとB10 がActive になる。

 イメージはこんな感じです。 
 (純丸)(o^-')b


 >マクロの最後でセル位置を取得し、
 これはどのようなマクロでしょうか。
 SelectionChangeイベント以外のマクロであれば、変数をグローバル変数に代入すれば可能だと思います。

 別案として、Onkeyメソッド使うってのはどうでしょうか。
 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Application.OnKey "+{ENTER}", "上"
    Application.OnKey "{UP}", "上"
    Application.OnKey "{ENTER}", "下"
    Application.OnKey "{DOWN}", "下"
End Sub
 
 以下を標準モジュールに。
Sub 上()
    ActiveCell.Offset(-2, 0).Activate
    Application.OnKey "+{ENTER}"
    Application.OnKey "{UP}"
End Sub
Sub 下()
    ActiveCell.Offset(2, 0).Activate
    Application.OnKey "{ENTER}"
    Application.OnKey "{DOWN}"
End Sub

 (川野鮎太郎)


 >>マクロの最後でセル位置を取得し、
 >これはどのようなマクロでしょうか。
 鮎さん、すみません。SelectionChange のつもりで書きました。となると
 SelectionChangeイベントでの保持は不可能ということですね。
 提案いただいたマクロはこれから試してみます。ありがとうございました。
 と、ここまで書いてきて思い付きましたが、セル位置をどこかのセルに
 入れておけばうまくいくかも、ですね。これも試してみます。
 (純丸)(o^-')b


 鮎さぁん、BeforeRightClick じゃなくて SelectionChange でいいんですよね?
 それで試すと、A1→A3→A4→A6→A7→A9→A10→A12→A13 と動くんですけど、、、。

 (純丸)(o^-')b Excel2003 ならこんな苦労しなくてもセルの保護ですむのに。


衝突しました。

 >SelectionChangeイベントでの保持は不可能
 いや、不可能ってわけでもないのでしょうけど、マウスでクリックしても
 イベントは発生するし、条件分岐がめんどくさいんじゃないかな・・・って
 思っただけです(^_^A;

 >SelectionChange でいいんですよね?
 いえ、何のコードで使われるのかわからなかったので、
 BeforeRightClickにしていただけです。

 一度全体像が判るように、どこのセルで何をしようとしたときに、どうなりたいか書いてみませんか。(^_^A;

 多分これだけじゃだめですよね。
Option Explicit
Public MyRow As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim MyFlg As Long
    MyFlg = Target.Row - MyRow
    Select Case MyFlg
        Case 1
            Target.Offset(1, 0).Activate
        Case -1
            Target.Offset(-1, 0).Activate
    End Select
    MyRow = ActiveCell.Row
End Sub

 (川野鮎太郎)


 衝突☆!しました。取り合えずそのままUPして、上のコードはこの後試してみます。

	     C	        D
  7	顧客コード 	
  8		
  9	受付番号 	
 10		
 11	売上A 	
 12		
 13	売上B 	
 14		
 15	売上合計 	
 16		
 17	リベート	
 18		
 19	旅費 	

 こんな感じで D7からD19まで「1行起きに」入力する表なのですが、入力時に
 セルを自動に飛ばしたいのですね。(D7でEnterしたらD9に移動したい。)
 偶数行は SelectionChange ですぐ下に移動するようにすると、上から下に
 入力するのはいいのですが、入力違いなどで上に戻りたい時、↑では戻れなく
 なってしまう。ノートパソコンでの使用も頭にあるので、なるべくキー操作で
 戻りたい訳です。
 D7に入力してEnter→D8に移動→イベント発生でD9に移動、といった動きの時、
 イベントで動いたD9というセル位置が保持出来れば、次のイベント発生時に
 上から下りて来たか、下から上がって来たかの判断が出来て条件分岐が出来ると
 思ったのです。
 (純丸)(o^-')b  表の作り方が悪いという突っ込みは無しね。


 そういうことならいけそうですね。
 
Option Explicit
Public MyRow As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim MyFlg As Long
If Application.Intersect(Target, Range("D7:D19")) Is Nothing Then Exit Sub
    MyFlg = Target.Row - MyRow
    Select Case MyFlg
        Case 1
            Target.Offset(1, 0).Activate
        Case -1
            Target.Offset(-1, 0).Activate
    End Select
    MyRow = ActiveCell.Row
End Sub

 (川野鮎太郎)


 > そういうことならいけそうですね。
 
 いけそうです。別の列にも展開する必要があるのですが何とかなると思います。
 ありがとうございました。m(__)m
 (純丸)(o^-')b

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.