• ベストアンサー

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

どうしても分からないのでお助け下さい(>_<) エクセルでユーザーフォームを作っています。 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"でフォーカスの移動を止めます。

関連するQ&A

  • エラー時カーソルを戻したいのですが?

    エクセルVBAに入出荷(在庫管理)を作成しているのですが テキスト1に品番を入力して品番が無かった場合 テキスト1などを空白にしてテキスト1にカーソルを 戻したいのですが下記のように書き込むとテキスト2に カーソルが行ってしまいます。どこを直せばいいでしょうか? Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim i As Integer If KeyCode = 13 Then For i = 4 To 400 If Sheets("倉庫在庫(記入用)").Cells(i, 1) = TextBox1 Then Label6 = Sheets("倉庫在庫(記入用)").Cells(i, 4) Label7 = Sheets("倉庫在庫(記入用)").Cells(i, 5) TextBox2.SetFocus Exit Sub End If Next i MsgBox "品番がありません!" TextBox1 = "" Label6 = "" Label7 = "" End If TextBox1.SetFocus End Sub

  • ユーザーフォームのカーソル移動

    Excelのマクロでカーソル移動の事で教えて下さい。 フォームを表示するとTextBox1にカーソルが表示されます。 TextBox1で入力の判断しNG場合 カーソルを移動せずTextBox1に表示したいのですが CommandButton1に移動してしまいます。 (SetFocusでTextBox1を指定してNG) 【フォームの内容です】 TextBox1が1個 CommandButtonが2個存在します。 TextBox1のTabIndexは 0 CommandButton1のTabIndexは 1 CommandButton2のTabIndexは 2 【プログラムです】 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1 = "" Then MsgBox "NG"     TextBox1.SetFocus End If End Sub 宜しくお願い致します。

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus End Sub

  • エクセルマクロのイベントプロシージャについて

     こにんちは。仕事で使う表をもっと便利にするため、独学でマクロを勉強、作成している者です。  さて、今回、ユーザーフォーム上に5つのテキストボックスを配置して(Textbox1~Textbox5)、Textbox1に入力した内容によってカーソルの移動先を変えるマクロを作成したいのですが、うまくいきません。  私の作成したコードは以下の通りです(今回、質問するにあたって、かなり省略しています)。 Private Sub TextBox1_AfterUpdate() Select Case TextBox1.Value Case 1 TextBox1.SetFocus Case 2 TextBox2.SetFocus Case 3 TextBox3.SetFocus Case 4 TextBox4.SetFocus Case Is >= 5 TextBox5.SetFocus End Select End Sub  そこで、いろいろ試したり調べたりしたのですが、どうもイベントプロシージャそのものに対する基本的な認識ができていない気がしてきました。  と言いますのも、上記プログラムを走らせると、1、2を入力した際はタブオーダーに従い?Textbox2へカーソルが移動しますが、3以上の数値を入力すると、4でも5でもTextbox3へ移動します。  何をやってもタブオーダー通りにしか移動しないのならともかく、なぜこのような変な動きになるのか、分かりやすく説明していただくことは可能でしょうか。  また、もちろんどうすれば目的通り動かせるのかも教えていただきたく思います。  もちろん一番の目的はそれなのですが、今後の理解のため、イベントのタイミング等について教えていただければ幸いです。  なお、各イベントの意味については、下記のページを見て理解はできたつもりなのですが・・・。  http://home.att.ne.jp/zeta/gen/excel/c04p30.htm

  • ユーザーフォーム データ消去の時の処理

    環境:Excel2002です ユーザーフォームのテキストボックスの入力チェックをしています Rem**************** Rem TextBox5 Check Rem**************** Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub 入力したデータを消去して Enterキーを押すか、マウスでクリックした時のいずれでも Len(Me.TextBox5.Text) = 0 と認知されて "数値で入力してください"のメッセージが表示されてしまいます このメッセージが出ないようにするにはどうしたらいいのでしょうか ご教示願います

  • 間違った入力をした時、もう一度入力させる場合

    以前、 "textBox1に品番を入れたら、Label1に品名を表示させています。 このとき、TextBox1に存在しない品番を入力した場合は、 再度入れなおしをさせたいのです。" における質問と回答(-yellowtail-&e10go) を参照して textbox1の文字数が8文字以外のときは、もう一度textbox1に戻って来るように、次のように入力しました。 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Len(TextBox1) <> 8 Then MsgBox ("正しい日付を入力してください。") Cancel = True TextBox1.SetFocus(この行は、うまく行かないので、勝手につけてみましたが、うまく行きませんでした) Exit Sub End If End Sub しかしながら、うまくtextbox1に戻ってくれません。 また、この入力のためのuserformを消す際にも、 MsgBox ("正しい日付を入力してください。") が表示されてしまいます。 2つの点で困っています。 どのように改良したら良いでしょうか? すいませんが、よろしくお願いいたします。

  • エクセル ユーザーフォームでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • Excel VBA SetFocus

    環境:Excel 2002です UserForm1での質問です Flame5にTextBox14とTextBox15があります TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後 Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します 実行時エラー 2147467259(800004005) 異なるFlameにSetFocusする方法があるのでしょうか? Flame5の中でTextBox14及びTextBox15のSetFocusはできます TextBox14とのTextBox15のBeforeUpdateのプロシージャです Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox14.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox14.Text) Me.TextBox15.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If Me.TextBox1.SetFocus End Sub Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox15.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox15.Text) Me.TextBox14.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If UserForm1.TextBox1.SetFocus End Sub ご支援願います

  • エクセルVBA テキストボックス処理?

    エクセル2000 VBAにて入力フォームの テキストボックス1に下記を書き込んだのですが カーソルがテキストボックス1にあるとき 他の処理(コマンドボタン、マウスにて他のテキストボックスに カーソルを移すなど)が出来ません。 フォームを閉じるときもメッセージボックスのコメントがでます。 どの処理を行ってもテキストボックス1の処理が終わってからしか 行わないようなのですが??? Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 For i = 3 To 100 If Sheets("品番マスタ").Cells(i, 1) = TextBox1.Text Then Label1 = Sheets("品番マスタ").Cells(i, 2).Value 'メーカー Label2 = Sheets("品番マスタ").Cells(i, 3).Value 'タイプ Label3 = Sheets("品番マスタ").Cells(i, 4).Value '品名 Label4 = Sheets("品番マスタ").Cells(i, 5).Value '内容量 Label6 = Sheets("品番マスタ").Cells(i, 8).Value '背番号 Exit Sub End If Next i MsgBox "品番がありません" TextBox1 = "" Cancel = True End Sub どのように変更すればいいでしょうか?

  • エクセルのユーザーフォームについて

    パスワード入力用のしかけです。 ワークシートに配置したコマンドボタンを押してユーザーフォームを呼び出します。 Private Sub CommandButton1_Click() UserForm1.Show End Sub ユーザーフォームにはテキストボックスとコマンドボタンを配置しております。 テキストボックスのPasswordCharには * を設定しました。 Private Sub CommandButton1_Click() If StrConv(TextBox1.Text, vbLowerCase) = "abcd" Then MsgBox "OK!" Unload Me Else TextBox1.Text = "" TextBox1.SetFocus End If End Sub これで、ABCDまたはabcdと入力され、ユーザーフォーム上のコマンドボタンをクリックすれば、ユーザーフォームは消えます。 でも、いちいちマウスでクリックするのが面倒なのでEnterキー1回でユーザーフォームを消したいのです。 今でも、一度Enterキーを押すと、ボタンにフォーカスが移動するので、さらにEnterで消えますが、二度ではなくEnterキー1回でユーザーフォームを消すにはどうすればよいのでしょうか? ユーザーフォームは使ったことがないのでわかりません。 よろしくお願いします。

専門家に質問してみよう