[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォーム上のテキストボックスのフォーカス送りがうまくいかない』(べじ太)
質問用に以下のような簡単なサンプルを作りました。 ユーザーフォームに テキストボックスを5個(Textbox1〜Textbox5)配置し、 フォームモジュールに 次のプロシージャを記述して実行すると、 Selet ブロック内のコメントのような結果になります。フォームはモーダルです。
Private Sub TextBox1_AfterUpdate() 'このテキストボックスには、ターゲットのテキストボックス '番号(2 から 5 まで)を入力する。 Select Case TextBox1.Value Case 2 TextBox2.SetFocus '実行結果:TextBox2にフォーカス OK Case 3 TextBox3.SetFocus '実行結果:TextBox3にフォーカス OK Case 4 TextBox4.SetFocus '実行結果:TextBox3にフォーカス NG Case 5 TextBox5.SetFocus '実行結果:TextBox3にフォーカス NG End Select End Sub
なぜこのような結果になるのか分かりません。原因と解決方法をご教示ください。 よろしくお願い致します。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
>TextBox3にフォーカス NG
これの意味が解らないけど、TextBox3にフォーカスが行かなかった。 と言う意味なら、マクロは正常に動いてます。 少し、SetFocus が何をしているのか自分で調べた方がいいです。
突っ込んで言うと、テキストボックの数字は、文字列なので = "2" と、"で囲ったほうがいい。
(BJ) 2018/09/06(木) 22:46
すみません。 EXCEL2007で試してみたら、AfterUpdate がうまく動いて無い様で、 半角英数字の 4 と 5 を入れて、TextBox1のフォーカスが失われた後に TextBox3にフォーカスが移動しちゃってます。 バグ?
追伸 どうもenterキーでフォーカスが移ったときに挙動がおかしくなるみたいでした。 コマンドボタンを作って、マウスでボタンをクリックしてのフォーカスの移動は正常でした。 また、半角英数字入力モードで4、5を入力後、矢印キーでのフォーカスの移動も正常でした。 Enterキーでのフォーカスの移動で、異常がおこるみたい。
なんかバグくさいので、Changeイベントの方が良いみたいでした。
(BJ) 2018/09/06(木) 23:18
不細工ですみません。
Private Sub TextBox1_AfterUpdate() Select Case TextBox1.Value Case "2" Application.OnTime Now(), "'TextFocus " & """TextBox2""" & "'" Case "3" Application.OnTime Now(), "'TextFocus " & """TextBox3""" & "'" Case "4" Application.OnTime Now(), "'TextFocus " & """TextBox4""" & "'" Case "5" Application.OnTime Now(), "'TextFocus " & """TextBox5""" & "'" End Select End Sub
標準モジュール
Sub TextFocus(obj As String) UserForm1.Controls(obj).SetFocus End Sub (BJ) 2018/09/07(金) 00:44
Private Sub TextBox1_Change() Dim i As Long For i = 2 To 5 If TextBox1.Value = i Then Me("TextBox" & i).SetFocus Next i End Sub
なんでそのコードがだめなのか説明できませんが、、
これなら大丈夫だと思いますよ。
(TAKA) 2018/09/07(金) 09:26
Private Sub TextBox1_Change() Select Case TextBox1.Value Case 2 TextBox2.SetFocus '実行結果:TextBox2にフォーカス OK Case 3 TextBox3.SetFocus '実行結果:TextBox3にフォーカス OK Case 4 TextBox4.SetFocus '実行結果:TextBox4にフォーカス OK Case 5 TextBox5.SetFocus '実行結果:TextBox5にフォーカス OK End Select End Sub
あ、もちろん元コードでもChangeなら大丈夫です
なんでAfterUpdateだとだめなのか私も知りたい、、、
(TAKA) 2018/09/07(金) 09:29
別案として、TextBox1_AfterUpdate 時のコードは消し、以下のようにキー押下時判定に変えてみてください。 ENTERが押されたと判断した後、キーコードを変える事で、ENTERによる移動を抑止します。
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyReturn Then KeyCode = 0 Select Case TextBox1.Value Case "2" TextBox2.SetFocus Case "3" TextBox3.SetFocus Case "4" TextBox4.SetFocus Case "5" TextBox5.SetFocus End Select End If End Sub (???) 2018/09/07(金) 09:59
2018/09/06(木) 22:46 の貴回答について
TextBox3にフォーカス NG これの意味が解らないけ
表現がまずくてすみません。
これは、Case 4 と Case 5 のときもTextBox3にフォーカス が行かなかったのでNG
という意味です。
突っ込んで言うと、・・・ おっしゃる通りです。テスト用だからと横着しましたが、他人に見せるサンプルなので、きちんと作るべきでした。以後気を付けます。
2018/09/06(木) 23:18 の貴回答について
なんかバグくさいので、Changeイベントの方が良いみたいでした。 やはりそうですか。
実は質問の前に、TextBox1 から TextBox5 までの Enter イベント、 Exit イベントをチェックしましたが、不可解な動きが理解できずに質問した次第です。
BeforeUpdate で入力チェックをするので、AfterUpdate を使ったのですが、Change イベントを使うことを検討してみます。
2018/09/07(金) 00:44 の貴回答について
OnTimeメソッド は今まで使ったことがなかったので勉強になりました。
いろいろとご指導ありがとうございました。
(べじ太) 2018/09/07(金) 11:27
当面の方針が決まりましたので前に進みたいと思います。
お三方にはお礼申し上げます。
この先またつまづきましたらお世話になりたいと思いますので、よろしくお願い致します。
(べじ太) 2018/09/07(金) 14:13
ENTERのコードを書き換えるので、ENTERによる自動的に次のコントロールにフォーカス移動、という動作をしなくなり、おっしゃっているように TextBox2 がアクティブになったりはしないはずなのです。 他のコードも書いてあって、それが反応しているのではないでしょうか。
Changeイベントでの対応にしたようですが、こちらは1文字操作する度に動作しますが、大丈夫でしょうか?(ENTERする前に飛ぶ) KeyDown も毎回動作しますが、コード判定する事で、ENTER時だけ処理させてます。
また、2〜5以外の入力時にはENTERで次セル移動したいならば、各Case文に反応した後に KeyCode = 0 にすれば良いですよ。
(???) 2018/09/07(金) 17:23
>別の新しいブックを作成し、・・・
まだ試していませんが、明日やってみようと思っています。
>Changeイベントでの対応にしたようですが、こちらは1文字操作する度に動作しますが、大丈夫でしょうか?
AfterUpDateイベントを使ったのは正にこれを避けるためだったのですが、これまた簡単なテストではありますが、いけそうなので方針を変更した次第です。
・・・が、なんだか気持ちがぐらぐら揺れています。
訳あって、勝手ながら今日はこれにて失礼しますが明日また宜しくお願いします。
(べじ太) 2018/09/07(金) 19:40
TAKAさんの
>なんでAfterUpdateだとだめなのか私も知りたい、、、
を、てっきり私(べじ太)がAfterUpdateイベントを使う理由が知りたいと聞かれたもと勘違いし、
>BeforeUpdate で入力チェック、AfterUpdate で更新という思い込みがあったためです。
と、頓珍漢なコメントしたことに対してです。
それはさておき、
???さん
新しいブックで、貴コードを実行して確認しました。
Cangeイベントでいきなり別のテキストボックスに跳ぶのはちょっと戸惑うのではないかと思いますので、この方が気に入りました。
ぐらついていた気持ちがKeyDownイベントに傾いてきました。
そこでもう一つ教えていただきたいのですが、
今作成中の入力フォームは、テキストボックスだけで20個ありますが、これらのAfterUpdateイベントプロシージャの中身をそっくり KeyDownイベントプロシージャに入れ替えることは可能でしょうか?(これがベストですが・・・)
あるいは、SetFocus関連の部分だけDownイベントで実行することは可能でしょうか?
これだけでは可、不可は判断できないかも知れませんが、その時はお手数ですがお尋ねください。よろしくお願いします。
(べじ太) 2018/09/08(土) 08:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.