- ベストアンサー
空白状態でEnterを押したら指定のセルに飛びたい
- VBAコードを使用して、空白状態でEnterキーを押した時に指定のセルに移動する方法について調査しました。
- 既存のVBAコードを使用して、空白状態でF5セルを選択した場合に次のC9セルに移動する動作を実現することができます。
- しかし、この方法ではC9セルが表示されてしまうため、他の方法を探しても見つけることができませんでした。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。なさりたいことが何となく理解できたと思うので自分なりに作成してみました。 VBAは不勉強ですので、もっと適切な記述があると思いますので良いものを見つけたらそちらを使ってくださいね。 ご紹介する前に先ずは、ご利用のコードと疑問点の関連を。 >F5を選択するとその時点でC9もアクティブ状態になっている ご利用になっているのが、Worksheet_SelectionChangeだからです。 別のセルが選択されると同時に動作するイベントです。マウスでセルをクリック、Enterキー、矢印キーで移動しただけでも動作すると思います。 >F5を選択すると不自然にC9がアクティブ ご利用のコードが走ると、F5とC9の二つのセルを選択するように記述されてますよね。 まず、1行目でこのコードは、セルF5とC9の二つのセルを常にオブジェクトとして利用するよう命令しています。 >With Range("F5,C9") 4行目のコードで、セルF5とC9を選択するように命令しています。 >.Select 4行目はオブジェクトが省略されていますが、1行目でRange("F5,C9")のオブジェクトを常に使うように指示しているので、 Range("F5,C9").Select と命令していることになります。 ご利用のコードから、この「.Select」を消すと画面上なんの変化もでなくなると思います。 5行目のTarget(1).Activateは、命令としては実行されてますが元々選択されていたセルをActiveにしているだけなので、特に意味を持たないように見えます。 続いて私の策をご紹介します。Excel2010で動作確認しました。 ●セル「F5」の中身を特に編集せずEnterキーを押し下げたときは、セル「C9」に移動しなくても良い場合。 Worksheet_Changeイベントを利用します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$5" Then Exit Sub Application.EnableEvents = False If Target = Empty Then Range("C9").Activate Application.EnableEvents = True End Sub 多分、Application.EnableEvents = False/Trueは不要と思いますが、一応入れておきました。(不勉強ですみません) このコードを利用した場合、セルF5が空白で、セルF4から続けてEnterキーで素通りした場合には、セルF5の中身に関係なく、セルC9には移動しません。 Changeイベントは、セルの中身が編集された時に稼動するイベントだからです。 ●セル「F5」の中身が空白の場合、Enterキーを押し下げた時は必ずセル「C9」に移動したい場合。 標準モジュールを利用します。 1) 標準モジュールの作成 VBE画面 - 挿入 - 標準モジュール 2) 1)で作成された標準モジュール(Module 1)に次の記述を行う。 Auto_Open、ENTER_Keyの名前は変更しないでください。Private Subにするのは大丈夫そうです。 Sub Auto_Open() Application.OnKey "{RETURN}", "ENTER_Key" Application.OnKey "{ENTER}", "ENTER_Key" 'テンキーのEnterキー End Sub Sub ENTER_Key() With ActiveCell If Not ActiveSheet Is Worksheets(1) Then .Offset(1, 0).Select: Exit Sub If .Address = "$F$5" Then If .value = Empty Then Range("C9").Activate Else .Offset(1, 0).Activate Else .Offset(1, 0).Activate End If End With End Sub 3) ファイルを保存し終了。改めてファイルを開いて動作確認。 コードと手順は以上です。 Auto_Openは、そのExcelファイルを開いた時に読み込まれて稼動するものなので、初回の記述後はファイルを保存後に改めてファイルを開く必要があります。ですのでAuto_Openに関しては、記述内容の変更を行った場合は、ファイルを保存して改めて開くまでは、古い記述内容で稼動しますのでご留意ください。 もし、このコードを全てのワークシートで稼動させて良いなら、 Sub ENTER_Key() の2行目「If Not ActiveSheet Is ・・・」は削除してください。 特定のワークシートでのみ稼動させるなら、2行目の「Worksheets(1)」のカッコ内の数字で調整してください。これはワークシート名ではなく、ワークシートの並び順で先頭から順番に数えた時の数字です。 ワークシート名を変更される心配がないなら、「ActiveSheet Is Worksheets(1)」は「Activesheet.Name = "○○"」と変更しても稼動します。 複数でそのファイルを使用するなら、採用する記述によって「ワークシートの順番は変えない」または「ワークシートの名前は変えない」約束をしないと途端にコードは稼動しなくなります。 また、セルF5にスペースのみが入力された場合もC9に移動したいなら、Sub ENTER_Key() の4行目「.value = Empty」は「Trim(.value) = Empty」にすると良いです。Excel2010では、半角/全角スペースのどちらにも反応できました。 なお、「ENTER_Key」はEnterキーを押した後の動作を指定することになるようで、Activecell.Offsetを記述しないと、セルF5以外のセルでEnterキーを押しても自動的に次のセルに移らなくなってしまいました。 これを予防する簡単な記述があるかも知れないのですが分かりませんでしたので、上記コード内に.Offsetを含めている次第です。 以上、長くなりすみません。ご参考になれば幸いです。
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
>これが見えずにできる他の方法があるか色々調べても見つかりませんでした; >何か可能な策はありますでしょうか・・? ご相談のことは、通常は別にマクロとか使わずに他の方法で、 1.F5とC9セルについて、セルの書式設定の保護のタブでロックのチェックを外しておく 2.シートを保護し、その際に「ロックされたセルの選択」のチェックを「外して」シートを保護する のようにしておくことで、簡単に実現できます。 #補足 一般に使われるマクロでは、「エンターキーの空打ち」を上手に処理する方法はありません。 敢えて言うとApplication.Onkeyで仕込んでおく手が利用できる場合がありますが、ほかの場面で副作用が大きいのでお勧めしません。
お礼
ご回答ありがとうございます。シート保護をなるべく利用せずに実行しなかったのですが 難しい問題なのですね;Application.Onkeyは副作用があるのか試してダメだったら諦めてみたいです;
- tondekesky
- ベストアンサー率68% (17/25)
>次に飛ぼうとするC9セルが見えてしまいます。 ごめんなさい、「見えてしまう」でおっしゃりたい意味が分からないのですが、 書いてらっしゃるコードだと、ActiveになったセルがF5またはC9であり、 なおかつActiveのセルに何も入っていない場合には、F5とC9を選択(.Select)して ActiveのセルをActiveにしてね、と書いているように見えます。 これだと、C9を選択してもセルが空の場合、F5を選択して空だった場合と同じ動作をします。 VBAはまだ不勉強ですが、今回はF5とC9のセルだけに限定するなら、 次のように若干書き換えて見るとどうですか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Range("F5") If Not Intersect(Target(1), .Cells) Is Nothing Then Application.EnableEvents = False Range("C9").Activate Application.EnableEvents = True End If End With End Sub ご質問の意図と異なってましたらごめんなさい。
お礼
ご回答ありがとうございます。質問の意図がわかりづらくて申し訳ないです。 F5でもし入力をしてEnterを押せば順当に次のセルに移動し、何も入力せずEnterを すればC9に飛びたいという趣旨です。私の書いているコードは、F5を選択するとその時点で C9もアクティブ状態になっているのが見えているのを見えないように上記のように 状況に応じて飛ばしたいという思惑があります。
補足
ごめんなさい。Enterを押せば順当に次のセルに移動というのは不必要でした。 いずれにせよ、F5を選択して仮に何も入力をせずとも、入力をしようともEnterを 押せばC9に自然に飛ばしたいというのが今回の目標です。私の書いているコードは F5を選択すると不自然にC9がアクティブ状態になっているように見えているのを見えないようにしたいという感じです。
お礼
何度もご回答ありがとうございます;思い通りの事ができました。本当にこんな 無知の私のために詳しく教えていただいて感謝の気持ちでいっぱいです。 より色々な場合を想定して一からご回答いただきとても勉強になりました。 ありがとうございましたm(_ _)m