任意のセルの移動をENTERキーでしたい
現在、エクセルで入力フォームを作成してます
が、任意のセルへENTERキーで移動したい
のです。
たとえば、B4にデータ入力後、ENTERで
B6に移動する場合、下記のマクロを作ったの
ですが、うまく移動しません。
どうしてでしょうか?
ENTERキーがエクセルのフォームしか使用
できないのですか?
Sub B4からB6へのセル移動()
If keyascii = vbKeyReturn Then
Worksheets("受付入力").Range("B6").Select
End If
End Sub
>デリートキーも押すと同じ動作しましたが。。。。
応用です。セル上で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に戻してあげないと、イベントが一切発生しなくなります。ご参考までに(^^)
この回答へのお礼
お礼のレス遅れましてすみません。
一度参考にさせていただき、自分なりに勉強します。
>エクセルで入力フォームを作成
エクセルのデータ-フォームのフォームのことでしょうか。
エクセルのデータベース形式の見だし部分を聞いてきますから、前もって一番上の行に見出しを作って、データ-フォームの入力作業に入ります。そして各項目のデータを入力し終って、「新規」をクリックすると、データが最下空白行に書きこまれ、その次の行に入力される用意となります。
ここでは行数的に順次直下行への入力が前提になり、入力セルをスキップする仕組みはありません。
>エクセルで入力フォームを作成
入力用のデータシートをエクセルで作っていると言うことだけなら、エンターキーで、直下(上)行、直右(左)以外にスキップして飛ばさせるには、エンターキーを押したことを、システムから通知してもらわないとなりません。いわゆるイベントプロシージュアです。ワークシートには
、テキストボックスのように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のご回答がこれか)
この回答へのお礼
お礼のレス遅れましてすみません。
一度参考にさせていただき、自分なりに勉強します。
おそらく、必要なセルにだけ入力させて、他のセルには入力させないようなシートの作成をご希望だと思います。
私もよくそのようなシートを作る仕事をしますが、この場合、ワークシートの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
この回答へのお礼
お礼のレス遅れましてすみません。
一度参考にさせていただき、自分なりに勉強します。
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です。
この回答への補足
早速のレスありがとうございます。
動作確認しましたが、残念ながら、作動しません
でした。
この回答へのお礼
私の設定ミスでした。動作確認できましたが、
デリートキーも押すと同じ動作しましたが。。。。
- 最新から表示
- |
- 回答順に表示












