• ベストアンサー

エクセルユーザーフォームのカーソル位置

どうしても分からないのでお助け下さい(>_<) エクセルでユーザーフォームを作っています。 TextBox1に品番を入れたら、Label1に品名を表示させています。 このとき、TextBox1に存在しない品番を入力した場合は、 再度入れなおしをさせたいのです。 そこで、カーソルをもう一度TextBox1に持っていきたいのです。 しかし、どうやってもタブオーダーでTextBox1の次にあるTextBox2に カーソルが行ってしまいます。 どうしたらもう一度TextBox1にカーソルを持っていくことができますか? ちなみに品名を表示するモジュールを書いておきます。 このSetFocusが違うということは分かるのですが・・・。 Private Sub TextBox1_AfterUpdate() Dim tmp As Range, a a = Me.TextBox1.Value   Set tmp = Sheets(1).Columns(1).Find(a, , xlWhole)   If tmp Is Nothing Then     Me.Label1.Caption = "品番が誤っています。再度入力して下さい"     Me.TextBox1.SetFocus     Exit Sub   Else     Me.Label1 = tmp.Offset(0, 1)   End If End Sub

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

  • ベストアンサー
  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

自信はありませんが、AfterUpdate イベントで Me.TextBox1.SetFocusとしても 次に起こるExit イベントでTextBox2に 飛ばされるのではないでしょうか? BeforeUpdateを使って・・・ Private Sub TextBox1_BeforeUpdate _ (ByVal Cancel As MSForms.ReturnBoolean) Dim tmp As Range, a a = Me.TextBox1.Value Set tmp = Sheets(1).Columns(1).Find(a, , xlWhole) If tmp Is Nothing Then Me.Label1.Caption = _ "品番が誤っています。再度入力して下さい" Cancel = True Exit Sub Else Me.Label1 = tmp.Offset(0, 1) End If End Sub 存在しない値を入力した場合は、TextBox1の更新を キャンセルするようにすればうまくいくと思います。

-yellowtail-
質問者

お礼

ご回答ありがとうございます。 アドバイス通りにやってみたらうまく行きました! お礼が遅くなって申し訳ありません。 Exitイベントで次に行ってしまうのですね。 大変勉強になりました。助かりました。

その他の回答 (2)

  • e10go
  • ベストアンサー率38% (47/122)
回答No.3

No.2のe10goです。 すみません。 私が答える前に、"Cancel = True"でフォーカスの移動を止める方法を、No.1のmasa_019さんが答えていました。

-yellowtail-
質問者

お礼

いえいえありがとうございます。 _Exitというイベントもあるんですね。 使ったことがありませんでした。 試した見たところうまく行きました! いろいろな方法があるのだなとまたひとつ知識が増えました! 奥が深くてまだまだ勉強しないといけませんね。

  • e10go
  • ベストアンサー率38% (47/122)
回答No.2

こんばんわ。 実は、私も過去にこれで悩んだことがあります。 ユーザーフォームのコードを下記のように変更してみては如何でしょう。 '--------マクロコード--------始まり Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'AfterUpdateではなく、Exitを使用する   Dim tmp As Range, a   a = Me.TextBox1.Value     Set tmp = Sheets(1).Columns(1).Find(a, , xlWhole)     If tmp Is Nothing Then       Me.Label1.Caption = "品番が誤っています。再度入力して下さい"       Cancel = True 'ここがミソ       Exit Sub     Else       Me.Label1 = tmp.Offset(0, 1)     End If End Sub '--------マクロコード--------終わり "AfterUpdate"で"SetFocus"を使っても、"TextBox1"にフォーカスを移した後、"TextBox2"フォーカスが移ります。 そこで、"Exit"の"Cancel = True"でフォーカスの移動を止めます。