• 締切済み

任意のセルの移動をENTERキーでしたい

現在、エクセルで入力フォームを作成してます が、任意のセルへENTERキーで移動したい のです。 たとえば、B4にデータ入力後、ENTERで B6に移動する場合、下記のマクロを作ったの ですが、うまく移動しません。 どうしてでしょうか? ENTERキーがエクセルのフォームしか使用 できないのですか? Sub B4からB6へのセル移動() If keyascii = vbKeyReturn Then Worksheets("受付入力").Range("B6").Select End If End Sub

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

>デリートキーも押すと同じ動作しましたが。。。。 応用です。セル上でDELキーを押すということは、セル値消去ですから、IFでセルの値が空ならプロシージャーを終了させればいいのです。 少しコードを手直ししました。 Private Sub Worksheet_Change(ByVal Target As Range)   With Target     R = .Row: C = .Column     If R = 4 And C = 2 Then 'B4ならば..ここでセル判定       If .Value = "" Then Exit Sub 'セルの値消去なら終了       Range("B6").Select     End If   End With End Sub 余談ですが、shkwtaさんへ >ただし、Worksheet_SelectionChangeの中でSelectメソッドを使うと、Worksheet_SelectionChangeが二重に起動してしまいますので、専用の変数をsubの外で宣言しておいて、二重起動を防ぎます。 について、セルへの記入や消去で確かにイベントが2重発生しますが、 Application.EnableEvents = Flase 'イベント2重発生抑止   Cells(1,1)="TEST" 'セルに対する処理 Application.EnableEvents = True '忘れずに のように、EnableEventsで抑止できます。ただし、使い終わったらちゃんとTrueに戻してあげないと、イベントが一切発生しなくなります。ご参考までに(^^)

o-jon
質問者

お礼

お礼のレス遅れましてすみません。 一度参考にさせていただき、自分なりに勉強します。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

>エクセルで入力フォームを作成 エクセルのデータ-フォームのフォームのことでしょうか。 エクセルのデータベース形式の見だし部分を聞いてきますから、前もって一番上の行に見出しを作って、データ-フォームの入力作業に入ります。そして各項目のデータを入力し終って、「新規」をクリックすると、データが最下空白行に書きこまれ、その次の行に入力される用意となります。 ここでは行数的に順次直下行への入力が前提になり、入力セルをスキップする仕組みはありません。 >エクセルで入力フォームを作成 入力用のデータシートをエクセルで作っていると言うことだけなら、エンターキーで、直下(上)行、直右(左)以外にスキップして飛ばさせるには、エンターキーを押したことを、システムから通知してもらわないとなりません。いわゆるイベントプロシージュアです。ワークシートには 、テキストボックスのようにKeyPress、Up、Downなどの イベントがありません。ですから、やりようがありません。 やるならテキストボックスを1つ貼りつけて Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) t1 = Array("$A$1", "$B$2", "$B$8", "$C$2", "$D$4") t2 = Array("$B$2", "$B$8", "$C$2", "$D$4", "$A$1") If KeyCode = 13 Then Application.MoveAfterReturn = False For i = 0 To UBound(t1) If t1(i) = ActiveCell.Address Then Range(t1(i)) = TextBox1.Text Range(t2(i)).Activate TextBox1.Text = "" TextBox1.Activate GoTo p01 End If Next i End If p01: Application.MoveAfterReturn = False End Sub としてみました。 これでテキストボックスにエンターで入れていくと、 A1->B2->B8->C2->D4->A1に順次セットできます。しかしD4にセットしたとき、今までのA1,B2,B8,C2,D4のデータ保存とセルクリアはイベントをキッカケに処理が別途必要です。このやり方は回りくどいようです。 むしろシートにボタンを貼りつけ、1シートの入力が終ったらデータ保存するようにしてはどうでしょう。 その際のセルの選択は操作者に任せるか、上記のように Activeセルの番地をChangeイベントで察知して、次のセルのセレクトする番地を割りだしSelectしてはどうでしょうか。(#1のご回答がこれか)

o-jon
質問者

お礼

お礼のレス遅れましてすみません。 一度参考にさせていただき、自分なりに勉強します。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

おそらく、必要なセルにだけ入力させて、他のセルには入力させないようなシートの作成をご希望だと思います。 私もよくそのようなシートを作る仕事をしますが、この場合、ワークシートのSelectionChangeイベントを使っています。 あらかじめ、ツール→オプション→編集 で、入力後のセルの移動方向を上下左右のどれかにしておきます。 (これはマクロで自動的に設定することもできます。) すると、Enterキーを押したときにセルが動きますから、これをWorksheet_SelectionChangeで捉えて、別のセルを選択させます。  これだと、セル内容に変更がない場合でも、意図するとおりにセル移動ができます。 ただし、Worksheet_SelectionChangeの中でSelectメソッドを使うと、Worksheet_SelectionChangeが二重に起動してしまいますので、専用の変数をsubの外で宣言しておいて、二重起動を防ぎます。 具体的にはこんな感じです。 |Dim SFlag as Boolean |Private Sub Worksheet_SelectionChange(ByVal Target As Range) | SFlag = True | If Not SFlag Then | ・・・・ | 'ここでセルの位置を判断してSelectさせます。 | End If | SFlag = False |End Sub

o-jon
質問者

お礼

お礼のレス遅れましてすみません。 一度参考にさせていただき、自分なりに勉強します。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

1. まず、シートでのイベント(例えば値の変更)がトリガー(マクロ実行の引き金)となりますので、標準モジュールではなく、シートモジュールにコードを書かなければなりません。 VBEの左ツリーからあSheet受付入力をダブルクリックし、開いたページが、コードを書く場所です。 2. シートのイベントには、KeyDownがありません。したがって、Enterキーの押下をトリガーにすることはできません。近い動作としては、Worksheet_Changeイベントでしょうか。参考コードを示します。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim R As Long, C As Long   R = Target.Row   C = Target.Column   If R = 4 And C = 2 Then 'B4ならば     Worksheets("受付入力").Range("B6").Select   End If End Sub これを、1.の場所にペーストし、動作確認して下さい。B4セルにデータ入力し、Enterキー押下でB6セルを選択します。 >ENTERキーがエクセルのフォームしか使用できないのですか? そうですね。1.で述べたとおり、シートのイベントにはKeyDownがありません。フォームならOKです。

o-jon
質問者

お礼

私の設定ミスでした。動作確認できましたが、 デリートキーも押すと同じ動作しましたが。。。。

o-jon
質問者

補足

早速のレスありがとうございます。 動作確認しましたが、残念ながら、作動しません でした。

関連するQ&A