新しく質問する

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

役に立った:1件
  • 質問者:o-jon
  • 投稿日時:2004/12/31 13:45
  • 困り度:困ってます

現在、エクセルで入力フォームを作成してます
が、任意のセルへENTERキーで移動したい
のです。
たとえば、B4にデータ入力後、ENTERで
B6に移動する場合、下記のマクロを作ったの
ですが、うまく移動しません。
どうしてでしょうか?
ENTERキーがエクセルのフォームしか使用
できないのですか?


Sub B4からB6へのセル移動()
If keyascii = vbKeyReturn Then
Worksheets("受付入力").Range("B6").Select
End If
End Sub

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)

回答(4件)

  • 参考になった:1件
  • 回答者:KenKen_SP
  • 回答日時:2004/12/31 16:07

>デリートキーも押すと同じ動作しましたが。。。。

応用です。セル上で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に戻してあげないと、イベントが一切発生しなくなります。ご参考までに(^^)

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:imogasi
  • 回答日時:2004/12/31 15:16

>エクセルで入力フォームを作成
エクセルのデータ-フォームのフォームのことでしょうか。
エクセルのデータベース形式の見だし部分を聞いてきますから、前もって一番上の行に見出しを作って、データ-フォームの入力作業に入ります。そして各項目のデータを入力し終って、「新規」をクリックすると、データが最下空白行に書きこまれ、その次の行に入力される用意となります。
ここでは行数的に順次直下行への入力が前提になり、入力セルをスキップする仕組みはありません。
>エクセルで入力フォームを作成
入力用のデータシートをエクセルで作っていると言うことだけなら、エンターキーで、直下(上)行、直右(左)以外にスキップして飛ばさせるには、エンターキーを押したことを、システムから通知してもらわないとなりません。いわゆるイベントプロシージュアです。ワークシートには
、テキストボックスのように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のご回答がこれか)

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:shkwta
  • 回答日時:2004/12/31 15:06

おそらく、必要なセルにだけ入力させて、他のセルには入力させないようなシートの作成をご希望だと思います。

私もよくそのようなシートを作る仕事をしますが、この場合、ワークシートの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

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:KenKen_SP
  • 回答日時:2004/12/31 14:13

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です。

通報する

この回答への補足

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

この回答へのお礼

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

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ