こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

TextBoxに連続で入力する方法

Form1に、TextBox1とTextBox2を配置しています。
TextBox1にKey入力を受け、Enter Keyで取り込む動作を、連続して行うためのプログラムを作ってみましたが、何故かEnter Keyの後、カーソルがTextBox2に移動してしまいます。Enter Keyの後、TextBox1.SetFocusで、カーソルをTextBox1にしているのですが何故が解らず困っています。Enter Kyeの後、カーソルがTextBox1に戻るようにするには、どのようにすれば良いのか教えて下さい。
PC環境は、OS=Win10 Excel=2010 です。作ったプログラムは以下の通りです。よろしくお願いします。
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
Sheets("Sheet1").Range("A1") = TextBox1.Value
TextBox1 = ""
TextBox1.SetFocus
End If
End Sub

投稿日時 - 2017-05-20 12:41:04

QNo.9331419

困ってます

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

こんにちは。

TextBox やLabelを除いた殆どのコントロールは、
指定されている.TabIndexの順(デフォルトでは挿入順)に、
フォーカスを移動します。

 TextBox1 = ""
を実行すると、まず、
値入力確定を意味する、
_BeforeUpdate→_AfterUpdate イベントが発生しますので、
フォーカスは.TabIndexで規定された次のコントロールに移ります。

簡単な対処方法を紹介しますが、
まずはすぐに確認できるので、試してください。
デザイン画面でプロパティフォームを開いて、、
  TextBox2 の.TabStop プロパティ(デフォルトではTrue)
  をFalseに設定します。
これだけ、でも。
TextBox1,TextBox2以外にコントロールが無ければ、
「Enter キーを確定の契機にしたTextBox1にのみ連続入力」
が、ご提示のコードのまま、可能になります。
この点の確認が済んだら、TextBox1を始めとして、
Label以外のコントロールのすべて
  .TabStop プロパティをFalseに設定しておきましょう。
後で訳分からなくならないように、
そもそも目的に副わないオートタブの設定については、
統一しておいた方が、後々、変更を加える時にも困らないです。
ユーザーフォームを表示した時に、
TextBox1.SetFocusを実行するのが億劫ということでしたら、
お奨めはしませんが、
TextBox1 のみ .TabStop プロパティをTrueに設定する手もアリ。

> Sheets("Sheet1").Range("A1") = TextBox1.Value
これが、ちょっと不思議なのですが、
ただ[A1]に上書きを続けるだけでいいのでしょうか?
もし、[A列]で順に下に送るようなことをやりたいのでしたら、
  Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Offset(1) = TextBox1.Value
みたいなことかな?と。

因みに、TextBox1入力中に、↑↓方向キーを押すと、
これも、Enter キー 同様に入力確定→フォーカス移動
が(.TabStop プロパティとは無縁に)自動化されています。
実質上Enter キー と ↑↓方向キー は同列に扱った方が
自然ですが、このキーの違いで機能を分ける手段としても
使えますね。
同列に扱う場合でしたら、
> If KeyCode = vbKeyReturn Then
  ' ' 処理
> End If
に代えて、
  Select Case KeyCode
  Case vbKeyReturn, vbKeyUp, vbKeyDown
  ' ' 処理
  End Select
のようにもできます。

上記の説明(今抱えた問題)の状況を確認したいようでしたら、
以下記載の各イベント(Debug.Print)を
(テスト用として一時的に)追加して、
ご質問時点の設定のまま(TextBox2.TabStop=Trueの状態で)、
TextBox1 に 1 をタイプして即Enter キー
ぐらいの操作で、
イミディエイトウィンドウを確認すると
Tbx1_CH    ■1■
Tbx1_CH    ■■
Tbx1_B_UpDate ■■
Tbx1_UpDate_A ■■
Tbx1_Exit   ■■  
という処理の流れが見えてくると思います。
たぶん、この順番が、今期待しているものと違うということなのでしょう。
' ' //
Private Sub TextBox1_Change()
Debug.Print "Tbx1_CH", "■"; TextBox1.Value; "■"
End Sub

Private Sub TextBox1_AfterUpdate()
Debug.Print "Tbx1_UpDate_A", "■"; TextBox1.Value; "■"
End Sub

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "Tbx1_B_UpDate", "■"; TextBox1.Value; "■"
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Debug.Print "Tbx1_Exit", "■"; TextBox1.Value; "■"
End Sub
' ' //

投稿日時 - 2017-05-20 14:40:29

お礼

TextBox2 の.TabStop プロパティをFalseに設定しましたら、問題が解決しました。本当にありがとうございました。また、それに関連した事項でもご指導頂き、ありがとうございました。

投稿日時 - 2017-05-20 16:09:39

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)