[[20180906210233]] 『フォーム上のテキストボックスのフォーカス送りが』(べじ太) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フォーム上のテキストボックスのフォーカス送りがうまくいかない』(べじ太)

 質問用に以下のような簡単なサンプルを作りました。
 ユーザーフォームに
 テキストボックスを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


面白い動作ですね。 おそらく、ENTERによるフォーカス移動が働いた後(TextBox2に移動)、ENTERを押されている事がまだ残っていて、更にENTER(TextBox3に移動)するのでしょう。 SetFocus指示が負けています。 1と2の場合はSetFocusとこれらの動作が混線した結果、たまたま指示通りにフォーカス移動している感じでしょうか。

別案として、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

BJさん
早速ご回答いただきありがとうございます。

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メソッド は今まで使ったことがなかったので勉強になりました。

いろいろとご指導ありがとうございました。


TAKAさん
ありがとうございます。
BeforeUpdate で入力チェック、AfterUpdate で更新という思い込みがあったためです。
Changeイベントを使うことを検討してみます。

???さん
ありがとうございます。
ご提示いただいた KeyDown イベントは使ったことがなかったので、試してみたいと思います。


返信が遅くなり申し訳ありません。
皆様ありがとうございました。

(べじ太) 2018/09/07(金) 11:27


???さんKeyDown イベントを試してみました。確かにターゲットに移ってくれるのですが、ミスタイプした時にもう一度TextBox1に入力しなおそうとしてもできません。たとえば、”3”と入力すべきところ”2”と入力した場合、TextBox1に戻って”3”を入力しても即座にTextBox2がアクティブになり、”3”が入っています。KeyDown イベントを理解すれば対処できるのでしょうが、これは追々勉強することにして、今は Changeイベントで行きたいと思います。

当面の方針が決まりましたので前に進みたいと思います。
お三方にはお礼申し上げます。
この先またつまづきましたらお世話になりたいと思いますので、よろしくお願い致します。

(べじ太) 2018/09/07(金) 14:13


別の新しいブックを作成し、ユーザーフォームにテキストボックスを5つ配置。 この状態で私の書いたコードだけ貼ってから試してみてください。

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


???さん
さっきの馬鹿な質問取り消します。
なんとか自分でやってみます。
行き詰ったときはまた質問させていただきます。
(べじ太) 2018/09/08(土) 09:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.