空白状態でEnterを押したら指定のセルに飛びたい

このQ&Aのポイント
  • VBAコードを使用して、空白状態でEnterキーを押した時に指定のセルに移動する方法について調査しました。
  • 既存のVBAコードを使用して、空白状態でF5セルを選択した場合に次のC9セルに移動する動作を実現することができます。
  • しかし、この方法ではC9セルが表示されてしまうため、他の方法を探しても見つけることができませんでした。
回答を見る
  • ベストアンサー

空白状態でEnterを押したら指定のセルに飛びたい

例えばF5セルで何も入力せずEnterを押したらC9に入力セルを飛ばしたくて 自分の力で調べた限りでは下のコードで可能なのですが Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Range("F5,C9") If Not Intersect(Target(1), .Cells) Is Nothing Then Application.EnableEvents = False .Select Target(1).Activate Application.EnableEvents = True End If End With End Sub 上記コードはF5セルを選ぶと、次に飛ぼうとするC9セルが見えてしまいます。 これが見えずにできる他の方法があるか色々調べても見つかりませんでした; 何か可能な策はありますでしょうか・・?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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を含めている次第です。 以上、長くなりすみません。ご参考になれば幸いです。

kokorororo
質問者

お礼

何度もご回答ありがとうございます;思い通りの事ができました。本当にこんな 無知の私のために詳しく教えていただいて感謝の気持ちでいっぱいです。 より色々な場合を想定して一からご回答いただきとても勉強になりました。 ありがとうございましたm(_ _)m

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>これが見えずにできる他の方法があるか色々調べても見つかりませんでした; >何か可能な策はありますでしょうか・・? ご相談のことは、通常は別にマクロとか使わずに他の方法で、 1.F5とC9セルについて、セルの書式設定の保護のタブでロックのチェックを外しておく 2.シートを保護し、その際に「ロックされたセルの選択」のチェックを「外して」シートを保護する のようにしておくことで、簡単に実現できます。 #補足 一般に使われるマクロでは、「エンターキーの空打ち」を上手に処理する方法はありません。 敢えて言うとApplication.Onkeyで仕込んでおく手が利用できる場合がありますが、ほかの場面で副作用が大きいのでお勧めしません。

kokorororo
質問者

お礼

ご回答ありがとうございます。シート保護をなるべく利用せずに実行しなかったのですが 難しい問題なのですね;Application.Onkeyは副作用があるのか試してダメだったら諦めてみたいです;

回答No.1

>次に飛ぼうとする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 ご質問の意図と異なってましたらごめんなさい。

kokorororo
質問者

お礼

ご回答ありがとうございます。質問の意図がわかりづらくて申し訳ないです。 F5でもし入力をしてEnterを押せば順当に次のセルに移動し、何も入力せずEnterを すればC9に飛びたいという趣旨です。私の書いているコードは、F5を選択するとその時点で C9もアクティブ状態になっているのが見えているのを見えないように上記のように 状況に応じて飛ばしたいという思惑があります。

kokorororo
質問者

補足

ごめんなさい。Enterを押せば順当に次のセルに移動というのは不必要でした。 いずれにせよ、F5を選択して仮に何も入力をせずとも、入力をしようともEnterを 押せばC9に自然に飛ばしたいというのが今回の目標です。私の書いているコードは F5を選択すると不自然にC9がアクティブ状態になっているように見えているのを見えないようにしたいという感じです。

関連するQ&A

  • Find,Offsetを使ってセルを指定する方法

    エクセルVBAのことで伺います。 以下の記述は、「D3からQ3までのセルの中で「年」と入ったセルの左横のセルを探し、 その中の値(西暦の年が入っています)を、G4からI100までの範囲に入力される月日 の年として置き換える」といったものなのですが、エラーが出てしまいます。 「実行時エラー424、オブジェクトが必要です。」とのメッセージが表示され、デバックを クリックすると、「Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select」 が黄色く強調表示されています。 プログラムの記述をどのように修正すれば良いか、どなたかお教えください。 よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim FoundCell As Range Set FoundCell = Range("D3:Q3").Find("年").Offset(0, -1).Select With Target If Intersect(Target, Range("G4:I100)) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> FoundCell Then Application.EnableEvents = False .Value = DateSerial(FoundCell, Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub

  • このマクロあっていますでしょうか?よろしくお願いいたします。

    ★sheetA Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$14" And Target.Address <> "$C$19" _ And Target.Address <> "$F$19" Then Exit Sub If Target.Address <> "$R$14" And Target.Address <> "$S$14" _ And Target.Address <> "$T$19" Then Exit Sub Application.EnableEvents = False With Sheets("B") .Range("F14").Value = Range("C14").Value .Range("F17").Value = Range("C19").Value .Range("F20").Value = Range("F14").Value .Range("F23").Value = Range("F19").Value End With With Sheets("C") .Range("F13").Value = Range("R14").Value .Range("F14").Value = Range("S14").Value .Range("F18").Value = Range("T19").Value End With Application.EnableEvents = True End Sub ★sheetB Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$14" And Target.Address <> "$F$17" _ And Target.Address <> "$F$23" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("C14").Value = Range("F14").Value .Range("C19").Value = Range("F17").Value .Range("F19").Value = Range("F23").Value End With Application.EnableEvents = True End Sub ★sheetC Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ And Target.Address <> "$F$18" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub

  • ExcelのVBで、Rangeの範囲に任意のセル値を使うには

    VB初心者で行き詰っております。 前任者の作成したVBコードで、特定のセルの入力をテンキーで入力できるようにしています。 VBのコードについては、下記の通りとなっております。 Private Sub Worksheet_Change(ByVal Target As Range) Dim crng As Range Dim ttarget As Range Application.EnableEvents = False Set ttarget = Application.Intersect(Target, Range("C6:AG35")) If Not ttarget Is Nothing Then ttarget = Application.VLookup(ttarget, Worksheets("入力").Range("A1:B10"), 2,False) For Each crng In ttarget If IsError(crng) Then crng.Value = "" End If Next End If Application.EnableEvents = True End Sub ここで、シート内の範囲が変更となる(対象となる行が増減される)ことが発生します。 Set ttarget = Application.Intersect(Target, Range("C6:AG35")) ※この部分がRange("C6:AG37")や、Range("C6:AG33")などに変更となるということです。 その都度、VBの変更をかけると可能なのですが、より効率的にするため、入力という名前のシートに ある空きセルをうまく活用したいと考えております。 Range("C6:AG35")の部分で、任意のセルを参照する変数を利用するには、 どのように記述したらよろしいでしょうか? また、別法として、常に行数をカウントできる方法でも可能なのかもしれません。 最初の行に値するセルがC6から始まり、最終行よりも下は空白セルとなります。 とすれば、行数をカウントして変数に組み込むことも一つなのかもしれませんが、技術がないため、 思いつくだけにとどまっております。 アドバイスをいただければと思います。よろしくお願いします。

  • 【VBA】クリックする毎にセル色が変わる

    Excelのセルをクリックするたびに、「色なし→赤→青→黄→黒→色なし」などのように色を順番に変更する方法があれば教えてください。 下記のSelectionChangeコードで、「色なし→黄→色なし」にできるのですが、複数の色を順番に表示させたいと思っております。 お手数お掛けいたしますが、よろしくお願い致します。 ================================================= Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim 各セル As Range Set Target = Intersect(Target, Range("A1:A5")) If Target Is Nothing Then Exit Sub For Each 各セル In Target With 各セル If .Value = 1 Then .ClearContents .Interior.Pattern = xlPatternNone Else .Value = 1 .Font.ColorIndex = 6 .Interior.ColorIndex = 6 End If End With Next End Sub =================================================

  • 文字を入力したセル以降のセルも同じ文字になるVBA

    Private Sub Worksheet_Change(ByVal Target As Range) Dim R As Range ActiveSheet.Protect UserInterfaceOnly:=True Set R = Union(Range("D5:D38"), Range("E5:E38"), Range("T5:T38")) With Target If Intersect(.Cells, R) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(.Row, .Column), Cells(38, .Column)).Value = .Value Application.EnableEvents = True End With End Sub この様なコードがあるのですが範囲を変更したいと思います。 D5:D38は上記コードのままで良いのですが、E5;E38はE5:E36に、T5:T38はT5:T36に変更するにはどうすれば良いのでしょうか?

  • 指定範囲のセルが変更されたら

     下記のコードで1つのセル(A1)が変更されたら入力前の元データを別シート(A1)に保存できるようにしたのですが、指定範囲(I10:CW42,2行3列を一升)のセルが変更されたら別シートの指定範囲(I10:CW42)に保存できるようにしたいのですが方法がありましたらお教え下さい。お願いします。 Windows7・SP1 Office2010 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Application.EnableEvents = False Application.Undo Sheets("Sheet2").Range("A1").Value = Range("A1").Value Application.Undo Application.EnableEvents = True End Sub

  • Excelで書込禁止メッセージを指定したセル以外で出したい

    教えてください。 エクセルで下記のような簡単なシートがあります。 ********************************* 料金マクロ (セル:C6)年(セル:F6)月 [印刷ボタン] ********************************* (VBAにて「印刷ボタン」を押すと他のファイルを読みに行って印刷できるようになっています。) 入力可能なのは「C6」と「F6」のセルだけで それぞれ年・月(例:「07」年「10」月)を入力できるようにしたく、 そのセルだけを入力許可して保護をかけました。 その他のセルはどこを触っても、禁止メッセージを表示したいです。 しかし、エクセルにメッセージ「変更しようとしているセルまたはグラフは・・・・・・」 という、エクセルで「保護」した時の書込禁止メッセージではなく、 年配の方が使うファイルなので、わかりやすいメッセージにしたくて 色々調べてみました。 その結果、保護ではなく、 シートモジュールに入力することで対応できることを知り、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.Intersect(Target, Range("A1:IV100")) Is Nothing Then Else MsgBox "年・月以外は書込みできません" Range("C6").Select End If End Sub としてみました。 (A1:IV100の範囲で書込み禁止エラーがでる。その後、カーソルが「C6」のセルに戻る。) この状態だと、戻る「C6」には、入力ができますが 「F6」への入力ができません。 「C6」・「F6」を両方入力を可能にするにはどうしたらいいですか? どなたかお詳しい方、教えてください。 この方法にこだわっているわけではないので、 もし、別のいい案がございましたら、 方法が変わってもかまいません。 お手数お掛け致しますが、よろしくお願いいたします。

  • 空白セルに●を入れたい

    Excelのセル範囲(例:としてA1からC10)のセルを調べて、 空白のセルになにかの文字(例:●)を打ち込みたい場合のVBAの書き方を教えてください。 Sub セル埋め() Dim r As Range, i As Range Set r = Range("A1:C10") '範囲指定 If Intersect(r, Target) Is Nothing Then For Each i In r If i.Value = "" Then i.Value = "●" Next i End Sub この書き方にこだわっているわけではないので、もっと簡単なやり方でもけっこうです。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • WorkSheet_Changeを2つ反映させる

     下記のコードをWorkSheetで2つ反映させるにはどうしたらいいでしょうか?どちらか一つなら反映するのはわかりますが、どう名前を変更すればいいのかお教え願えませんでしょうか? windows7・SP1 Office2010 Private Sub WorkSheet_Change(ByVal Target As Range) If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub '検査範囲 Application.EnableEvents = False '再帰実行の停止 If Range("C1").Value <> Sheets("祝祭日").Range("A1").Value Then MsgBox ("祝日の設定を反映するため年度を同じにしてください。") End If Application.EnableEvents = True End Sub Private Sub WorkSheet_Change(ByVal Target As Range) Dim MyRow As Long Dim MyCol As Integer MyRow = Target.Row MyCol = Target.Column With Worksheets("メイン・1").Select If MyRow = 1 And MyCol = 7 Then If Target = 4 Then 'または If Target = 1 Then メインデータの復元 '動かしたいマクロ名 End If End If End With End Sub

専門家に質問してみよう